MCPcopy Index your code
hub / github.com/coder/coder / handleInitRequest

Method handleInitRequest

provisionersdk/session.go:210–274  ·  view source on GitHub ↗
(init *proto.InitRequest, requests <-chan *proto.Request)

Source from the content-addressed store, hash-verified

208}
209
210func (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 }

Callers 1

handleRequestsMethod · 0.95

Calls 10

ContextMethod · 0.95
BytesToDataUploadFunction · 0.92
SizeMethod · 0.80
SendMethod · 0.65
CompleteMethod · 0.45
doMethod · 0.45
InfoMethod · 0.45
ErrorMethod · 0.45

Tested by

no test coverage detected