feat: implement client-side streaming file upload example and document it in GRPC.md

This commit is contained in:
2026-07-17 18:10:53 +09:00
parent 558f17eeed
commit fe913d7870
6 changed files with 367 additions and 43 deletions
@@ -1,7 +1,7 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.6.2
// - protoc v3.21.12
// - protoc v5.27.2
// source: protoapi.proto
package protoapi
@@ -22,6 +22,7 @@ const (
IoTService_GetDate_FullMethodName = "/IoTService/GetDate"
IoTService_UpdateSensingData_FullMethodName = "/IoTService/UpdateSensingData"
IoTService_GetRandomPass_FullMethodName = "/IoTService/GetRandomPass"
IoTService_UploadFile_FullMethodName = "/IoTService/UploadFile"
)
// IoTServiceClient is the client API for IoTService service.
@@ -31,6 +32,7 @@ type IoTServiceClient interface {
GetDate(ctx context.Context, in *RequestDateTime, opts ...grpc.CallOption) (*DateTime, error)
UpdateSensingData(ctx context.Context, in *SensingData, opts ...grpc.CallOption) (*SensingResponse, error)
GetRandomPass(ctx context.Context, in *RequestPass, opts ...grpc.CallOption) (*RandomPass, error)
UploadFile(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[FileChunk, UploadStatus], error)
}
type ioTServiceClient struct {
@@ -71,6 +73,19 @@ func (c *ioTServiceClient) GetRandomPass(ctx context.Context, in *RequestPass, o
return out, nil
}
func (c *ioTServiceClient) UploadFile(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[FileChunk, UploadStatus], error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
stream, err := c.cc.NewStream(ctx, &IoTService_ServiceDesc.Streams[0], IoTService_UploadFile_FullMethodName, cOpts...)
if err != nil {
return nil, err
}
x := &grpc.GenericClientStream[FileChunk, UploadStatus]{ClientStream: stream}
return x, nil
}
// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.
type IoTService_UploadFileClient = grpc.ClientStreamingClient[FileChunk, UploadStatus]
// IoTServiceServer is the server API for IoTService service.
// All implementations must embed UnimplementedIoTServiceServer
// for forward compatibility.
@@ -78,6 +93,7 @@ type IoTServiceServer interface {
GetDate(context.Context, *RequestDateTime) (*DateTime, error)
UpdateSensingData(context.Context, *SensingData) (*SensingResponse, error)
GetRandomPass(context.Context, *RequestPass) (*RandomPass, error)
UploadFile(grpc.ClientStreamingServer[FileChunk, UploadStatus]) error
mustEmbedUnimplementedIoTServiceServer()
}
@@ -97,6 +113,9 @@ func (UnimplementedIoTServiceServer) UpdateSensingData(context.Context, *Sensing
func (UnimplementedIoTServiceServer) GetRandomPass(context.Context, *RequestPass) (*RandomPass, error) {
return nil, status.Error(codes.Unimplemented, "method GetRandomPass not implemented")
}
func (UnimplementedIoTServiceServer) UploadFile(grpc.ClientStreamingServer[FileChunk, UploadStatus]) error {
return status.Error(codes.Unimplemented, "method UploadFile not implemented")
}
func (UnimplementedIoTServiceServer) mustEmbedUnimplementedIoTServiceServer() {}
func (UnimplementedIoTServiceServer) testEmbeddedByValue() {}
@@ -172,6 +191,13 @@ func _IoTService_GetRandomPass_Handler(srv interface{}, ctx context.Context, dec
return interceptor(ctx, in, info, handler)
}
func _IoTService_UploadFile_Handler(srv interface{}, stream grpc.ServerStream) error {
return srv.(IoTServiceServer).UploadFile(&grpc.GenericServerStream[FileChunk, UploadStatus]{ServerStream: stream})
}
// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.
type IoTService_UploadFileServer = grpc.ClientStreamingServer[FileChunk, UploadStatus]
// IoTService_ServiceDesc is the grpc.ServiceDesc for IoTService service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
@@ -192,6 +218,12 @@ var IoTService_ServiceDesc = grpc.ServiceDesc{
Handler: _IoTService_GetRandomPass_Handler,
},
},
Streams: []grpc.StreamDesc{},
Streams: []grpc.StreamDesc{
{
StreamName: "UploadFile",
Handler: _IoTService_UploadFile_Handler,
ClientStreams: true,
},
},
Metadata: "protoapi.proto",
}