(init *proto.InitRequest, requests <-chan *proto.Request)
| 208 | } |
| 209 | |
| 210 | func (s *Session) handleInitRequest(init *proto.InitRequest, requests <-chan *proto.Request) (*proto.InitComplete, error) { |
| 211 | req := &InitRequest{ |
| 212 | InitRequest: init, |
| 213 | ModuleArchive: nil, |
| 214 | } |
| 215 | if len(init.GetInitialModuleTarHash()) > 0 { |
| 216 | file, err := HandleReceivingDataUpload(&fromChannel{requests: requests}) |
| 217 | if err != nil { |
| 218 | return nil, err |
| 219 | } |
| 220 | |
| 221 | data, err := file.Complete() |
| 222 | if err != nil { |
| 223 | return nil, err |
| 224 | } |
| 225 | req.ModuleArchive = data |
| 226 | } |
| 227 | |
| 228 | r := &request[*InitRequest, *proto.InitComplete]{ |
| 229 | req: req, |
| 230 | session: s, |
| 231 | serverFn: s.server.Init, |
| 232 | cancels: requests, |
| 233 | } |
| 234 | complete, err := r.do() |
| 235 | if err != nil { |
| 236 | return nil, err |
| 237 | } |
| 238 | if complete.Error != "" { |
| 239 | return complete, nil |
| 240 | } |
| 241 | |
| 242 | // If the size of the complete message is too large, we need to stream the module files separately. |
| 243 | if protobuf.Size(&proto.Response{Type: &proto.Response_Init{Init: complete}}) > drpcsdk.MaxMessageSize { |
| 244 | // It is likely the modules that is pushing the message size over the limit. |
| 245 | // Send the modules over a stream of messages instead. |
| 246 | s.Logger.Info(s.Context(), "plan response too large, sending modules as stream", |
| 247 | slog.F("size_bytes", len(complete.ModuleFiles)), |
| 248 | ) |
| 249 | dataUp, chunks, err := proto.BytesToDataUpload(proto.DataUploadType_UPLOAD_TYPE_MODULE_FILES, complete.ModuleFiles) |
| 250 | if err != nil { |
| 251 | complete.Error = fmt.Sprintf("prepare module files upload: %s", err.Error()) |
| 252 | } else { |
| 253 | complete.ModuleFiles = nil // sent over the stream |
| 254 | complete.ModuleFilesHash = dataUp.DataHash |
| 255 | |
| 256 | err := s.stream.Send(&proto.Response{Type: &proto.Response_DataUpload{DataUpload: dataUp}}) |
| 257 | if err != nil { |
| 258 | complete.Error = fmt.Sprintf("send data upload: %s", err.Error()) |
| 259 | } else { |
| 260 | for i, chunk := range chunks { |
| 261 | err := s.stream.Send(&proto.Response{Type: &proto.Response_ChunkPiece{ChunkPiece: chunk}}) |
| 262 | if err != nil { |
| 263 | complete.Error = fmt.Sprintf("send data piece upload %d/%d: %s", i, dataUp.Chunks, err.Error()) |
| 264 | break |
| 265 | } |
| 266 | } |
| 267 | } |
no test coverage detected