├── .gitignore ├── blog2 ├── config.conf ├── README.md ├── proto │ └── reminder │ │ └── v1 │ │ ├── reminder.proto │ │ └── reminder.pb.go ├── server.csr ├── cmd │ ├── main.go │ └── client │ │ └── client.go ├── internal │ └── server │ │ └── server.go ├── server.crt └── server.key ├── blog3 ├── config.conf ├── proto │ └── reminder │ │ └── v1 │ │ ├── reminder.proto │ │ ├── reminder.pb.gw.go │ │ └── reminder.pb.go ├── README.md ├── server.csr ├── internal │ └── server │ │ └── server.go ├── cmd │ ├── client │ │ └── client.go │ └── main.go ├── server.crt └── server.key ├── blog4 ├── config.conf ├── README.md ├── proto │ └── reminder │ │ └── v1 │ │ ├── reminder.proto │ │ ├── reminder.validator.pb.go │ │ ├── reminder.pb.gw.go │ │ └── reminder.pb.go ├── internal │ └── server │ │ └── server.go ├── server.csr ├── cmd │ ├── client │ │ └── client.go │ └── main.go ├── server.crt └── server.key ├── blog1 ├── README.md ├── proto │ └── reminder │ │ └── v1 │ │ ├── reminder.proto │ │ └── reminder.pb.go ├── cmd │ ├── main.go │ └── client │ │ └── client.go └── internal │ └── server │ └── server.go ├── go.mod └── go.sum /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .vscode -------------------------------------------------------------------------------- /blog2/config.conf: -------------------------------------------------------------------------------- 1 | [req] 2 | prompt = no 3 | req_extensions = ext 4 | distinguished_name = req_distinguished_named 5 | 6 | [ ext ] 7 | subjectAltName = IP:0.0.0.0, IP:127.0.0.1 8 | 9 | [ req_distinguished_named ] 10 | C=AU 11 | ST=NSW 12 | L=Sydney 13 | O=Arkady Balaba 14 | OU=Engineering 15 | CN=localhost -------------------------------------------------------------------------------- /blog3/config.conf: -------------------------------------------------------------------------------- 1 | [req] 2 | prompt = no 3 | req_extensions = ext 4 | distinguished_name = req_distinguished_named 5 | 6 | [ ext ] 7 | subjectAltName = IP:0.0.0.0, IP:127.0.0.1 8 | 9 | [ req_distinguished_named ] 10 | C=AU 11 | ST=NSW 12 | L=Sydney 13 | O=Arkady Balaba 14 | OU=Engineering 15 | CN=localhost -------------------------------------------------------------------------------- /blog4/config.conf: -------------------------------------------------------------------------------- 1 | [req] 2 | prompt = no 3 | req_extensions = ext 4 | distinguished_name = req_distinguished_named 5 | 6 | [ ext ] 7 | subjectAltName = IP:0.0.0.0, IP:127.0.0.1 8 | 9 | [ req_distinguished_named ] 10 | C=AU 11 | ST=NSW 12 | L=Sydney 13 | O=Arkady Balaba 14 | OU=Engineering 15 | CN=localhost -------------------------------------------------------------------------------- /blog1/README.md: -------------------------------------------------------------------------------- 1 | # `API with gRPC and Golang` 2 | This are the source codes for the medium.com blog [post](https://medium.com/@arkadybalaba/api-with-grpc-and-golang-d6aba44345a0). 3 | 4 | Follow the blog post for instructions and details. 5 | 6 | ## To run 7 | Run server from `cmd` folder with: `GO111MODULE=on go run main.go` 8 | 9 | Run gRPC client from `cmd/client` folder with: `GO111MODULE=on go run client.go` -------------------------------------------------------------------------------- /blog2/README.md: -------------------------------------------------------------------------------- 1 | # `Quick run to secure your gRPC API with SSL/TLS` 2 | This are the source codes for the medium.com blog [post](https://medium.com/@arkadybalaba/quick-run-to-secure-your-grpc-api-with-ssl-tls-fbd910ec8eee). 3 | 4 | Follow the blog post for instructions and details. 5 | 6 | ## To run 7 | Run server from `cmd` folder with: `GO111MODULE=on go run main.go` 8 | 9 | Run gRPC client from `cmd/client` folder with: `GO111MODULE=on go run client.go` -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/arkadyb/blog 2 | 3 | go 1.12 4 | 5 | require ( 6 | github.com/arkadyb/go-proto-validators v0.3.0 7 | github.com/golang/protobuf v1.3.2 8 | github.com/google/uuid v1.1.1 9 | github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 10 | github.com/grpc-ecosystem/grpc-gateway v1.11.3 11 | github.com/sirupsen/logrus v1.4.2 12 | google.golang.org/genproto v0.0.0-20191007204434-a023cd5227bd 13 | google.golang.org/grpc v1.24.0 14 | ) 15 | -------------------------------------------------------------------------------- /blog1/proto/reminder/v1/reminder.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package demo.reminder.v1; 4 | 5 | import "google/protobuf/timestamp.proto"; 6 | 7 | option go_package = "reminder"; 8 | 9 | service ReminderService { 10 | rpc ScheduleReminder(ScheduleReminderRequest) returns (ScheduleReminderResponse) { 11 | } 12 | } 13 | 14 | message ScheduleReminderRequest { 15 | google.protobuf.Timestamp when = 1; 16 | } 17 | 18 | message ScheduleReminderResponse { 19 | string id = 1; 20 | } -------------------------------------------------------------------------------- /blog2/proto/reminder/v1/reminder.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package demo.reminder.v1; 4 | 5 | import "google/protobuf/timestamp.proto"; 6 | 7 | option go_package = "reminder"; 8 | 9 | service ReminderService { 10 | rpc ScheduleReminder(ScheduleReminderRequest) returns (ScheduleReminderResponse) { 11 | } 12 | } 13 | 14 | message ScheduleReminderRequest { 15 | google.protobuf.Timestamp when = 1; 16 | } 17 | 18 | message ScheduleReminderResponse { 19 | string id = 1; 20 | } -------------------------------------------------------------------------------- /blog3/proto/reminder/v1/reminder.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package demo.reminder.v1; 4 | 5 | import "google/protobuf/timestamp.proto"; 6 | import "google/api/annotations.proto"; 7 | 8 | option go_package = "reminder"; 9 | 10 | service ReminderService { 11 | rpc ScheduleReminder(ScheduleReminderRequest) returns (ScheduleReminderResponse) { 12 | option (google.api.http) = { put: "/v1/reminder/schedule" body: "*" }; 13 | } 14 | } 15 | 16 | message ScheduleReminderRequest { 17 | google.protobuf.Timestamp when = 1; 18 | } 19 | 20 | message ScheduleReminderResponse { 21 | string id = 1; 22 | } -------------------------------------------------------------------------------- /blog3/README.md: -------------------------------------------------------------------------------- 1 | # `REST over gRPC with grpc-gateway for Go` 2 | This are the source codes for the medium.com blog [post](https://medium.com/@arkadybalaba/rest-over-grpc-with-grpc-gateway-for-go-9584bfcbb835). 3 | 4 | Follow the blog post for instructions and details. 5 | 6 | ## To run 7 | Run server from `cmd` folder with: `GO111MODULE=on go run main.go` 8 | 9 | Run gRPC client from `cmd/client` folder with: `GO111MODULE=on go run client.go` 10 | 11 | Call the HTTP/REST endpoint with a client of you choice. 12 | Example curl request: 13 | `curl --request PUT 14 | --url https://localhost:8080/v1/reminder/schedule 15 | --header 'content-type: application/json' 16 | --data '{ 17 | "when": "2019-09-20T02:50:20Z" 18 | }'` 19 | -------------------------------------------------------------------------------- /blog4/README.md: -------------------------------------------------------------------------------- 1 | # `Know your inputs or gRPC request validation` 2 | This are the source codes for the medium.com blog [post](https://medium.com/@arkadybalaba/know-your-inputs-or-grpc-request-validation-8eb29a0ebc31). 3 | 4 | Follow the blog post for instructions and details. 5 | 6 | ## To run 7 | Run server from `cmd` folder with: `GO111MODULE=on go run main.go` 8 | 9 | Run gRPC client from `cmd/client` folder with: `GO111MODULE=on go run client.go` 10 | 11 | Call the HTTP/REST endpoint with a client of you choice. 12 | Example curl request: 13 | `curl --request PUT 14 | --url https://localhost:8080/v1/reminder/schedule 15 | --header 'content-type: application/json' 16 | --data '{ 17 | "when": "2019-09-20T02:50:20Z" 18 | }'` 19 | -------------------------------------------------------------------------------- /blog4/proto/reminder/v1/reminder.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package demo.reminder.v1; 4 | 5 | import "google/protobuf/timestamp.proto"; 6 | import "google/api/annotations.proto"; 7 | 8 | import "github.com/arkadyb/go-proto-validators/validator.proto"; 9 | 10 | option go_package = "reminder"; 11 | 12 | service ReminderService { 13 | rpc ScheduleReminder(ScheduleReminderRequest) returns (ScheduleReminderResponse) { 14 | option (google.api.http) = { put: "/v1/reminder/schedule" body: "*" }; 15 | } 16 | } 17 | 18 | message ScheduleReminderRequest { 19 | google.protobuf.Timestamp when = 1 [(validator.field) = {future_timestamp: true}]; 20 | } 21 | 22 | message ScheduleReminderResponse { 23 | string id = 1; 24 | } -------------------------------------------------------------------------------- /blog1/cmd/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "log" 5 | "net" 6 | "os" 7 | "os/signal" 8 | "syscall" 9 | 10 | "github.com/arkadyb/blog/blog1/internal/server" 11 | "github.com/arkadyb/blog/blog1/proto/reminder/v1" 12 | "google.golang.org/grpc" 13 | ) 14 | 15 | func main() { 16 | grpcServer := grpc.NewServer() 17 | reminder.RegisterReminderServiceServer(grpcServer, new(server.MyServer)) 18 | 19 | go func() { 20 | lis, err := net.Listen("tcp", "localhost:8080") 21 | if err != nil { 22 | log.Fatalf("failed to listen: %v", err) 23 | } 24 | 25 | if err := grpcServer.Serve(lis); err != nil { 26 | log.Fatal("failed to start server", err) 27 | } 28 | }() 29 | 30 | // let us wait for an input here (ctrl+c) to stop the client 31 | c := make(chan os.Signal) 32 | signal.Notify(c, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) 33 | signal := <-c 34 | log.Fatalf("process killed with signal: %v", signal.String()) 35 | } 36 | -------------------------------------------------------------------------------- /blog4/internal/server/server.go: -------------------------------------------------------------------------------- 1 | package server 2 | 3 | import ( 4 | "context" 5 | "time" 6 | 7 | "github.com/arkadyb/blog/blog4/proto/reminder/v1" 8 | "github.com/golang/protobuf/ptypes" 9 | "github.com/google/uuid" 10 | log "github.com/sirupsen/logrus" 11 | "google.golang.org/grpc/codes" 12 | "google.golang.org/grpc/status" 13 | ) 14 | 15 | type MyServer struct { 16 | } 17 | 18 | func (s *MyServer) ScheduleReminder(ctx context.Context, req *reminder.ScheduleReminderRequest) (*reminder.ScheduleReminderResponse, error) { 19 | when, err := ptypes.Timestamp(req.GetWhen()) 20 | if err != nil { 21 | return nil, status.Error(codes.InvalidArgument, "when is invalid") 22 | } 23 | 24 | newTimerID := uuid.New().String() 25 | go func(id string, dur time.Duration) { 26 | timer := time.NewTimer(dur) 27 | <-timer.C 28 | log.Infof("Timer %s time!", newTimerID) 29 | }(newTimerID, when.Sub(time.Now())) 30 | 31 | return &reminder.ScheduleReminderResponse{ 32 | Id: newTimerID, 33 | }, nil 34 | } 35 | -------------------------------------------------------------------------------- /blog1/cmd/client/client.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "time" 6 | 7 | "github.com/arkadyb/blog/blog1/proto/reminder/v1" 8 | "github.com/golang/protobuf/ptypes" 9 | log "github.com/sirupsen/logrus" 10 | "google.golang.org/grpc" 11 | ) 12 | 13 | func main() { 14 | ctx, _ := context.WithTimeout( 15 | context.Background(), 16 | 5*time.Second, 17 | ) 18 | reminderConn, err := grpc.DialContext(ctx, "localhost:8080", 19 | grpc.WithInsecure(), 20 | ) 21 | if err != nil { 22 | log.Fatalln("Failed to dial server: ", err) 23 | } 24 | 25 | reminderClient := reminder.NewReminderServiceClient(reminderConn) 26 | fiveSeconds, _ := ptypes.TimestampProto(time.Now().Add(5 * time.Second)) 27 | resp, err := reminderClient.ScheduleReminder(ctx, 28 | &reminder.ScheduleReminderRequest{ 29 | When: fiveSeconds, 30 | }) 31 | if err != nil { 32 | log.Fatalln("Failed to schedule a reminder: ", err) 33 | } 34 | log.Infof("Reminder have been successfully scheduled. New reminder id is %s", resp.GetId()) 35 | } 36 | -------------------------------------------------------------------------------- /blog2/server.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIICszCCAZsCAQAwbjELMAkGA1UEBhMCQVUxDDAKBgNVBAgMA05TVzEPMA0GA1UE 3 | BwwGU3lkbmV5MRYwFAYDVQQKDA1BcmthZHkgQmFsYWJhMRQwEgYDVQQLDAtFbmdp 4 | bmVlcmluZzESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC 5 | AQ8AMIIBCgKCAQEAzMHQnHk+Nx1Kg+MTHBCmUzyJ3krrnnc0f1eWdiqlrPOrc69c 6 | 1ITGksgYdRXb0+Rp//cYKTsFMBGJCUBT2QXOLajYTay4cFMEM8WfmuHQy/gDsaZ3 7 | gmdgiC0RWQcxGogq5mfJgCqWdGQbAuTazagmHkAHQKtNgJi0yIySMj7UNAiZUEbF 8 | YsQeYC0Kr9EmKrmMmWm7QCqVYp3onbmr8X+1JRohpX2A8vOoErshv93iDAiDxzuk 9 | sgr82bouSDTKiIGGOPUtRSxE/DNOU/kO55JNUJ+oZuorHqYKmuGlHqsZLjXEG1cw 10 | 3UcqlE9PerUhN4oL6dUtmQPck8YU9qP+nrJk5wIDAQABoAAwDQYJKoZIhvcNAQEL 11 | BQADggEBAETmcTLHDzhGH/v6/PEqdJOOBP5DPE9nwy87+jNl3PvmC/YS0aa+aUxO 12 | jNiDbLoU3C2Jv7zErqima/r1vL3/Nxt9W2URnnDOsct6Iqi3HGyYuOdQdNAeCdAR 13 | J0S888F5qipM45vZu88vI87F/1/7hKlhbecTjlSP4pNdo7kNoYzdiY8A4R4CXUue 14 | FRqH8rPLp6R6ZB06BygMIMZ+4as6l/SqLezf/yCyByGKRfF9nyEEdhyXJAEfC5Jd 15 | o8dwO60NU/eiLMg1YEB2/JlakdxFCCkoBn4BtdLE2mh8YiK6TQklOlmrFxlYna+Q 16 | necqh9kNRQVCTgLQmbhq8Z+xaqF0VnU= 17 | -----END CERTIFICATE REQUEST----- 18 | -------------------------------------------------------------------------------- /blog3/server.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC2zCCAcMCAQAwbjELMAkGA1UEBhMCQVUxDDAKBgNVBAgMA05TVzEPMA0GA1UE 3 | BwwGU3lkbmV5MRYwFAYDVQQKDA1BcmthZHkgQmFsYWJhMRQwEgYDVQQLDAtFbmdp 4 | bmVlcmluZzESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC 5 | AQ8AMIIBCgKCAQEA5ArmV3MJxy1tRhnyQZTWWcxCW2CqYonDimjbaenxBrk3NI/6 6 | 4UjKlzbLY3NINO5hqU+p1E/JrGMcToklXnz/xX5fvLCegr14uypW5umMd5yIP9ob 7 | IbTGY0pbsVqA7aWj4dJmDF0f4XWFujfsdZHwTM3zlSuAXmCOxxtjbntHLV14PVnx 8 | eL3yEmcToIFxpgfAOwMSHbVnUC19QJ/hhyZiCV/V7mINtSEp8sgU4jBhjcJ1rRtW 9 | AqI/963SzDTaQnj/FdV972y0vJXBj30DB52RzMBVO68EhcZQyd1JP9dIlwVbezeW 10 | XSWYcgNVaa4tKUCdbTFkfNK1Edvh9ars4jignQIDAQABoCgwJgYJKoZIhvcNAQkO 11 | MRkwFzAVBgNVHREEDjAMhwQAAAAAhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQB3 12 | 1QTtzWjENZPXibM+jxx7+8Dv8p3FrWfIc0vpl2f488Vwi36Mpw6QivEW3wT7jTFg 13 | N13wW2dJx2380oguJHw/fmZ5fqelrPMZFDi8dGKocZpzQxh/TzSO8D/Hkqm8N6JI 14 | uIPJI2tDgZs140MVLGenBlRbpV44bZvclrx/2Ir6G0xXfB1EstFTJa67NrdDmNbM 15 | bCevbfbwXDuJ/dEZMXBvF76q1FHm+Jdg4heeo+0oMzMH9S24x6BSB5JfSbW4iiiU 16 | P/yprI6/BvWYJ7jGfXaxOWYLv5uEgI5Bj4omnLQZn415tKVRso4uNXRWjd0zTUnT 17 | ZlqnrHrqVGInD0uD8MlS 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /blog4/server.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC5jCCAc4CAQAwbjELMAkGA1UEBhMCQVUxDDAKBgNVBAgMA05TVzEPMA0GA1UE 3 | BwwGU3lkbmV5MRYwFAYDVQQKDA1BcmthZHkgQmFsYWJhMRQwEgYDVQQLDAtFbmdp 4 | bmVlcmluZzESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC 5 | AQ8AMIIBCgKCAQEA4u/Uk+GneDZoVnHvjo7aDw/bRuMpnkV9hurm2rbUtk+7sRCL 6 | Op2hIjtjvtAuttQoTy8tMRY31tV4puIiLSine5kOGy5cWK8SWazaSrJX6iuLXqIH 7 | VNxIyAS5XswTCoGZOsSJEE6e1yl2g+XysWWQn0O5pTzsyBA+jw7SJe58Q5vCWj3B 8 | ONsVmQu54FD9mr1zmFEC4PihGbgeMzLnw09TKMM3yaXWb/mn6mbM5wt6u/CZBZkm 9 | aJkwsUPU6GsA4yeQA8BLUu8V4O1sBcO07UKKHFqmJE92MaHjVYPdYGeb7sZ9oC9s 10 | 3Rfya/gnvycvoHPxapeakQpQkXM3sA7dfNSszQIDAQABoDMwMQYJKoZIhvcNAQkO 11 | MSQwIjAgBgNVHREEGTAXgglsb2NhbGhvc3SHBAAAAACHBH8AAAEwDQYJKoZIhvcN 12 | AQELBQADggEBAIus+KXcXR0mvs6fqBzy7oaMhoBATry/Y+28unIDTujcRTOPVnMB 13 | bgS4+NLzUqS8OckWk2vaW0APq25MmulVaoQeFDrO8F/ckoOaJJ9v7EJD/SlYxZ7T 14 | fTBYz2k/PeR031OWwdwkmPY2jrcHefo5/XgF/th6tY/5so0r5Zzsrce8ieivg2vu 15 | Pk8+FFjlk8XR8d9qFOLQM8COawlA10zmMkYS2eQ4+lG+0R1EMVWfP/oiwqK32Wu9 16 | 30gelrk7QZy+l2eX1v8tvyx34ZmUXRnBriHa0PPXo7NWKlvvBCza2Us62UO2/kZt 17 | AMlblPbsJ8pOrA5w8cWo4dYLkmP9J7OyzL4= 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /blog2/cmd/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "log" 5 | "net" 6 | "os" 7 | "os/signal" 8 | "syscall" 9 | 10 | "github.com/arkadyb/blog/blog2/internal/server" 11 | "github.com/arkadyb/blog/blog2/proto/reminder/v1" 12 | "google.golang.org/grpc" 13 | "google.golang.org/grpc/credentials" 14 | ) 15 | 16 | func main() { 17 | serverCert, err := credentials.NewServerTLSFromFile("../server.crt", "../server.key") 18 | if err != nil { 19 | log.Fatalln("failed to create cert", err) 20 | } 21 | grpcServer := grpc.NewServer(grpc.Creds(serverCert)) 22 | reminder.RegisterReminderServiceServer(grpcServer, new(server.MyServer)) 23 | 24 | go func() { 25 | lis, err := net.Listen("tcp", "localhost:8080") 26 | if err != nil { 27 | log.Fatalf("failed to listen: %v", err) 28 | } 29 | 30 | if err := grpcServer.Serve(lis); err != nil { 31 | log.Fatal("failed to start server", err) 32 | } 33 | }() 34 | 35 | // let us wait for an input here (ctrl+c) to stop the client 36 | c := make(chan os.Signal) 37 | signal.Notify(c, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) 38 | signal := <-c 39 | log.Fatalf("process killed with signal: %v", signal.String()) 40 | } 41 | -------------------------------------------------------------------------------- /blog4/proto/reminder/v1/reminder.validator.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-gogo. DO NOT EDIT. 2 | // source: reminder.proto 3 | 4 | package reminder 5 | 6 | import ( 7 | fmt "fmt" 8 | math "math" 9 | proto "github.com/golang/protobuf/proto" 10 | _ "github.com/arkadyb/go-proto-validators" 11 | _ "github.com/golang/protobuf/ptypes/timestamp" 12 | _ "google.golang.org/genproto/googleapis/api/annotations" 13 | time "time" 14 | github_com_golang_protobuf_ptypes "github.com/golang/protobuf/ptypes" 15 | ) 16 | 17 | // Reference imports to suppress errors if they are not otherwise used. 18 | var _ = proto.Marshal 19 | var _ = fmt.Errorf 20 | var _ = math.Inf 21 | 22 | func (this *ScheduleReminderRequest) Validate() error { 23 | if nil == this.When { 24 | return fmt.Errorf("field When cant be nil") 25 | } 26 | tsWhen, err := github_com_golang_protobuf_ptypes.Timestamp(this.When) 27 | if err != nil { 28 | return fmt.Errorf("faield to convert When to Timestamp") 29 | } 30 | if !tsWhen.After(time.Now()) { 31 | return fmt.Errorf("must be future timestamp") 32 | } 33 | return nil 34 | } 35 | func (this *ScheduleReminderResponse) Validate() error { 36 | return nil 37 | } 38 | -------------------------------------------------------------------------------- /blog1/internal/server/server.go: -------------------------------------------------------------------------------- 1 | package server 2 | 3 | import ( 4 | "context" 5 | "time" 6 | 7 | "github.com/arkadyb/blog/blog1/proto/reminder/v1" 8 | "github.com/golang/protobuf/ptypes" 9 | "github.com/google/uuid" 10 | log "github.com/sirupsen/logrus" 11 | "google.golang.org/grpc/codes" 12 | "google.golang.org/grpc/status" 13 | ) 14 | 15 | type MyServer struct { 16 | } 17 | 18 | func (s *MyServer) ScheduleReminder(ctx context.Context, req *reminder.ScheduleReminderRequest) (*reminder.ScheduleReminderResponse, error) { 19 | if req.When == nil { 20 | return nil, status.Error(codes.InvalidArgument, "when cant be nil") 21 | } 22 | 23 | when, err := ptypes.Timestamp(req.GetWhen()) 24 | if err != nil { 25 | return nil, status.Error(codes.Internal, "cant convert timestamp into time") 26 | } 27 | 28 | if when.Before(time.Now()) { 29 | return nil, status.Error(codes.InvalidArgument, "when should be in the future") 30 | } 31 | 32 | newTimerID := uuid.New().String() 33 | go func(id string, dur time.Duration) { 34 | timer := time.NewTimer(dur) 35 | <-timer.C 36 | log.Infof("Timer %s time!", newTimerID) 37 | }(newTimerID, when.Sub(time.Now())) 38 | 39 | return &reminder.ScheduleReminderResponse{ 40 | Id: newTimerID, 41 | }, nil 42 | } 43 | -------------------------------------------------------------------------------- /blog2/internal/server/server.go: -------------------------------------------------------------------------------- 1 | package server 2 | 3 | import ( 4 | "context" 5 | "time" 6 | 7 | "github.com/arkadyb/blog/blog2/proto/reminder/v1" 8 | "github.com/golang/protobuf/ptypes" 9 | "github.com/google/uuid" 10 | log "github.com/sirupsen/logrus" 11 | "google.golang.org/grpc/codes" 12 | "google.golang.org/grpc/status" 13 | ) 14 | 15 | type MyServer struct { 16 | } 17 | 18 | func (s *MyServer) ScheduleReminder(ctx context.Context, req *reminder.ScheduleReminderRequest) (*reminder.ScheduleReminderResponse, error) { 19 | if req.When == nil { 20 | return nil, status.Error(codes.InvalidArgument, "when cant be nil") 21 | } 22 | 23 | when, err := ptypes.Timestamp(req.GetWhen()) 24 | if err != nil { 25 | return nil, status.Error(codes.Internal, "cant convert timestamp into time") 26 | } 27 | 28 | if when.Before(time.Now()) { 29 | return nil, status.Error(codes.InvalidArgument, "when should be in the future") 30 | } 31 | 32 | newTimerID := uuid.New().String() 33 | go func(id string, dur time.Duration) { 34 | timer := time.NewTimer(dur) 35 | <-timer.C 36 | log.Infof("Timer %s time!", newTimerID) 37 | }(newTimerID, when.Sub(time.Now())) 38 | 39 | return &reminder.ScheduleReminderResponse{ 40 | Id: newTimerID, 41 | }, nil 42 | } 43 | -------------------------------------------------------------------------------- /blog3/internal/server/server.go: -------------------------------------------------------------------------------- 1 | package server 2 | 3 | import ( 4 | "context" 5 | "time" 6 | 7 | "github.com/arkadyb/blog/blog3/proto/reminder/v1" 8 | "github.com/golang/protobuf/ptypes" 9 | "github.com/google/uuid" 10 | log "github.com/sirupsen/logrus" 11 | "google.golang.org/grpc/codes" 12 | "google.golang.org/grpc/status" 13 | ) 14 | 15 | type MyServer struct { 16 | } 17 | 18 | func (s *MyServer) ScheduleReminder(ctx context.Context, req *reminder.ScheduleReminderRequest) (*reminder.ScheduleReminderResponse, error) { 19 | if req.When == nil { 20 | return nil, status.Error(codes.InvalidArgument, "when cant be nil") 21 | } 22 | 23 | when, err := ptypes.Timestamp(req.GetWhen()) 24 | if err != nil { 25 | return nil, status.Error(codes.Internal, "cant convert timestamp into time") 26 | } 27 | 28 | if when.Before(time.Now()) { 29 | return nil, status.Error(codes.InvalidArgument, "when should be in the future") 30 | } 31 | 32 | newTimerID := uuid.New().String() 33 | go func(id string, dur time.Duration) { 34 | timer := time.NewTimer(dur) 35 | <-timer.C 36 | log.Infof("Timer %s time!", newTimerID) 37 | }(newTimerID, when.Sub(time.Now())) 38 | 39 | return &reminder.ScheduleReminderResponse{ 40 | Id: newTimerID, 41 | }, nil 42 | } 43 | -------------------------------------------------------------------------------- /blog2/cmd/client/client.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "time" 6 | 7 | "github.com/arkadyb/blog/blog2/proto/reminder/v1" 8 | "github.com/golang/protobuf/ptypes" 9 | log "github.com/sirupsen/logrus" 10 | "google.golang.org/grpc" 11 | "google.golang.org/grpc/credentials" 12 | ) 13 | 14 | func main() { 15 | ctx, _ := context.WithTimeout( 16 | context.Background(), 17 | 5*time.Second, 18 | ) 19 | 20 | clientCert, err := credentials.NewClientTLSFromFile("../../server.crt", "") 21 | if err != nil { 22 | log.Fatalln("failed to create cert", err) 23 | } 24 | 25 | reminderConn, err := grpc.DialContext(ctx, "localhost:8080", 26 | grpc.WithTransportCredentials(clientCert), 27 | ) 28 | if err != nil { 29 | log.Fatalln("Failed to dial server: ", err) 30 | } 31 | 32 | reminderClient := reminder.NewReminderServiceClient(reminderConn) 33 | fiveSeconds, _ := ptypes.TimestampProto(time.Now().Add(5 * time.Second)) 34 | resp, err := reminderClient.ScheduleReminder(ctx, 35 | &reminder.ScheduleReminderRequest{ 36 | When: fiveSeconds, 37 | }) 38 | if err != nil { 39 | log.Fatalln("Failed to schedule a reminder: ", err) 40 | } 41 | log.Infof("Reminder have been successfully scheduled. New reminder id is %s", resp.GetId()) 42 | } 43 | -------------------------------------------------------------------------------- /blog3/cmd/client/client.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "time" 6 | 7 | "github.com/arkadyb/blog/blog3/proto/reminder/v1" 8 | "github.com/golang/protobuf/ptypes" 9 | log "github.com/sirupsen/logrus" 10 | "google.golang.org/grpc" 11 | "google.golang.org/grpc/credentials" 12 | ) 13 | 14 | func main() { 15 | ctx, _ := context.WithTimeout( 16 | context.Background(), 17 | 5*time.Second, 18 | ) 19 | 20 | clientCert, err := credentials.NewClientTLSFromFile("../../server.crt", "") 21 | if err != nil { 22 | log.Fatalln("failed to create cert", err) 23 | } 24 | 25 | reminderConn, err := grpc.DialContext(ctx, "localhost:8080", 26 | grpc.WithTransportCredentials(clientCert), 27 | ) 28 | if err != nil { 29 | log.Fatalln("Failed to dial server: ", err) 30 | } 31 | 32 | reminderClient := reminder.NewReminderServiceClient(reminderConn) 33 | fiveSeconds, _ := ptypes.TimestampProto(time.Now().Add(5 * time.Second)) 34 | resp, err := reminderClient.ScheduleReminder(ctx, 35 | &reminder.ScheduleReminderRequest{ 36 | When: fiveSeconds, 37 | }) 38 | if err != nil { 39 | log.Fatalln("Failed to schedule a reminder: ", err) 40 | } 41 | log.Infof("Reminder have been successfully scheduled. New reminder id is %s", resp.GetId()) 42 | } 43 | -------------------------------------------------------------------------------- /blog4/cmd/client/client.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "time" 6 | 7 | "github.com/arkadyb/blog/blog3/proto/reminder/v1" 8 | "github.com/golang/protobuf/ptypes" 9 | log "github.com/sirupsen/logrus" 10 | "google.golang.org/grpc" 11 | "google.golang.org/grpc/credentials" 12 | ) 13 | 14 | func main() { 15 | ctx, _ := context.WithTimeout( 16 | context.Background(), 17 | 5*time.Second, 18 | ) 19 | 20 | clientCert, err := credentials.NewClientTLSFromFile("../../server.crt", "") 21 | if err != nil { 22 | log.Fatalln("failed to create cert", err) 23 | } 24 | 25 | reminderConn, err := grpc.DialContext(ctx, "localhost:8080", 26 | grpc.WithTransportCredentials(clientCert), 27 | ) 28 | if err != nil { 29 | log.Fatalln("Failed to dial server: ", err) 30 | } 31 | 32 | reminderClient := reminder.NewReminderServiceClient(reminderConn) 33 | fiveSeconds, _ := ptypes.TimestampProto(time.Now().Add(5 * time.Second)) 34 | resp, err := reminderClient.ScheduleReminder(ctx, 35 | &reminder.ScheduleReminderRequest{ 36 | When: fiveSeconds, 37 | }) 38 | if err != nil { 39 | log.Fatalln("Failed to schedule a reminder: ", err) 40 | } 41 | log.Infof("Reminder have been successfully scheduled. New reminder id is %s", resp.GetId()) 42 | } 43 | -------------------------------------------------------------------------------- /blog2/server.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDeDCCAmCgAwIBAgIJAMTxr4FzhMquMA0GCSqGSIb3DQEBBQUAMG4xCzAJBgNV 3 | BAYTAkFVMQwwCgYDVQQIDANOU1cxDzANBgNVBAcMBlN5ZG5leTEWMBQGA1UECgwN 4 | QXJrYWR5IEJhbGFiYTEUMBIGA1UECwwLRW5naW5lZXJpbmcxEjAQBgNVBAMMCWxv 5 | Y2FsaG9zdDAeFw0xOTEwMDcwMTA5MzlaFw0yOTEwMDQwMTA5MzlaMG4xCzAJBgNV 6 | BAYTAkFVMQwwCgYDVQQIDANOU1cxDzANBgNVBAcMBlN5ZG5leTEWMBQGA1UECgwN 7 | QXJrYWR5IEJhbGFiYTEUMBIGA1UECwwLRW5naW5lZXJpbmcxEjAQBgNVBAMMCWxv 8 | Y2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMzB0Jx5Pjcd 9 | SoPjExwQplM8id5K6553NH9XlnYqpazzq3OvXNSExpLIGHUV29Pkaf/3GCk7BTAR 10 | iQlAU9kFzi2o2E2suHBTBDPFn5rh0Mv4A7Gmd4JnYIgtEVkHMRqIKuZnyYAqlnRk 11 | GwLk2s2oJh5AB0CrTYCYtMiMkjI+1DQImVBGxWLEHmAtCq/RJiq5jJlpu0AqlWKd 12 | 6J25q/F/tSUaIaV9gPLzqBK7Ib/d4gwIg8c7pLIK/Nm6Lkg0yoiBhjj1LUUsRPwz 13 | TlP5DueSTVCfqGbqKx6mCprhpR6rGS41xBtXMN1HKpRPT3q1ITeKC+nVLZkD3JPG 14 | FPaj/p6yZOcCAwEAAaMZMBcwFQYDVR0RBA4wDIcEAAAAAIcEfwAAATANBgkqhkiG 15 | 9w0BAQUFAAOCAQEAoyh3akU8iN8QQSIRpcd88Q1qB1geLjEl+d/lj/J7DvNbRUjH 16 | FCzYrUEJ7K948RqGAR2A5Sf9TiayOjM10gpMX9f+rsq/uDQNWPYVrGra1x4zb97Q 17 | vJxu5I7AkFkBGb3HWkpIHOAY64+oRjv1SEDz8m/D7jeRztEwEk8cM6zRM++1ttZw 18 | 5WStXTxsm0+X+k2o3d5fPYNQ50K+cpBIi4kJAxnPNW4+4FChcIiF94d6wXa8fwNC 19 | tHKuTyHK/uB2fQKFd/5KRcWjun5MBL9C+2EOiPtJq5q/t6DUcHpTgRyqwwLnD+1P 20 | DK6yZX66sS6Jt2hQ/EtO5oknjBrvNAoglEcvug== 21 | -----END CERTIFICATE----- 22 | -------------------------------------------------------------------------------- /blog3/server.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDeDCCAmCgAwIBAgIJAL4/UVX48wnaMA0GCSqGSIb3DQEBBQUAMG4xCzAJBgNV 3 | BAYTAkFVMQwwCgYDVQQIDANOU1cxDzANBgNVBAcMBlN5ZG5leTEWMBQGA1UECgwN 4 | QXJrYWR5IEJhbGFiYTEUMBIGA1UECwwLRW5naW5lZXJpbmcxEjAQBgNVBAMMCWxv 5 | Y2FsaG9zdDAeFw0xOTEwMDcwMTE1NDFaFw0yOTEwMDQwMTE1NDFaMG4xCzAJBgNV 6 | BAYTAkFVMQwwCgYDVQQIDANOU1cxDzANBgNVBAcMBlN5ZG5leTEWMBQGA1UECgwN 7 | QXJrYWR5IEJhbGFiYTEUMBIGA1UECwwLRW5naW5lZXJpbmcxEjAQBgNVBAMMCWxv 8 | Y2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOQK5ldzCcct 9 | bUYZ8kGU1lnMQltgqmKJw4po22np8Qa5NzSP+uFIypc2y2NzSDTuYalPqdRPyaxj 10 | HE6JJV58/8V+X7ywnoK9eLsqVubpjHeciD/aGyG0xmNKW7FagO2lo+HSZgxdH+F1 11 | hbo37HWR8EzN85UrgF5gjscbY257Ry1deD1Z8Xi98hJnE6CBcaYHwDsDEh21Z1At 12 | fUCf4YcmYglf1e5iDbUhKfLIFOIwYY3Cda0bVgKiP/et0sw02kJ4/xXVfe9stLyV 13 | wY99AwedkczAVTuvBIXGUMndST/XSJcFW3s3ll0lmHIDVWmuLSlAnW0xZHzStRHb 14 | 4fWq7OI4oJ0CAwEAAaMZMBcwFQYDVR0RBA4wDIcEAAAAAIcEfwAAATANBgkqhkiG 15 | 9w0BAQUFAAOCAQEAyaVtI2OWALVX/8O2emZp4GFebVThmoA1fMIpwv6EBXh4iqO7 16 | CUktI3Da0vq6Dn0m9J0QSTifr2EBPleSLry2foh9l+S3FTxY+TWk1bCcj3IxGfWQ 17 | rtM5X/EAxd1ymxlFHDgWD7KnaH2jPjPL4B1XDciDEaTY0boEUyviWwhLYFV0jWMR 18 | Rd12mK64fSNbPgxNJaurqvJk3Bar+7ed5aqHCKgAYFUmX/2/Wn3kbtT3ljKF4il+ 19 | 3u96fvD4U6xT99TqBW3Qvf3oq0OyTCnZw47YsT8Tg4JcjMkKfoYtQzwVgWfWRO6C 20 | b2RG1fcfh2RpwSSc24JBNUf4qxPYCEk+Ih56Bw== 21 | -----END CERTIFICATE----- 22 | -------------------------------------------------------------------------------- /blog4/server.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDgzCCAmugAwIBAgIJAIiI2Lr/5J++MA0GCSqGSIb3DQEBBQUAMG4xCzAJBgNV 3 | BAYTAkFVMQwwCgYDVQQIDANOU1cxDzANBgNVBAcMBlN5ZG5leTEWMBQGA1UECgwN 4 | QXJrYWR5IEJhbGFiYTEUMBIGA1UECwwLRW5naW5lZXJpbmcxEjAQBgNVBAMMCWxv 5 | Y2FsaG9zdDAeFw0xOTA5MTkwNzM4NTVaFw0yOTA5MTYwNzM4NTVaMG4xCzAJBgNV 6 | BAYTAkFVMQwwCgYDVQQIDANOU1cxDzANBgNVBAcMBlN5ZG5leTEWMBQGA1UECgwN 7 | QXJrYWR5IEJhbGFiYTEUMBIGA1UECwwLRW5naW5lZXJpbmcxEjAQBgNVBAMMCWxv 8 | Y2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOLv1JPhp3g2 9 | aFZx746O2g8P20bjKZ5FfYbq5tq21LZPu7EQizqdoSI7Y77QLrbUKE8vLTEWN9bV 10 | eKbiIi0op3uZDhsuXFivElms2kqyV+ori16iB1TcSMgEuV7MEwqBmTrEiRBOntcp 11 | doPl8rFlkJ9DuaU87MgQPo8O0iXufEObwlo9wTjbFZkLueBQ/Zq9c5hRAuD4oRm4 12 | HjMy58NPUyjDN8ml1m/5p+pmzOcLervwmQWZJmiZMLFD1OhrAOMnkAPAS1LvFeDt 13 | bAXDtO1CihxapiRPdjGh41WD3WBnm+7GfaAvbN0X8mv4J78nL6Bz8WqXmpEKUJFz 14 | N7AO3XzUrM0CAwEAAaMkMCIwIAYDVR0RBBkwF4IJbG9jYWxob3N0hwQAAAAAhwR/ 15 | AAABMA0GCSqGSIb3DQEBBQUAA4IBAQAZJVtAk11ILSiJB9D6N6RtKv1R4bLMyHaw 16 | XuOuzusoYO7OGgGFX6TiNEnCK7B7zTDwSKKOdWoGJvvuokmMswvoQSptMHQMjvoz 17 | SNIoqtAj2qOju/pSjN82RORzFCQqZVUQ2VBhyhmnDrkZbMQMCHcf0k93KbPLbPas 18 | qig6e9ilqT6U7G9Xb+bpBDKKsDqc43P+hquVNzdEnx/046YWAbqXNllo/dbTmcd4 19 | fuPcsIki89K6h2aUYVqHZ9A44Db4CciUpa6o6iUrMJQksQuzEbUWGA8nmeqE8fJV 20 | s9JgDvm/zl1kAAjHbieUFV0KCRwHY+YdIV1RE5W7WulJV5I2PgZp 21 | -----END CERTIFICATE----- 22 | -------------------------------------------------------------------------------- /blog2/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEogIBAAKCAQEAzMHQnHk+Nx1Kg+MTHBCmUzyJ3krrnnc0f1eWdiqlrPOrc69c 3 | 1ITGksgYdRXb0+Rp//cYKTsFMBGJCUBT2QXOLajYTay4cFMEM8WfmuHQy/gDsaZ3 4 | gmdgiC0RWQcxGogq5mfJgCqWdGQbAuTazagmHkAHQKtNgJi0yIySMj7UNAiZUEbF 5 | YsQeYC0Kr9EmKrmMmWm7QCqVYp3onbmr8X+1JRohpX2A8vOoErshv93iDAiDxzuk 6 | sgr82bouSDTKiIGGOPUtRSxE/DNOU/kO55JNUJ+oZuorHqYKmuGlHqsZLjXEG1cw 7 | 3UcqlE9PerUhN4oL6dUtmQPck8YU9qP+nrJk5wIDAQABAoIBACRoTfSUplhcb/R1 8 | et9hooFoYUdSYQTjQ0VlSI6oVJ8lEJZYVxQ+q6RLyfV/tn+9vI9T20rxgKGkbI5l 9 | jsMnAhsiS5u8G2t1h2jBOfjrMBokdluvMs7QHNz5znzbB4MlNSOUzsJoUCpP5nGk 10 | SbeJr4Vvcxqvmu9Dt9l1DUW74DWEBCIuWp8XmRooq/q6oOVd8ZuHAXInGDDP+ajf 11 | RcbWsH0i/m/a1FlOidq34AqfRtiM/QcwXlaxjnNt1PhTGalb1T6lfmynWOx/zz9D 12 | pvtqhaxNc6tcQKyeGdPg5GSPpGXo2+xdrtgAwlUfSYzRdUh4qqMi+wy6Y/YfTXsD 13 | GVOsAXkCgYEA+yMMoiRjKjObscdCn0FgLfZZJ7F9LTK+2J9mTa3iCeK6NSijvahB 14 | vfJMM2QppAXrgzmpvUQIrttk1xfRTch/ooQl1f1t4GkIWoDiR0ICqMzsRxIMea3l 15 | +YYyfZ59OVX2mnBfTSji4AbXQYyuEHUtm1/LFcDdgNJ9O9h9fUHX0g0CgYEA0LjZ 16 | SFEc9O0mP1QDhJrb3RmMw/NemRzz5nnmhYUBky9+OlNj2lsWBZqQCwQsmRDFjfBg 17 | PlBra9PAhD4/z4SBbQV7/ZRJjRw8Vc2Ie+Aj6B2cI1cbxo4a8OWzFKnlk5+gxdwO 18 | B3n2ytoPULvlJMvPBoBLNDZRzBG0rb6vJHwKucMCgYAgq+ii13UHMnuY30FtkoW+ 19 | tQPYRCDy1l05tVML3AlCG/r5m3Xh4Jfc7D65mNhJ/HMtOT054DX4+ZXe3bxfECx6 20 | qhJ6CmRXA5MQox/NAWtzJmW+wTxaQCNhGPJMoWfNI7/XS7M6SI1rc7hhULn8biIm 21 | yomTJOosLjYYqQt6ViyLqQKBgFzNQ3a+8eQIqU/Q9/t2qzkkSg054R6s29jm7FMD 22 | b07U+AfQ2f3VL/Zv4Ym0YmvwJBZXAUPTl9+Kd/eUgeSvoqgpnxaBXy6Jll4EE6IY 23 | Z36l461m5qeiuWHQj44peDTp7Z7rl6VFWjCZQeQAlwKER9k5I7bkS/wzByWVOeQ7 24 | 7rznAoGAf2J5PiX9RgXIkib24wiih437kr4vf8hGTyfUH9dUlY9j4T4ZGZZtm+9t 25 | 0IIv0Rxe6jJxzt3aTLaetN6fwbxMV/0KXHCUJlE95bskT6/N19cdR9d68vTtwZBp 26 | UR5baLuvfsHyRjyocTUkZFFAr7UkYFu0EXpoEanE5FsemAp3VHo= 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /blog3/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEpQIBAAKCAQEA5ArmV3MJxy1tRhnyQZTWWcxCW2CqYonDimjbaenxBrk3NI/6 3 | 4UjKlzbLY3NINO5hqU+p1E/JrGMcToklXnz/xX5fvLCegr14uypW5umMd5yIP9ob 4 | IbTGY0pbsVqA7aWj4dJmDF0f4XWFujfsdZHwTM3zlSuAXmCOxxtjbntHLV14PVnx 5 | eL3yEmcToIFxpgfAOwMSHbVnUC19QJ/hhyZiCV/V7mINtSEp8sgU4jBhjcJ1rRtW 6 | AqI/963SzDTaQnj/FdV972y0vJXBj30DB52RzMBVO68EhcZQyd1JP9dIlwVbezeW 7 | XSWYcgNVaa4tKUCdbTFkfNK1Edvh9ars4jignQIDAQABAoIBAQDWC00NRBMnewIY 8 | TH5RBCz1+H1IW8FR4FFD9wwLq+PqFas1kPdAwhw2Nt5NKIXb+Ox+CSI0//ch8Z0+ 9 | Mgh7WgSREP83kugVe1Z5B1KuRwTruGdC16ujxZR42fCa1YIyjcj3S48xh69G5hJx 10 | KdCuwh61WJKLr1s8OpGJXbHEn729WzrOTOibPRZ9JVBHJumZQtekdOMf+pw43x6X 11 | sKsTWxLO2yB0xL9AlMr4wNL2sATiD569qtNQXdi34koC4V9GrphLgeiQdy94NmmK 12 | +YfQPCUFtUd5PLbXPkS1Ee/q5ZWu3HRvCOo8LYSyvFzf8wrUCfmj+jls/bGxjDod 13 | IMQSwnRZAoGBAPKAUW6ZDhS8OGnFhhplSUQFwQ9WpqBdfZvbn8JMycQ7LQq7csau 14 | 6JeRgYow7ZOUV1pB+RJ7Q/6oWWNShTW8Y93jNlDeEph68LbBWQq15cslyvp+axyl 15 | FrQdwsUAPHAHIy8S3jn4fno0rnnrs0+B5wHJ1ZOSyEWA6OjtkAtgCxWDAoGBAPC8 16 | ixmkPkCoYDKp5xIJGdaLOAIKoKAp3W+nNQeyqG7JkighDz0lt1iRc6N9VgiA4u83 17 | Y79bpjsG40wSScgH4HKIXh7qpk9/SaDaIUL68pMuc8n2J398pt9rbcVCIyEfb11b 18 | 7vNQr6u8GXBci6nHQhzTCx/DoeJF20cZQXRVabdfAoGBAOngQ6ksx93LoYSxUaKH 19 | aN/HxOhsI4uqXwhACpYzxKwSfmBJZGqmKgBz/sEuaxLYEF8mHXdrlqo15u/ZmEu5 20 | A3/uMGZRpxGUEC/RzXR89cC1FEv+PIOF3J2dzkh8780DtTUjN1wlgqWNxXAkl+zo 21 | VcjtxaPr/ma56ucqpq+x0z7NAoGBANIOoo1oPA2tHet3RzH8kPgcmG1nmorGnPqM 22 | +v/Ri5jH9+leF27ylw4INNAGUGixFdNIEJhrvxuoQfMhzhFllho6FW6Cr0WUuslJ 23 | LFbGo517nfsu934NZYpzsd+6eu6vADyFOHZFBFQkmEnr5s3pGS4PlJhN2taWv+RF 24 | DFEXKlyfAoGAbpgl5KwrMZbDM5RFtEPt3AaNBE/CoPF+vJF5t7T9TxRD+fz/sQSP 25 | aZticEeoCrCrLJW7fM9WCCv18NVjxjhZ1NZzbLNrngwxFW41hmOBzBxY6M2w7EH1 26 | IzWs0CopFXCs0/AzjGPCvvnIqlfVeo5wIbZK6GvJdy7U2SjdMJ9rYJ0= 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /blog4/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEpAIBAAKCAQEA4u/Uk+GneDZoVnHvjo7aDw/bRuMpnkV9hurm2rbUtk+7sRCL 3 | Op2hIjtjvtAuttQoTy8tMRY31tV4puIiLSine5kOGy5cWK8SWazaSrJX6iuLXqIH 4 | VNxIyAS5XswTCoGZOsSJEE6e1yl2g+XysWWQn0O5pTzsyBA+jw7SJe58Q5vCWj3B 5 | ONsVmQu54FD9mr1zmFEC4PihGbgeMzLnw09TKMM3yaXWb/mn6mbM5wt6u/CZBZkm 6 | aJkwsUPU6GsA4yeQA8BLUu8V4O1sBcO07UKKHFqmJE92MaHjVYPdYGeb7sZ9oC9s 7 | 3Rfya/gnvycvoHPxapeakQpQkXM3sA7dfNSszQIDAQABAoIBAQDXpRbXv6In9WuI 8 | WZROXyiPD35LCinOIDJ8NlNQmlPfOj0csJ/c/1TS9qR9+c2qJkh3lljXQEmneArC 9 | ajgXuX4NUQ+6fH98NkC1vi9gs8Ae4Wn6bvWQihMPHo4XqsydOzGkSoYEXPFLfDcG 10 | d0f7kouvC+gpQI+wPN91iZvgN5MVme7aDCY2AFFpXYjRnLyzSG/XPtLfdmymfVas 11 | +TeSPJCdjtX6PKC6bDE0pbrda0iD68v7Z9+3G3YFlnAi6d9kZRIZFR9xyNgdvINO 12 | c2yQZDI44nWh7GSUX2N95zNuLdg6sxTfuoUYZ18PvAWYuyf7sMhv1ehDS3RJqDzu 13 | phCZ6VdxAoGBAPo7WiXLb6vi88R61NPxoiEPp8+UJQS0fWg8adsc4JAgrlUpAE/r 14 | adEzY+BU3RWIU34eteYvWiel+puhuEo8WD2UygmxQ2AH/GNnm3qfG1NE4sTpXyIo 15 | LqzLqJ9L5c5//+f9ZcF2jtO+ReYJg2NpCzYXHf8dRARAUGjMkLmcLQIfAoGBAOgr 16 | AvqsJ8kbNJwQw77puQe4RMqIZN4IJ3fAOmedWwj4mDeEmcXkjUqmijwohs0O9guY 17 | yMw9RzPsRdRT0+b8CBsLeA4BVaPlx+fVuRgSZX1DJnXjoor8bWjEL1N/4/1gyR5U 18 | s+mCiTh/YV5RL9bX45OMTwDRZt10QYNOGKyEtuuTAoGAAkxtRY+a1P9esd1W+yNr 19 | E9aq+fMoa+SkikKTzllzjp9eOpYH1LQa4rsQHc1pwnrgGXZ6wUSKFXcm2CsiIDxx 20 | qw8k0/X24njwTpFzEitH+vnVA24JW6z20MuGHwB5ee4fEah4ONC3+yXySmyn8k/S 21 | tIp90gwYxdk5Y90NL0dJ+o0CgYEAmSBtSZosb4bjDyA7ivqqkD3oGVEWfh8QsPn3 22 | S4nMlkEoXE24An649gib2gu8xRjeDU4K+jJceRGYCO/1Lj8CtZu95jbZHk2aqP0c 23 | pJTVnWWhw1WNSnAtVVE4CbGrVN32KGwjcZsoGDxjowqXK/OeZR3AqcBzQRLBdvIW 24 | cgrifsMCgYAJ1sew+7++7uM6REmEV7MUSOOxzWA1hc5OLsPgQ3nwLM1Ultr6MoPS 25 | bteWJTAlD9QvfvWJJAuHee49JKHuKrUgI8KxOZcTBqIMViu6kVTR0FWR2wb45Uks 26 | 46H+pMP1q5bpzOad3dibemr1FUyzKYaczeWiD8Ye4+dUtVHlnShSRg== 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /blog3/cmd/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "net/http" 6 | "strings" 7 | 8 | log "github.com/sirupsen/logrus" 9 | 10 | "github.com/arkadyb/blog/blog3/internal/server" 11 | "github.com/arkadyb/blog/blog3/proto/reminder/v1" 12 | "github.com/grpc-ecosystem/grpc-gateway/runtime" 13 | "google.golang.org/grpc" 14 | "google.golang.org/grpc/credentials" 15 | ) 16 | 17 | func main() { 18 | serverCert, err := credentials.NewServerTLSFromFile("../server.crt", "../server.key") 19 | if err != nil { 20 | log.Fatalln("failed to create cert", err) 21 | } 22 | grpcServer := grpc.NewServer(grpc.Creds(serverCert)) 23 | reminder.RegisterReminderServiceServer(grpcServer, new(server.MyServer)) 24 | 25 | clientCert, err := credentials.NewClientTLSFromFile("../server.crt", "") 26 | if err != nil { 27 | log.Fatalln("failed to create cert", err) 28 | } 29 | conn, err := grpc.DialContext( 30 | context.Background(), 31 | "localhost:8080", 32 | grpc.WithTransportCredentials(clientCert), 33 | ) 34 | if err != nil { 35 | log.Fatalln("Failed to dial server:", err) 36 | } 37 | 38 | router := runtime.NewServeMux() 39 | if err = reminder.RegisterReminderServiceHandler(context.Background(), router, conn); err != nil { 40 | log.Fatalln("Failed to register gateway:", err) 41 | } 42 | 43 | http.ListenAndServeTLS(":8080", "../server.crt", "../server.key", httpGrpcRouter(grpcServer, router)) 44 | } 45 | 46 | func httpGrpcRouter(grpcServer *grpc.Server, httpHandler http.Handler) http.Handler { 47 | return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 48 | if r.ProtoMajor == 2 && strings.Contains(r.Header.Get("Content-Type"), "application/grpc") { 49 | grpcServer.ServeHTTP(w, r) 50 | } else { 51 | httpHandler.ServeHTTP(w, r) 52 | } 53 | }) 54 | } 55 | -------------------------------------------------------------------------------- /blog4/cmd/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "net/http" 6 | "strings" 7 | 8 | log "github.com/sirupsen/logrus" 9 | 10 | "github.com/arkadyb/blog/blog4/internal/server" 11 | "github.com/arkadyb/blog/blog4/proto/reminder/v1" 12 | grpc_validator "github.com/grpc-ecosystem/go-grpc-middleware/validator" 13 | "github.com/grpc-ecosystem/grpc-gateway/runtime" 14 | "google.golang.org/grpc" 15 | "google.golang.org/grpc/credentials" 16 | ) 17 | 18 | func main() { 19 | serverCert, err := credentials.NewServerTLSFromFile("../server.crt", "../server.key") 20 | if err != nil { 21 | log.Fatalln("failed to create cert", err) 22 | } 23 | grpcServer := grpc.NewServer( 24 | grpc.UnaryInterceptor( 25 | grpc_validator.UnaryServerInterceptor(), 26 | ), 27 | grpc.Creds(serverCert)) 28 | reminder.RegisterReminderServiceServer(grpcServer, new(server.MyServer)) 29 | 30 | clientCert, err := credentials.NewClientTLSFromFile("../server.crt", "") 31 | if err != nil { 32 | log.Fatalln("failed to create cert", err) 33 | } 34 | conn, err := grpc.DialContext( 35 | context.Background(), 36 | "localhost:8080", 37 | grpc.WithTransportCredentials(clientCert), 38 | ) 39 | if err != nil { 40 | log.Fatalln("Failed to dial server:", err) 41 | } 42 | 43 | router := runtime.NewServeMux() 44 | if err = reminder.RegisterReminderServiceHandler(context.Background(), router, conn); err != nil { 45 | log.Fatalln("Failed to register gateway:", err) 46 | } 47 | 48 | http.ListenAndServeTLS(":8080", "../server.crt", "../server.key", httpGrpcRouter(grpcServer, router)) 49 | } 50 | 51 | func httpGrpcRouter(grpcServer *grpc.Server, httpHandler http.Handler) http.Handler { 52 | return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 53 | if r.ProtoMajor == 2 && strings.Contains(r.Header.Get("Content-Type"), "application/grpc") { 54 | grpcServer.ServeHTTP(w, r) 55 | } else { 56 | httpHandler.ServeHTTP(w, r) 57 | } 58 | }) 59 | } 60 | -------------------------------------------------------------------------------- /blog3/proto/reminder/v1/reminder.pb.gw.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. 2 | // source: reminder.proto 3 | 4 | /* 5 | Package reminder is a reverse proxy. 6 | 7 | It translates gRPC into RESTful JSON APIs. 8 | */ 9 | package reminder 10 | 11 | import ( 12 | "context" 13 | "io" 14 | "net/http" 15 | 16 | "github.com/golang/protobuf/proto" 17 | "github.com/grpc-ecosystem/grpc-gateway/runtime" 18 | "github.com/grpc-ecosystem/grpc-gateway/utilities" 19 | "google.golang.org/grpc" 20 | "google.golang.org/grpc/codes" 21 | "google.golang.org/grpc/grpclog" 22 | "google.golang.org/grpc/status" 23 | ) 24 | 25 | var _ codes.Code 26 | var _ io.Reader 27 | var _ status.Status 28 | var _ = runtime.String 29 | var _ = utilities.NewDoubleArray 30 | 31 | func request_ReminderService_ScheduleReminder_0(ctx context.Context, marshaler runtime.Marshaler, client ReminderServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { 32 | var protoReq ScheduleReminderRequest 33 | var metadata runtime.ServerMetadata 34 | 35 | newReader, berr := utilities.IOReaderFactory(req.Body) 36 | if berr != nil { 37 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) 38 | } 39 | if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { 40 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) 41 | } 42 | 43 | msg, err := client.ScheduleReminder(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) 44 | return msg, metadata, err 45 | 46 | } 47 | 48 | func local_request_ReminderService_ScheduleReminder_0(ctx context.Context, marshaler runtime.Marshaler, server ReminderServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { 49 | var protoReq ScheduleReminderRequest 50 | var metadata runtime.ServerMetadata 51 | 52 | newReader, berr := utilities.IOReaderFactory(req.Body) 53 | if berr != nil { 54 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) 55 | } 56 | if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { 57 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) 58 | } 59 | 60 | msg, err := server.ScheduleReminder(ctx, &protoReq) 61 | return msg, metadata, err 62 | 63 | } 64 | 65 | // RegisterReminderServiceHandlerServer registers the http handlers for service ReminderService to "mux". 66 | // UnaryRPC :call ReminderServiceServer directly. 67 | // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. 68 | func RegisterReminderServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ReminderServiceServer) error { 69 | 70 | mux.Handle("PUT", pattern_ReminderService_ScheduleReminder_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { 71 | ctx, cancel := context.WithCancel(req.Context()) 72 | defer cancel() 73 | inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) 74 | rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) 75 | if err != nil { 76 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) 77 | return 78 | } 79 | resp, md, err := local_request_ReminderService_ScheduleReminder_0(rctx, inboundMarshaler, server, req, pathParams) 80 | ctx = runtime.NewServerMetadataContext(ctx, md) 81 | if err != nil { 82 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) 83 | return 84 | } 85 | 86 | forward_ReminderService_ScheduleReminder_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) 87 | 88 | }) 89 | 90 | return nil 91 | } 92 | 93 | // RegisterReminderServiceHandlerFromEndpoint is same as RegisterReminderServiceHandler but 94 | // automatically dials to "endpoint" and closes the connection when "ctx" gets done. 95 | func RegisterReminderServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { 96 | conn, err := grpc.Dial(endpoint, opts...) 97 | if err != nil { 98 | return err 99 | } 100 | defer func() { 101 | if err != nil { 102 | if cerr := conn.Close(); cerr != nil { 103 | grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) 104 | } 105 | return 106 | } 107 | go func() { 108 | <-ctx.Done() 109 | if cerr := conn.Close(); cerr != nil { 110 | grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) 111 | } 112 | }() 113 | }() 114 | 115 | return RegisterReminderServiceHandler(ctx, mux, conn) 116 | } 117 | 118 | // RegisterReminderServiceHandler registers the http handlers for service ReminderService to "mux". 119 | // The handlers forward requests to the grpc endpoint over "conn". 120 | func RegisterReminderServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { 121 | return RegisterReminderServiceHandlerClient(ctx, mux, NewReminderServiceClient(conn)) 122 | } 123 | 124 | // RegisterReminderServiceHandlerClient registers the http handlers for service ReminderService 125 | // to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ReminderServiceClient". 126 | // Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ReminderServiceClient" 127 | // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in 128 | // "ReminderServiceClient" to call the correct interceptors. 129 | func RegisterReminderServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ReminderServiceClient) error { 130 | 131 | mux.Handle("PUT", pattern_ReminderService_ScheduleReminder_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { 132 | ctx, cancel := context.WithCancel(req.Context()) 133 | defer cancel() 134 | inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) 135 | rctx, err := runtime.AnnotateContext(ctx, mux, req) 136 | if err != nil { 137 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) 138 | return 139 | } 140 | resp, md, err := request_ReminderService_ScheduleReminder_0(rctx, inboundMarshaler, client, req, pathParams) 141 | ctx = runtime.NewServerMetadataContext(ctx, md) 142 | if err != nil { 143 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) 144 | return 145 | } 146 | 147 | forward_ReminderService_ScheduleReminder_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) 148 | 149 | }) 150 | 151 | return nil 152 | } 153 | 154 | var ( 155 | pattern_ReminderService_ScheduleReminder_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "reminder", "schedule"}, "", runtime.AssumeColonVerbOpt(true))) 156 | ) 157 | 158 | var ( 159 | forward_ReminderService_ScheduleReminder_0 = runtime.ForwardResponseMessage 160 | ) 161 | -------------------------------------------------------------------------------- /blog4/proto/reminder/v1/reminder.pb.gw.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. 2 | // source: reminder.proto 3 | 4 | /* 5 | Package reminder is a reverse proxy. 6 | 7 | It translates gRPC into RESTful JSON APIs. 8 | */ 9 | package reminder 10 | 11 | import ( 12 | "context" 13 | "io" 14 | "net/http" 15 | 16 | "github.com/golang/protobuf/proto" 17 | "github.com/grpc-ecosystem/grpc-gateway/runtime" 18 | "github.com/grpc-ecosystem/grpc-gateway/utilities" 19 | "google.golang.org/grpc" 20 | "google.golang.org/grpc/codes" 21 | "google.golang.org/grpc/grpclog" 22 | "google.golang.org/grpc/status" 23 | ) 24 | 25 | var _ codes.Code 26 | var _ io.Reader 27 | var _ status.Status 28 | var _ = runtime.String 29 | var _ = utilities.NewDoubleArray 30 | 31 | func request_ReminderService_ScheduleReminder_0(ctx context.Context, marshaler runtime.Marshaler, client ReminderServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { 32 | var protoReq ScheduleReminderRequest 33 | var metadata runtime.ServerMetadata 34 | 35 | newReader, berr := utilities.IOReaderFactory(req.Body) 36 | if berr != nil { 37 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) 38 | } 39 | if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { 40 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) 41 | } 42 | 43 | msg, err := client.ScheduleReminder(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) 44 | return msg, metadata, err 45 | 46 | } 47 | 48 | func local_request_ReminderService_ScheduleReminder_0(ctx context.Context, marshaler runtime.Marshaler, server ReminderServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { 49 | var protoReq ScheduleReminderRequest 50 | var metadata runtime.ServerMetadata 51 | 52 | newReader, berr := utilities.IOReaderFactory(req.Body) 53 | if berr != nil { 54 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) 55 | } 56 | if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { 57 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) 58 | } 59 | 60 | msg, err := server.ScheduleReminder(ctx, &protoReq) 61 | return msg, metadata, err 62 | 63 | } 64 | 65 | // RegisterReminderServiceHandlerServer registers the http handlers for service ReminderService to "mux". 66 | // UnaryRPC :call ReminderServiceServer directly. 67 | // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. 68 | func RegisterReminderServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ReminderServiceServer) error { 69 | 70 | mux.Handle("PUT", pattern_ReminderService_ScheduleReminder_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { 71 | ctx, cancel := context.WithCancel(req.Context()) 72 | defer cancel() 73 | inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) 74 | rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) 75 | if err != nil { 76 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) 77 | return 78 | } 79 | resp, md, err := local_request_ReminderService_ScheduleReminder_0(rctx, inboundMarshaler, server, req, pathParams) 80 | ctx = runtime.NewServerMetadataContext(ctx, md) 81 | if err != nil { 82 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) 83 | return 84 | } 85 | 86 | forward_ReminderService_ScheduleReminder_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) 87 | 88 | }) 89 | 90 | return nil 91 | } 92 | 93 | // RegisterReminderServiceHandlerFromEndpoint is same as RegisterReminderServiceHandler but 94 | // automatically dials to "endpoint" and closes the connection when "ctx" gets done. 95 | func RegisterReminderServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { 96 | conn, err := grpc.Dial(endpoint, opts...) 97 | if err != nil { 98 | return err 99 | } 100 | defer func() { 101 | if err != nil { 102 | if cerr := conn.Close(); cerr != nil { 103 | grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) 104 | } 105 | return 106 | } 107 | go func() { 108 | <-ctx.Done() 109 | if cerr := conn.Close(); cerr != nil { 110 | grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) 111 | } 112 | }() 113 | }() 114 | 115 | return RegisterReminderServiceHandler(ctx, mux, conn) 116 | } 117 | 118 | // RegisterReminderServiceHandler registers the http handlers for service ReminderService to "mux". 119 | // The handlers forward requests to the grpc endpoint over "conn". 120 | func RegisterReminderServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { 121 | return RegisterReminderServiceHandlerClient(ctx, mux, NewReminderServiceClient(conn)) 122 | } 123 | 124 | // RegisterReminderServiceHandlerClient registers the http handlers for service ReminderService 125 | // to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ReminderServiceClient". 126 | // Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ReminderServiceClient" 127 | // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in 128 | // "ReminderServiceClient" to call the correct interceptors. 129 | func RegisterReminderServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ReminderServiceClient) error { 130 | 131 | mux.Handle("PUT", pattern_ReminderService_ScheduleReminder_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { 132 | ctx, cancel := context.WithCancel(req.Context()) 133 | defer cancel() 134 | inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) 135 | rctx, err := runtime.AnnotateContext(ctx, mux, req) 136 | if err != nil { 137 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) 138 | return 139 | } 140 | resp, md, err := request_ReminderService_ScheduleReminder_0(rctx, inboundMarshaler, client, req, pathParams) 141 | ctx = runtime.NewServerMetadataContext(ctx, md) 142 | if err != nil { 143 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) 144 | return 145 | } 146 | 147 | forward_ReminderService_ScheduleReminder_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) 148 | 149 | }) 150 | 151 | return nil 152 | } 153 | 154 | var ( 155 | pattern_ReminderService_ScheduleReminder_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "reminder", "schedule"}, "", runtime.AssumeColonVerbOpt(true))) 156 | ) 157 | 158 | var ( 159 | forward_ReminderService_ScheduleReminder_0 = runtime.ForwardResponseMessage 160 | ) 161 | -------------------------------------------------------------------------------- /blog1/proto/reminder/v1/reminder.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // source: reminder.proto 3 | 4 | package reminder 5 | 6 | import ( 7 | context "context" 8 | fmt "fmt" 9 | proto "github.com/golang/protobuf/proto" 10 | timestamp "github.com/golang/protobuf/ptypes/timestamp" 11 | grpc "google.golang.org/grpc" 12 | codes "google.golang.org/grpc/codes" 13 | status "google.golang.org/grpc/status" 14 | math "math" 15 | ) 16 | 17 | // Reference imports to suppress errors if they are not otherwise used. 18 | var _ = proto.Marshal 19 | var _ = fmt.Errorf 20 | var _ = math.Inf 21 | 22 | // This is a compile-time assertion to ensure that this generated file 23 | // is compatible with the proto package it is being compiled against. 24 | // A compilation error at this line likely means your copy of the 25 | // proto package needs to be updated. 26 | const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package 27 | 28 | type ScheduleReminderRequest struct { 29 | When *timestamp.Timestamp `protobuf:"bytes,1,opt,name=when,proto3" json:"when,omitempty"` 30 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 31 | XXX_unrecognized []byte `json:"-"` 32 | XXX_sizecache int32 `json:"-"` 33 | } 34 | 35 | func (m *ScheduleReminderRequest) Reset() { *m = ScheduleReminderRequest{} } 36 | func (m *ScheduleReminderRequest) String() string { return proto.CompactTextString(m) } 37 | func (*ScheduleReminderRequest) ProtoMessage() {} 38 | func (*ScheduleReminderRequest) Descriptor() ([]byte, []int) { 39 | return fileDescriptor_165470c8955d7e69, []int{0} 40 | } 41 | 42 | func (m *ScheduleReminderRequest) XXX_Unmarshal(b []byte) error { 43 | return xxx_messageInfo_ScheduleReminderRequest.Unmarshal(m, b) 44 | } 45 | func (m *ScheduleReminderRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 46 | return xxx_messageInfo_ScheduleReminderRequest.Marshal(b, m, deterministic) 47 | } 48 | func (m *ScheduleReminderRequest) XXX_Merge(src proto.Message) { 49 | xxx_messageInfo_ScheduleReminderRequest.Merge(m, src) 50 | } 51 | func (m *ScheduleReminderRequest) XXX_Size() int { 52 | return xxx_messageInfo_ScheduleReminderRequest.Size(m) 53 | } 54 | func (m *ScheduleReminderRequest) XXX_DiscardUnknown() { 55 | xxx_messageInfo_ScheduleReminderRequest.DiscardUnknown(m) 56 | } 57 | 58 | var xxx_messageInfo_ScheduleReminderRequest proto.InternalMessageInfo 59 | 60 | func (m *ScheduleReminderRequest) GetWhen() *timestamp.Timestamp { 61 | if m != nil { 62 | return m.When 63 | } 64 | return nil 65 | } 66 | 67 | type ScheduleReminderResponse struct { 68 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` 69 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 70 | XXX_unrecognized []byte `json:"-"` 71 | XXX_sizecache int32 `json:"-"` 72 | } 73 | 74 | func (m *ScheduleReminderResponse) Reset() { *m = ScheduleReminderResponse{} } 75 | func (m *ScheduleReminderResponse) String() string { return proto.CompactTextString(m) } 76 | func (*ScheduleReminderResponse) ProtoMessage() {} 77 | func (*ScheduleReminderResponse) Descriptor() ([]byte, []int) { 78 | return fileDescriptor_165470c8955d7e69, []int{1} 79 | } 80 | 81 | func (m *ScheduleReminderResponse) XXX_Unmarshal(b []byte) error { 82 | return xxx_messageInfo_ScheduleReminderResponse.Unmarshal(m, b) 83 | } 84 | func (m *ScheduleReminderResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 85 | return xxx_messageInfo_ScheduleReminderResponse.Marshal(b, m, deterministic) 86 | } 87 | func (m *ScheduleReminderResponse) XXX_Merge(src proto.Message) { 88 | xxx_messageInfo_ScheduleReminderResponse.Merge(m, src) 89 | } 90 | func (m *ScheduleReminderResponse) XXX_Size() int { 91 | return xxx_messageInfo_ScheduleReminderResponse.Size(m) 92 | } 93 | func (m *ScheduleReminderResponse) XXX_DiscardUnknown() { 94 | xxx_messageInfo_ScheduleReminderResponse.DiscardUnknown(m) 95 | } 96 | 97 | var xxx_messageInfo_ScheduleReminderResponse proto.InternalMessageInfo 98 | 99 | func (m *ScheduleReminderResponse) GetId() string { 100 | if m != nil { 101 | return m.Id 102 | } 103 | return "" 104 | } 105 | 106 | func init() { 107 | proto.RegisterType((*ScheduleReminderRequest)(nil), "demo.reminder.v1.ScheduleReminderRequest") 108 | proto.RegisterType((*ScheduleReminderResponse)(nil), "demo.reminder.v1.ScheduleReminderResponse") 109 | } 110 | 111 | func init() { proto.RegisterFile("reminder.proto", fileDescriptor_165470c8955d7e69) } 112 | 113 | var fileDescriptor_165470c8955d7e69 = []byte{ 114 | // 201 bytes of a gzipped FileDescriptorProto 115 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2b, 0x4a, 0xcd, 0xcd, 116 | 0xcc, 0x4b, 0x49, 0x2d, 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x48, 0x49, 0xcd, 0xcd, 117 | 0xd7, 0x83, 0x0b, 0x96, 0x19, 0x4a, 0xc9, 0xa7, 0xe7, 0xe7, 0xa7, 0xe7, 0xa4, 0xea, 0x83, 0xe5, 118 | 0x93, 0x4a, 0xd3, 0xf4, 0x4b, 0x32, 0x73, 0x53, 0x8b, 0x4b, 0x12, 0x73, 0x0b, 0x20, 0x5a, 0x94, 119 | 0x3c, 0xb9, 0xc4, 0x83, 0x93, 0x33, 0x52, 0x53, 0x4a, 0x73, 0x52, 0x83, 0xa0, 0xfa, 0x82, 0x52, 120 | 0x0b, 0x4b, 0x53, 0x8b, 0x4b, 0x84, 0xf4, 0xb8, 0x58, 0xca, 0x33, 0x52, 0xf3, 0x24, 0x18, 0x15, 121 | 0x18, 0x35, 0xb8, 0x8d, 0xa4, 0xf4, 0x20, 0x46, 0xe9, 0xc1, 0x8c, 0xd2, 0x0b, 0x81, 0x19, 0x15, 122 | 0x04, 0x56, 0xa7, 0xa4, 0xc5, 0x25, 0x81, 0x69, 0x54, 0x71, 0x41, 0x7e, 0x5e, 0x71, 0xaa, 0x10, 123 | 0x1f, 0x17, 0x53, 0x66, 0x0a, 0xd8, 0x24, 0xce, 0x20, 0xa6, 0xcc, 0x14, 0xa3, 0x3a, 0x2e, 0x7e, 124 | 0x98, 0x9a, 0xe0, 0xd4, 0xa2, 0xb2, 0xcc, 0xe4, 0x54, 0xa1, 0x6c, 0x2e, 0x01, 0x74, 0xed, 0x42, 125 | 0x9a, 0x7a, 0xe8, 0x3e, 0xd2, 0xc3, 0xe1, 0x5a, 0x29, 0x2d, 0x62, 0x94, 0x42, 0x5c, 0xa3, 0xc4, 126 | 0xe0, 0xc4, 0x15, 0xc5, 0x01, 0x53, 0x99, 0xc4, 0x06, 0xf6, 0x91, 0x31, 0x20, 0x00, 0x00, 0xff, 127 | 0xff, 0xeb, 0xdb, 0x38, 0xe3, 0x4e, 0x01, 0x00, 0x00, 128 | } 129 | 130 | // Reference imports to suppress errors if they are not otherwise used. 131 | var _ context.Context 132 | var _ grpc.ClientConn 133 | 134 | // This is a compile-time assertion to ensure that this generated file 135 | // is compatible with the grpc package it is being compiled against. 136 | const _ = grpc.SupportPackageIsVersion4 137 | 138 | // ReminderServiceClient is the client API for ReminderService service. 139 | // 140 | // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. 141 | type ReminderServiceClient interface { 142 | ScheduleReminder(ctx context.Context, in *ScheduleReminderRequest, opts ...grpc.CallOption) (*ScheduleReminderResponse, error) 143 | } 144 | 145 | type reminderServiceClient struct { 146 | cc *grpc.ClientConn 147 | } 148 | 149 | func NewReminderServiceClient(cc *grpc.ClientConn) ReminderServiceClient { 150 | return &reminderServiceClient{cc} 151 | } 152 | 153 | func (c *reminderServiceClient) ScheduleReminder(ctx context.Context, in *ScheduleReminderRequest, opts ...grpc.CallOption) (*ScheduleReminderResponse, error) { 154 | out := new(ScheduleReminderResponse) 155 | err := c.cc.Invoke(ctx, "/demo.reminder.v1.ReminderService/ScheduleReminder", in, out, opts...) 156 | if err != nil { 157 | return nil, err 158 | } 159 | return out, nil 160 | } 161 | 162 | // ReminderServiceServer is the server API for ReminderService service. 163 | type ReminderServiceServer interface { 164 | ScheduleReminder(context.Context, *ScheduleReminderRequest) (*ScheduleReminderResponse, error) 165 | } 166 | 167 | // UnimplementedReminderServiceServer can be embedded to have forward compatible implementations. 168 | type UnimplementedReminderServiceServer struct { 169 | } 170 | 171 | func (*UnimplementedReminderServiceServer) ScheduleReminder(ctx context.Context, req *ScheduleReminderRequest) (*ScheduleReminderResponse, error) { 172 | return nil, status.Errorf(codes.Unimplemented, "method ScheduleReminder not implemented") 173 | } 174 | 175 | func RegisterReminderServiceServer(s *grpc.Server, srv ReminderServiceServer) { 176 | s.RegisterService(&_ReminderService_serviceDesc, srv) 177 | } 178 | 179 | func _ReminderService_ScheduleReminder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 180 | in := new(ScheduleReminderRequest) 181 | if err := dec(in); err != nil { 182 | return nil, err 183 | } 184 | if interceptor == nil { 185 | return srv.(ReminderServiceServer).ScheduleReminder(ctx, in) 186 | } 187 | info := &grpc.UnaryServerInfo{ 188 | Server: srv, 189 | FullMethod: "/demo.reminder.v1.ReminderService/ScheduleReminder", 190 | } 191 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 192 | return srv.(ReminderServiceServer).ScheduleReminder(ctx, req.(*ScheduleReminderRequest)) 193 | } 194 | return interceptor(ctx, in, info, handler) 195 | } 196 | 197 | var _ReminderService_serviceDesc = grpc.ServiceDesc{ 198 | ServiceName: "demo.reminder.v1.ReminderService", 199 | HandlerType: (*ReminderServiceServer)(nil), 200 | Methods: []grpc.MethodDesc{ 201 | { 202 | MethodName: "ScheduleReminder", 203 | Handler: _ReminderService_ScheduleReminder_Handler, 204 | }, 205 | }, 206 | Streams: []grpc.StreamDesc{}, 207 | Metadata: "reminder.proto", 208 | } 209 | -------------------------------------------------------------------------------- /blog2/proto/reminder/v1/reminder.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // source: reminder.proto 3 | 4 | package reminder 5 | 6 | import ( 7 | context "context" 8 | fmt "fmt" 9 | proto "github.com/golang/protobuf/proto" 10 | timestamp "github.com/golang/protobuf/ptypes/timestamp" 11 | grpc "google.golang.org/grpc" 12 | codes "google.golang.org/grpc/codes" 13 | status "google.golang.org/grpc/status" 14 | math "math" 15 | ) 16 | 17 | // Reference imports to suppress errors if they are not otherwise used. 18 | var _ = proto.Marshal 19 | var _ = fmt.Errorf 20 | var _ = math.Inf 21 | 22 | // This is a compile-time assertion to ensure that this generated file 23 | // is compatible with the proto package it is being compiled against. 24 | // A compilation error at this line likely means your copy of the 25 | // proto package needs to be updated. 26 | const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package 27 | 28 | type ScheduleReminderRequest struct { 29 | When *timestamp.Timestamp `protobuf:"bytes,1,opt,name=when,proto3" json:"when,omitempty"` 30 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 31 | XXX_unrecognized []byte `json:"-"` 32 | XXX_sizecache int32 `json:"-"` 33 | } 34 | 35 | func (m *ScheduleReminderRequest) Reset() { *m = ScheduleReminderRequest{} } 36 | func (m *ScheduleReminderRequest) String() string { return proto.CompactTextString(m) } 37 | func (*ScheduleReminderRequest) ProtoMessage() {} 38 | func (*ScheduleReminderRequest) Descriptor() ([]byte, []int) { 39 | return fileDescriptor_165470c8955d7e69, []int{0} 40 | } 41 | 42 | func (m *ScheduleReminderRequest) XXX_Unmarshal(b []byte) error { 43 | return xxx_messageInfo_ScheduleReminderRequest.Unmarshal(m, b) 44 | } 45 | func (m *ScheduleReminderRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 46 | return xxx_messageInfo_ScheduleReminderRequest.Marshal(b, m, deterministic) 47 | } 48 | func (m *ScheduleReminderRequest) XXX_Merge(src proto.Message) { 49 | xxx_messageInfo_ScheduleReminderRequest.Merge(m, src) 50 | } 51 | func (m *ScheduleReminderRequest) XXX_Size() int { 52 | return xxx_messageInfo_ScheduleReminderRequest.Size(m) 53 | } 54 | func (m *ScheduleReminderRequest) XXX_DiscardUnknown() { 55 | xxx_messageInfo_ScheduleReminderRequest.DiscardUnknown(m) 56 | } 57 | 58 | var xxx_messageInfo_ScheduleReminderRequest proto.InternalMessageInfo 59 | 60 | func (m *ScheduleReminderRequest) GetWhen() *timestamp.Timestamp { 61 | if m != nil { 62 | return m.When 63 | } 64 | return nil 65 | } 66 | 67 | type ScheduleReminderResponse struct { 68 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` 69 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 70 | XXX_unrecognized []byte `json:"-"` 71 | XXX_sizecache int32 `json:"-"` 72 | } 73 | 74 | func (m *ScheduleReminderResponse) Reset() { *m = ScheduleReminderResponse{} } 75 | func (m *ScheduleReminderResponse) String() string { return proto.CompactTextString(m) } 76 | func (*ScheduleReminderResponse) ProtoMessage() {} 77 | func (*ScheduleReminderResponse) Descriptor() ([]byte, []int) { 78 | return fileDescriptor_165470c8955d7e69, []int{1} 79 | } 80 | 81 | func (m *ScheduleReminderResponse) XXX_Unmarshal(b []byte) error { 82 | return xxx_messageInfo_ScheduleReminderResponse.Unmarshal(m, b) 83 | } 84 | func (m *ScheduleReminderResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 85 | return xxx_messageInfo_ScheduleReminderResponse.Marshal(b, m, deterministic) 86 | } 87 | func (m *ScheduleReminderResponse) XXX_Merge(src proto.Message) { 88 | xxx_messageInfo_ScheduleReminderResponse.Merge(m, src) 89 | } 90 | func (m *ScheduleReminderResponse) XXX_Size() int { 91 | return xxx_messageInfo_ScheduleReminderResponse.Size(m) 92 | } 93 | func (m *ScheduleReminderResponse) XXX_DiscardUnknown() { 94 | xxx_messageInfo_ScheduleReminderResponse.DiscardUnknown(m) 95 | } 96 | 97 | var xxx_messageInfo_ScheduleReminderResponse proto.InternalMessageInfo 98 | 99 | func (m *ScheduleReminderResponse) GetId() string { 100 | if m != nil { 101 | return m.Id 102 | } 103 | return "" 104 | } 105 | 106 | func init() { 107 | proto.RegisterType((*ScheduleReminderRequest)(nil), "demo.reminder.v1.ScheduleReminderRequest") 108 | proto.RegisterType((*ScheduleReminderResponse)(nil), "demo.reminder.v1.ScheduleReminderResponse") 109 | } 110 | 111 | func init() { proto.RegisterFile("reminder.proto", fileDescriptor_165470c8955d7e69) } 112 | 113 | var fileDescriptor_165470c8955d7e69 = []byte{ 114 | // 201 bytes of a gzipped FileDescriptorProto 115 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2b, 0x4a, 0xcd, 0xcd, 116 | 0xcc, 0x4b, 0x49, 0x2d, 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x48, 0x49, 0xcd, 0xcd, 117 | 0xd7, 0x83, 0x0b, 0x96, 0x19, 0x4a, 0xc9, 0xa7, 0xe7, 0xe7, 0xa7, 0xe7, 0xa4, 0xea, 0x83, 0xe5, 118 | 0x93, 0x4a, 0xd3, 0xf4, 0x4b, 0x32, 0x73, 0x53, 0x8b, 0x4b, 0x12, 0x73, 0x0b, 0x20, 0x5a, 0x94, 119 | 0x3c, 0xb9, 0xc4, 0x83, 0x93, 0x33, 0x52, 0x53, 0x4a, 0x73, 0x52, 0x83, 0xa0, 0xfa, 0x82, 0x52, 120 | 0x0b, 0x4b, 0x53, 0x8b, 0x4b, 0x84, 0xf4, 0xb8, 0x58, 0xca, 0x33, 0x52, 0xf3, 0x24, 0x18, 0x15, 121 | 0x18, 0x35, 0xb8, 0x8d, 0xa4, 0xf4, 0x20, 0x46, 0xe9, 0xc1, 0x8c, 0xd2, 0x0b, 0x81, 0x19, 0x15, 122 | 0x04, 0x56, 0xa7, 0xa4, 0xc5, 0x25, 0x81, 0x69, 0x54, 0x71, 0x41, 0x7e, 0x5e, 0x71, 0xaa, 0x10, 123 | 0x1f, 0x17, 0x53, 0x66, 0x0a, 0xd8, 0x24, 0xce, 0x20, 0xa6, 0xcc, 0x14, 0xa3, 0x3a, 0x2e, 0x7e, 124 | 0x98, 0x9a, 0xe0, 0xd4, 0xa2, 0xb2, 0xcc, 0xe4, 0x54, 0xa1, 0x6c, 0x2e, 0x01, 0x74, 0xed, 0x42, 125 | 0x9a, 0x7a, 0xe8, 0x3e, 0xd2, 0xc3, 0xe1, 0x5a, 0x29, 0x2d, 0x62, 0x94, 0x42, 0x5c, 0xa3, 0xc4, 126 | 0xe0, 0xc4, 0x15, 0xc5, 0x01, 0x53, 0x99, 0xc4, 0x06, 0xf6, 0x91, 0x31, 0x20, 0x00, 0x00, 0xff, 127 | 0xff, 0xeb, 0xdb, 0x38, 0xe3, 0x4e, 0x01, 0x00, 0x00, 128 | } 129 | 130 | // Reference imports to suppress errors if they are not otherwise used. 131 | var _ context.Context 132 | var _ grpc.ClientConn 133 | 134 | // This is a compile-time assertion to ensure that this generated file 135 | // is compatible with the grpc package it is being compiled against. 136 | const _ = grpc.SupportPackageIsVersion4 137 | 138 | // ReminderServiceClient is the client API for ReminderService service. 139 | // 140 | // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. 141 | type ReminderServiceClient interface { 142 | ScheduleReminder(ctx context.Context, in *ScheduleReminderRequest, opts ...grpc.CallOption) (*ScheduleReminderResponse, error) 143 | } 144 | 145 | type reminderServiceClient struct { 146 | cc *grpc.ClientConn 147 | } 148 | 149 | func NewReminderServiceClient(cc *grpc.ClientConn) ReminderServiceClient { 150 | return &reminderServiceClient{cc} 151 | } 152 | 153 | func (c *reminderServiceClient) ScheduleReminder(ctx context.Context, in *ScheduleReminderRequest, opts ...grpc.CallOption) (*ScheduleReminderResponse, error) { 154 | out := new(ScheduleReminderResponse) 155 | err := c.cc.Invoke(ctx, "/demo.reminder.v1.ReminderService/ScheduleReminder", in, out, opts...) 156 | if err != nil { 157 | return nil, err 158 | } 159 | return out, nil 160 | } 161 | 162 | // ReminderServiceServer is the server API for ReminderService service. 163 | type ReminderServiceServer interface { 164 | ScheduleReminder(context.Context, *ScheduleReminderRequest) (*ScheduleReminderResponse, error) 165 | } 166 | 167 | // UnimplementedReminderServiceServer can be embedded to have forward compatible implementations. 168 | type UnimplementedReminderServiceServer struct { 169 | } 170 | 171 | func (*UnimplementedReminderServiceServer) ScheduleReminder(ctx context.Context, req *ScheduleReminderRequest) (*ScheduleReminderResponse, error) { 172 | return nil, status.Errorf(codes.Unimplemented, "method ScheduleReminder not implemented") 173 | } 174 | 175 | func RegisterReminderServiceServer(s *grpc.Server, srv ReminderServiceServer) { 176 | s.RegisterService(&_ReminderService_serviceDesc, srv) 177 | } 178 | 179 | func _ReminderService_ScheduleReminder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 180 | in := new(ScheduleReminderRequest) 181 | if err := dec(in); err != nil { 182 | return nil, err 183 | } 184 | if interceptor == nil { 185 | return srv.(ReminderServiceServer).ScheduleReminder(ctx, in) 186 | } 187 | info := &grpc.UnaryServerInfo{ 188 | Server: srv, 189 | FullMethod: "/demo.reminder.v1.ReminderService/ScheduleReminder", 190 | } 191 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 192 | return srv.(ReminderServiceServer).ScheduleReminder(ctx, req.(*ScheduleReminderRequest)) 193 | } 194 | return interceptor(ctx, in, info, handler) 195 | } 196 | 197 | var _ReminderService_serviceDesc = grpc.ServiceDesc{ 198 | ServiceName: "demo.reminder.v1.ReminderService", 199 | HandlerType: (*ReminderServiceServer)(nil), 200 | Methods: []grpc.MethodDesc{ 201 | { 202 | MethodName: "ScheduleReminder", 203 | Handler: _ReminderService_ScheduleReminder_Handler, 204 | }, 205 | }, 206 | Streams: []grpc.StreamDesc{}, 207 | Metadata: "reminder.proto", 208 | } 209 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 3 | github.com/arkadyb/go-proto-validators v0.3.0 h1:ElkZLyZ6521oxI9WpWlmNyctdtZtC3/uoZwYvA0fvMQ= 4 | github.com/arkadyb/go-proto-validators v0.3.0/go.mod h1:dk1iQN7O8LuN0aRAijssB4wMln0D9pkac60dkbDiLeE= 5 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 6 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 7 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 8 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 9 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 10 | github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= 11 | github.com/gogo/protobuf v1.3.0 h1:G8O7TerXerS4F6sx9OV7/nRfJdnXgHZu/S/7F2SN+UE= 12 | github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= 13 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= 14 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 15 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 16 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 17 | github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= 18 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 19 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 20 | github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= 21 | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 22 | github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= 23 | github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= 24 | github.com/grpc-ecosystem/grpc-gateway v1.11.3 h1:h8+NsYENhxNTuq+dobk3+ODoJtwY4Fu0WQXsxJfL8aM= 25 | github.com/grpc-ecosystem/grpc-gateway v1.11.3/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= 26 | github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= 27 | github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 28 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 29 | github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= 30 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 31 | github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= 32 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 33 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 34 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= 35 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 36 | github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 37 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 38 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 39 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 40 | github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 41 | github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= 42 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 43 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 44 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 45 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 46 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 47 | github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= 48 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 49 | go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= 50 | go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= 51 | go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 52 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 53 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 54 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 55 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 56 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 57 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 58 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 59 | golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 60 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 61 | golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= 62 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 63 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 64 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 65 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 66 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 67 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 68 | golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 69 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 70 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= 71 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 72 | golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= 73 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 74 | golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 75 | golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 76 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 77 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 78 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 79 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 80 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 81 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 82 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 83 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 84 | google.golang.org/genproto v0.0.0-20191007204434-a023cd5227bd h1:84VQPzup3IpKLxuIAZjHMhVjJ8fZ4/i3yUnj3k6fUdw= 85 | google.golang.org/genproto v0.0.0-20191007204434-a023cd5227bd/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 86 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 87 | google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= 88 | google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= 89 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 90 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= 91 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 92 | gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 93 | gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 94 | gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= 95 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 96 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 97 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 98 | -------------------------------------------------------------------------------- /blog3/proto/reminder/v1/reminder.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // source: reminder.proto 3 | 4 | package reminder 5 | 6 | import ( 7 | context "context" 8 | fmt "fmt" 9 | math "math" 10 | 11 | proto "github.com/golang/protobuf/proto" 12 | timestamp "github.com/golang/protobuf/ptypes/timestamp" 13 | _ "google.golang.org/genproto/googleapis/api/annotations" 14 | grpc "google.golang.org/grpc" 15 | codes "google.golang.org/grpc/codes" 16 | status "google.golang.org/grpc/status" 17 | ) 18 | 19 | // Reference imports to suppress errors if they are not otherwise used. 20 | var _ = proto.Marshal 21 | var _ = fmt.Errorf 22 | var _ = math.Inf 23 | 24 | // This is a compile-time assertion to ensure that this generated file 25 | // is compatible with the proto package it is being compiled against. 26 | // A compilation error at this line likely means your copy of the 27 | // proto package needs to be updated. 28 | const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package 29 | 30 | type ScheduleReminderRequest struct { 31 | When *timestamp.Timestamp `protobuf:"bytes,1,opt,name=when,proto3" json:"when,omitempty"` 32 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 33 | XXX_unrecognized []byte `json:"-"` 34 | XXX_sizecache int32 `json:"-"` 35 | } 36 | 37 | func (m *ScheduleReminderRequest) Reset() { *m = ScheduleReminderRequest{} } 38 | func (m *ScheduleReminderRequest) String() string { return proto.CompactTextString(m) } 39 | func (*ScheduleReminderRequest) ProtoMessage() {} 40 | func (*ScheduleReminderRequest) Descriptor() ([]byte, []int) { 41 | return fileDescriptor_165470c8955d7e69, []int{0} 42 | } 43 | 44 | func (m *ScheduleReminderRequest) XXX_Unmarshal(b []byte) error { 45 | return xxx_messageInfo_ScheduleReminderRequest.Unmarshal(m, b) 46 | } 47 | func (m *ScheduleReminderRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 48 | return xxx_messageInfo_ScheduleReminderRequest.Marshal(b, m, deterministic) 49 | } 50 | func (m *ScheduleReminderRequest) XXX_Merge(src proto.Message) { 51 | xxx_messageInfo_ScheduleReminderRequest.Merge(m, src) 52 | } 53 | func (m *ScheduleReminderRequest) XXX_Size() int { 54 | return xxx_messageInfo_ScheduleReminderRequest.Size(m) 55 | } 56 | func (m *ScheduleReminderRequest) XXX_DiscardUnknown() { 57 | xxx_messageInfo_ScheduleReminderRequest.DiscardUnknown(m) 58 | } 59 | 60 | var xxx_messageInfo_ScheduleReminderRequest proto.InternalMessageInfo 61 | 62 | func (m *ScheduleReminderRequest) GetWhen() *timestamp.Timestamp { 63 | if m != nil { 64 | return m.When 65 | } 66 | return nil 67 | } 68 | 69 | type ScheduleReminderResponse struct { 70 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` 71 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 72 | XXX_unrecognized []byte `json:"-"` 73 | XXX_sizecache int32 `json:"-"` 74 | } 75 | 76 | func (m *ScheduleReminderResponse) Reset() { *m = ScheduleReminderResponse{} } 77 | func (m *ScheduleReminderResponse) String() string { return proto.CompactTextString(m) } 78 | func (*ScheduleReminderResponse) ProtoMessage() {} 79 | func (*ScheduleReminderResponse) Descriptor() ([]byte, []int) { 80 | return fileDescriptor_165470c8955d7e69, []int{1} 81 | } 82 | 83 | func (m *ScheduleReminderResponse) XXX_Unmarshal(b []byte) error { 84 | return xxx_messageInfo_ScheduleReminderResponse.Unmarshal(m, b) 85 | } 86 | func (m *ScheduleReminderResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 87 | return xxx_messageInfo_ScheduleReminderResponse.Marshal(b, m, deterministic) 88 | } 89 | func (m *ScheduleReminderResponse) XXX_Merge(src proto.Message) { 90 | xxx_messageInfo_ScheduleReminderResponse.Merge(m, src) 91 | } 92 | func (m *ScheduleReminderResponse) XXX_Size() int { 93 | return xxx_messageInfo_ScheduleReminderResponse.Size(m) 94 | } 95 | func (m *ScheduleReminderResponse) XXX_DiscardUnknown() { 96 | xxx_messageInfo_ScheduleReminderResponse.DiscardUnknown(m) 97 | } 98 | 99 | var xxx_messageInfo_ScheduleReminderResponse proto.InternalMessageInfo 100 | 101 | func (m *ScheduleReminderResponse) GetId() string { 102 | if m != nil { 103 | return m.Id 104 | } 105 | return "" 106 | } 107 | 108 | func init() { 109 | proto.RegisterType((*ScheduleReminderRequest)(nil), "demo.reminder.v1.ScheduleReminderRequest") 110 | proto.RegisterType((*ScheduleReminderResponse)(nil), "demo.reminder.v1.ScheduleReminderResponse") 111 | } 112 | 113 | func init() { proto.RegisterFile("reminder.proto", fileDescriptor_165470c8955d7e69) } 114 | 115 | var fileDescriptor_165470c8955d7e69 = []byte{ 116 | // 246 bytes of a gzipped FileDescriptorProto 117 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2b, 0x4a, 0xcd, 0xcd, 118 | 0xcc, 0x4b, 0x49, 0x2d, 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x48, 0x49, 0xcd, 0xcd, 119 | 0xd7, 0x83, 0x0b, 0x96, 0x19, 0x4a, 0xc9, 0xa7, 0xe7, 0xe7, 0xa7, 0xe7, 0xa4, 0xea, 0x83, 0xe5, 120 | 0x93, 0x4a, 0xd3, 0xf4, 0x4b, 0x32, 0x73, 0x53, 0x8b, 0x4b, 0x12, 0x73, 0x0b, 0x20, 0x5a, 0xa4, 121 | 0x64, 0xa0, 0x0a, 0x12, 0x0b, 0x32, 0xf5, 0x13, 0xf3, 0xf2, 0xf2, 0x4b, 0x12, 0x4b, 0x32, 0xf3, 122 | 0xf3, 0x8a, 0x21, 0xb2, 0x4a, 0x9e, 0x5c, 0xe2, 0xc1, 0xc9, 0x19, 0xa9, 0x29, 0xa5, 0x39, 0xa9, 123 | 0x41, 0x50, 0x53, 0x83, 0x52, 0x0b, 0x4b, 0x53, 0x8b, 0x4b, 0x84, 0xf4, 0xb8, 0x58, 0xca, 0x33, 124 | 0x52, 0xf3, 0x24, 0x18, 0x15, 0x18, 0x35, 0xb8, 0x8d, 0xa4, 0xf4, 0x20, 0xe6, 0xe8, 0xc1, 0x2c, 125 | 0xd2, 0x0b, 0x81, 0x59, 0x14, 0x04, 0x56, 0xa7, 0xa4, 0xc5, 0x25, 0x81, 0x69, 0x54, 0x71, 0x41, 126 | 0x7e, 0x5e, 0x71, 0xaa, 0x10, 0x1f, 0x17, 0x53, 0x66, 0x0a, 0xd8, 0x24, 0xce, 0x20, 0xa6, 0xcc, 127 | 0x14, 0xa3, 0xf9, 0x8c, 0x5c, 0xfc, 0x30, 0x45, 0xc1, 0xa9, 0x45, 0x65, 0x99, 0xc9, 0xa9, 0x42, 128 | 0xdd, 0x8c, 0x5c, 0x02, 0xe8, 0x06, 0x08, 0x69, 0xea, 0xa1, 0xfb, 0x58, 0x0f, 0x87, 0x7b, 0xa5, 129 | 0xb4, 0x88, 0x51, 0x0a, 0x71, 0x8f, 0x92, 0x42, 0xd3, 0xe5, 0x27, 0x93, 0x99, 0xa4, 0xa4, 0x44, 130 | 0xf5, 0xcb, 0x0c, 0xf5, 0x61, 0x3a, 0xf4, 0x8b, 0xa1, 0xca, 0xad, 0x18, 0xb5, 0x9c, 0xb8, 0xa2, 131 | 0x38, 0x60, 0xe2, 0x49, 0x6c, 0x60, 0x3f, 0x1b, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xec, 0xab, 132 | 0xbd, 0x0f, 0x8e, 0x01, 0x00, 0x00, 133 | } 134 | 135 | // Reference imports to suppress errors if they are not otherwise used. 136 | var _ context.Context 137 | var _ grpc.ClientConn 138 | 139 | // This is a compile-time assertion to ensure that this generated file 140 | // is compatible with the grpc package it is being compiled against. 141 | const _ = grpc.SupportPackageIsVersion4 142 | 143 | // ReminderServiceClient is the client API for ReminderService service. 144 | // 145 | // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. 146 | type ReminderServiceClient interface { 147 | ScheduleReminder(ctx context.Context, in *ScheduleReminderRequest, opts ...grpc.CallOption) (*ScheduleReminderResponse, error) 148 | } 149 | 150 | type reminderServiceClient struct { 151 | cc *grpc.ClientConn 152 | } 153 | 154 | func NewReminderServiceClient(cc *grpc.ClientConn) ReminderServiceClient { 155 | return &reminderServiceClient{cc} 156 | } 157 | 158 | func (c *reminderServiceClient) ScheduleReminder(ctx context.Context, in *ScheduleReminderRequest, opts ...grpc.CallOption) (*ScheduleReminderResponse, error) { 159 | out := new(ScheduleReminderResponse) 160 | err := c.cc.Invoke(ctx, "/demo.reminder.v1.ReminderService/ScheduleReminder", in, out, opts...) 161 | if err != nil { 162 | return nil, err 163 | } 164 | return out, nil 165 | } 166 | 167 | // ReminderServiceServer is the server API for ReminderService service. 168 | type ReminderServiceServer interface { 169 | ScheduleReminder(context.Context, *ScheduleReminderRequest) (*ScheduleReminderResponse, error) 170 | } 171 | 172 | // UnimplementedReminderServiceServer can be embedded to have forward compatible implementations. 173 | type UnimplementedReminderServiceServer struct { 174 | } 175 | 176 | func (*UnimplementedReminderServiceServer) ScheduleReminder(ctx context.Context, req *ScheduleReminderRequest) (*ScheduleReminderResponse, error) { 177 | return nil, status.Errorf(codes.Unimplemented, "method ScheduleReminder not implemented") 178 | } 179 | 180 | func RegisterReminderServiceServer(s *grpc.Server, srv ReminderServiceServer) { 181 | s.RegisterService(&_ReminderService_serviceDesc, srv) 182 | } 183 | 184 | func _ReminderService_ScheduleReminder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 185 | in := new(ScheduleReminderRequest) 186 | if err := dec(in); err != nil { 187 | return nil, err 188 | } 189 | if interceptor == nil { 190 | return srv.(ReminderServiceServer).ScheduleReminder(ctx, in) 191 | } 192 | info := &grpc.UnaryServerInfo{ 193 | Server: srv, 194 | FullMethod: "/demo.reminder.v1.ReminderService/ScheduleReminder", 195 | } 196 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 197 | return srv.(ReminderServiceServer).ScheduleReminder(ctx, req.(*ScheduleReminderRequest)) 198 | } 199 | return interceptor(ctx, in, info, handler) 200 | } 201 | 202 | var _ReminderService_serviceDesc = grpc.ServiceDesc{ 203 | ServiceName: "demo.reminder.v1.ReminderService", 204 | HandlerType: (*ReminderServiceServer)(nil), 205 | Methods: []grpc.MethodDesc{ 206 | { 207 | MethodName: "ScheduleReminder", 208 | Handler: _ReminderService_ScheduleReminder_Handler, 209 | }, 210 | }, 211 | Streams: []grpc.StreamDesc{}, 212 | Metadata: "reminder.proto", 213 | } 214 | -------------------------------------------------------------------------------- /blog4/proto/reminder/v1/reminder.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // source: reminder.proto 3 | 4 | package reminder 5 | 6 | import ( 7 | context "context" 8 | fmt "fmt" 9 | _ "github.com/arkadyb/go-proto-validators" 10 | proto "github.com/golang/protobuf/proto" 11 | timestamp "github.com/golang/protobuf/ptypes/timestamp" 12 | _ "google.golang.org/genproto/googleapis/api/annotations" 13 | grpc "google.golang.org/grpc" 14 | codes "google.golang.org/grpc/codes" 15 | status "google.golang.org/grpc/status" 16 | math "math" 17 | ) 18 | 19 | // Reference imports to suppress errors if they are not otherwise used. 20 | var _ = proto.Marshal 21 | var _ = fmt.Errorf 22 | var _ = math.Inf 23 | 24 | // This is a compile-time assertion to ensure that this generated file 25 | // is compatible with the proto package it is being compiled against. 26 | // A compilation error at this line likely means your copy of the 27 | // proto package needs to be updated. 28 | const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package 29 | 30 | type ScheduleReminderRequest struct { 31 | When *timestamp.Timestamp `protobuf:"bytes,1,opt,name=when,proto3" json:"when,omitempty"` 32 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 33 | XXX_unrecognized []byte `json:"-"` 34 | XXX_sizecache int32 `json:"-"` 35 | } 36 | 37 | func (m *ScheduleReminderRequest) Reset() { *m = ScheduleReminderRequest{} } 38 | func (m *ScheduleReminderRequest) String() string { return proto.CompactTextString(m) } 39 | func (*ScheduleReminderRequest) ProtoMessage() {} 40 | func (*ScheduleReminderRequest) Descriptor() ([]byte, []int) { 41 | return fileDescriptor_165470c8955d7e69, []int{0} 42 | } 43 | 44 | func (m *ScheduleReminderRequest) XXX_Unmarshal(b []byte) error { 45 | return xxx_messageInfo_ScheduleReminderRequest.Unmarshal(m, b) 46 | } 47 | func (m *ScheduleReminderRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 48 | return xxx_messageInfo_ScheduleReminderRequest.Marshal(b, m, deterministic) 49 | } 50 | func (m *ScheduleReminderRequest) XXX_Merge(src proto.Message) { 51 | xxx_messageInfo_ScheduleReminderRequest.Merge(m, src) 52 | } 53 | func (m *ScheduleReminderRequest) XXX_Size() int { 54 | return xxx_messageInfo_ScheduleReminderRequest.Size(m) 55 | } 56 | func (m *ScheduleReminderRequest) XXX_DiscardUnknown() { 57 | xxx_messageInfo_ScheduleReminderRequest.DiscardUnknown(m) 58 | } 59 | 60 | var xxx_messageInfo_ScheduleReminderRequest proto.InternalMessageInfo 61 | 62 | func (m *ScheduleReminderRequest) GetWhen() *timestamp.Timestamp { 63 | if m != nil { 64 | return m.When 65 | } 66 | return nil 67 | } 68 | 69 | type ScheduleReminderResponse struct { 70 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` 71 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 72 | XXX_unrecognized []byte `json:"-"` 73 | XXX_sizecache int32 `json:"-"` 74 | } 75 | 76 | func (m *ScheduleReminderResponse) Reset() { *m = ScheduleReminderResponse{} } 77 | func (m *ScheduleReminderResponse) String() string { return proto.CompactTextString(m) } 78 | func (*ScheduleReminderResponse) ProtoMessage() {} 79 | func (*ScheduleReminderResponse) Descriptor() ([]byte, []int) { 80 | return fileDescriptor_165470c8955d7e69, []int{1} 81 | } 82 | 83 | func (m *ScheduleReminderResponse) XXX_Unmarshal(b []byte) error { 84 | return xxx_messageInfo_ScheduleReminderResponse.Unmarshal(m, b) 85 | } 86 | func (m *ScheduleReminderResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 87 | return xxx_messageInfo_ScheduleReminderResponse.Marshal(b, m, deterministic) 88 | } 89 | func (m *ScheduleReminderResponse) XXX_Merge(src proto.Message) { 90 | xxx_messageInfo_ScheduleReminderResponse.Merge(m, src) 91 | } 92 | func (m *ScheduleReminderResponse) XXX_Size() int { 93 | return xxx_messageInfo_ScheduleReminderResponse.Size(m) 94 | } 95 | func (m *ScheduleReminderResponse) XXX_DiscardUnknown() { 96 | xxx_messageInfo_ScheduleReminderResponse.DiscardUnknown(m) 97 | } 98 | 99 | var xxx_messageInfo_ScheduleReminderResponse proto.InternalMessageInfo 100 | 101 | func (m *ScheduleReminderResponse) GetId() string { 102 | if m != nil { 103 | return m.Id 104 | } 105 | return "" 106 | } 107 | 108 | func init() { 109 | proto.RegisterType((*ScheduleReminderRequest)(nil), "demo.reminder.v1.ScheduleReminderRequest") 110 | proto.RegisterType((*ScheduleReminderResponse)(nil), "demo.reminder.v1.ScheduleReminderResponse") 111 | } 112 | 113 | func init() { proto.RegisterFile("reminder.proto", fileDescriptor_165470c8955d7e69) } 114 | 115 | var fileDescriptor_165470c8955d7e69 = []byte{ 116 | // 292 bytes of a gzipped FileDescriptorProto 117 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x90, 0x4d, 0x4b, 0xfb, 0x30, 118 | 0x1c, 0xc7, 0xc9, 0xfe, 0x7f, 0x7c, 0x88, 0x30, 0x47, 0x41, 0x1c, 0x41, 0xd8, 0xd8, 0x49, 0x0b, 119 | 0x4b, 0xd8, 0x04, 0x05, 0x8f, 0x7b, 0x09, 0x9d, 0x27, 0x6f, 0x69, 0xf3, 0xb3, 0x0d, 0xb6, 0xf9, 120 | 0xd5, 0x24, 0xad, 0x78, 0xf5, 0xea, 0xd1, 0x8b, 0x37, 0x5f, 0x94, 0x2f, 0x40, 0x10, 0x5f, 0x88, 121 | 0xd0, 0x87, 0x1d, 0x26, 0x82, 0xb7, 0xf0, 0x7d, 0xca, 0x27, 0xa1, 0x43, 0x0b, 0x85, 0x36, 0x0a, 122 | 0x2c, 0x2f, 0x2d, 0x7a, 0x0c, 0x46, 0x0a, 0x0a, 0xe4, 0x1b, 0xb1, 0x5e, 0xb0, 0x49, 0x8a, 0x98, 123 | 0xe6, 0x20, 0x1a, 0x3f, 0xae, 0x6e, 0x85, 0xd7, 0x05, 0x38, 0x2f, 0x8b, 0xb2, 0xad, 0xb0, 0x93, 124 | 0x2e, 0x20, 0x4b, 0x2d, 0xa4, 0x31, 0xe8, 0xa5, 0xd7, 0x68, 0x5c, 0xe7, 0x5e, 0xa4, 0xda, 0x67, 125 | 0x55, 0xcc, 0x13, 0x2c, 0x84, 0xb4, 0x77, 0x52, 0x3d, 0xc6, 0x22, 0xc5, 0x79, 0x63, 0xce, 0x6b, 126 | 0x99, 0x6b, 0x25, 0x3d, 0x5a, 0x27, 0x36, 0xc7, 0xb6, 0x37, 0x8b, 0xe8, 0xf1, 0x3a, 0xc9, 0x40, 127 | 0x55, 0x39, 0x44, 0x1d, 0x4d, 0x04, 0xf7, 0x15, 0x38, 0x1f, 0x5c, 0xd2, 0xff, 0x0f, 0x19, 0x98, 128 | 0x31, 0x99, 0x92, 0xd3, 0x83, 0x25, 0xe3, 0xed, 0xfd, 0xbc, 0x07, 0xe4, 0xd7, 0x3d, 0xe0, 0x6a, 129 | 0xf7, 0xf3, 0x63, 0xf2, 0xef, 0x95, 0x90, 0xa8, 0x29, 0xcc, 0x42, 0x3a, 0xfe, 0xb9, 0xe9, 0x4a, 130 | 0x34, 0x0e, 0x82, 0x21, 0x1d, 0x68, 0xd5, 0x4c, 0xee, 0x47, 0x03, 0xad, 0x96, 0x6f, 0x84, 0x1e, 131 | 0xf6, 0xa1, 0x35, 0xd8, 0x5a, 0x27, 0x10, 0x3c, 0x13, 0x3a, 0xda, 0x1e, 0x08, 0xce, 0xf8, 0xf6, 132 | 0x97, 0xf1, 0x5f, 0xc0, 0x59, 0xf8, 0x97, 0x68, 0xcb, 0x33, 0x9b, 0x3e, 0xbd, 0x7f, 0xbd, 0x0c, 133 | 0x18, 0x3b, 0x12, 0xf5, 0x42, 0xf4, 0x0d, 0xe1, 0xba, 0xf8, 0x15, 0x09, 0x57, 0xf4, 0x66, 0xaf, 134 | 0xd7, 0xe3, 0x9d, 0xe6, 0xf1, 0xe7, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xa2, 0xfc, 0xab, 135 | 0xcf, 0x01, 0x00, 0x00, 136 | } 137 | 138 | // Reference imports to suppress errors if they are not otherwise used. 139 | var _ context.Context 140 | var _ grpc.ClientConn 141 | 142 | // This is a compile-time assertion to ensure that this generated file 143 | // is compatible with the grpc package it is being compiled against. 144 | const _ = grpc.SupportPackageIsVersion4 145 | 146 | // ReminderServiceClient is the client API for ReminderService service. 147 | // 148 | // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. 149 | type ReminderServiceClient interface { 150 | ScheduleReminder(ctx context.Context, in *ScheduleReminderRequest, opts ...grpc.CallOption) (*ScheduleReminderResponse, error) 151 | } 152 | 153 | type reminderServiceClient struct { 154 | cc *grpc.ClientConn 155 | } 156 | 157 | func NewReminderServiceClient(cc *grpc.ClientConn) ReminderServiceClient { 158 | return &reminderServiceClient{cc} 159 | } 160 | 161 | func (c *reminderServiceClient) ScheduleReminder(ctx context.Context, in *ScheduleReminderRequest, opts ...grpc.CallOption) (*ScheduleReminderResponse, error) { 162 | out := new(ScheduleReminderResponse) 163 | err := c.cc.Invoke(ctx, "/demo.reminder.v1.ReminderService/ScheduleReminder", in, out, opts...) 164 | if err != nil { 165 | return nil, err 166 | } 167 | return out, nil 168 | } 169 | 170 | // ReminderServiceServer is the server API for ReminderService service. 171 | type ReminderServiceServer interface { 172 | ScheduleReminder(context.Context, *ScheduleReminderRequest) (*ScheduleReminderResponse, error) 173 | } 174 | 175 | // UnimplementedReminderServiceServer can be embedded to have forward compatible implementations. 176 | type UnimplementedReminderServiceServer struct { 177 | } 178 | 179 | func (*UnimplementedReminderServiceServer) ScheduleReminder(ctx context.Context, req *ScheduleReminderRequest) (*ScheduleReminderResponse, error) { 180 | return nil, status.Errorf(codes.Unimplemented, "method ScheduleReminder not implemented") 181 | } 182 | 183 | func RegisterReminderServiceServer(s *grpc.Server, srv ReminderServiceServer) { 184 | s.RegisterService(&_ReminderService_serviceDesc, srv) 185 | } 186 | 187 | func _ReminderService_ScheduleReminder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 188 | in := new(ScheduleReminderRequest) 189 | if err := dec(in); err != nil { 190 | return nil, err 191 | } 192 | if interceptor == nil { 193 | return srv.(ReminderServiceServer).ScheduleReminder(ctx, in) 194 | } 195 | info := &grpc.UnaryServerInfo{ 196 | Server: srv, 197 | FullMethod: "/demo.reminder.v1.ReminderService/ScheduleReminder", 198 | } 199 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 200 | return srv.(ReminderServiceServer).ScheduleReminder(ctx, req.(*ScheduleReminderRequest)) 201 | } 202 | return interceptor(ctx, in, info, handler) 203 | } 204 | 205 | var _ReminderService_serviceDesc = grpc.ServiceDesc{ 206 | ServiceName: "demo.reminder.v1.ReminderService", 207 | HandlerType: (*ReminderServiceServer)(nil), 208 | Methods: []grpc.MethodDesc{ 209 | { 210 | MethodName: "ScheduleReminder", 211 | Handler: _ReminderService_ScheduleReminder_Handler, 212 | }, 213 | }, 214 | Streams: []grpc.StreamDesc{}, 215 | Metadata: "reminder.proto", 216 | } 217 | --------------------------------------------------------------------------------