Javascript arrow funtions with a function as parameter

I am trying to understand this arrow function declaration but I can’t. Someone can explain what is getFooOfImpl in this funtion and why there’s several async declarations? Thank you

const getFooOfId = (getFooOfIdImpl = async (fooId) => { throw new Error(`Can't retrieved foo of id ${fooId} : missing implementation`) }) => async fooId => {
 try {
    const fooData = await getFooOfIdImpl(fooId);
    return FooData(fooData);
  } catch (err) {
    throw new Error(`Unable to retrieve Foo with id ${fooId}`);
  }
}