func doInitExtensions()

in lambda/rapid/start.go [116:165]


func doInitExtensions(execCtx *rapidContext, watchdog *core.Watchdog) error {
	agentPaths := agents.ListExternalAgentPaths(defaultAgentLocation)
	initFlow := execCtx.registrationService.InitFlow()

	// we don't bring it into the loop below because we don't want unnecessary broadcasts on agent gate
	if err := initFlow.SetExternalAgentsRegisterCount(uint16(len(agentPaths))); err != nil {
		return err
	}

	for _, agentPath := range agentPaths {
		env := execCtx.environment.AgentExecEnv()

		agentStdoutWriter, agentStderrWriter, err := execCtx.logsEgressAPI.GetExtensionSockets()

		if err != nil {
			return err
		}

		// Compose debug log writer with all log sinks. Debug log writer w
		// will not write logs when disabled by invoke parameter
		agentStdoutWriter = io.MultiWriter(execCtx.debugTailLogger, agentStdoutWriter)
		agentStderrWriter = io.MultiWriter(execCtx.debugTailLogger, agentStderrWriter)

		agentProc := agents.NewExternalAgentProcess(agentPath, env, agentStdoutWriter, agentStderrWriter)

		agent, err := execCtx.registrationService.CreateExternalAgent(agentProc.Name())

		if err != nil {
			return err
		}

		if execCtx.registrationService.CountAgents() > core.MaxAgentsAllowed {
			agentLaunchError(agent, execCtx.appCtx, core.ErrTooManyExtensions)
			return core.ErrTooManyExtensions
		}

		if err := agentProc.Start(); err != nil {
			agentLaunchError(agent, execCtx.appCtx, err)
			return err
		}

		agent.Pid = watchdog.GoWait(&agentProc, fatalerror.AgentCrash)
	}

	if err := initFlow.AwaitExternalAgentsRegistered(); err != nil {
		return err
	}

	return nil
}