code: func Handle(ds storage.DeviceSession, rxPacket models.RXPacket, phy lorawan.PHYPayload) error {
  	ctx := joinContext{
  		DeviceSession: ds,
  		PHYPayload:    phy,
  		RXPacket:      rxPacket,
  	}
  
  	for _, t := range tasks {
  		if err := t(&ctx); err != nil {
  			return err
  		}
  	}
  
  	return nil
  }
docs: // Handle handles a downlink join-response.