perform = (type, task, ...[init]) => async (context) => {
  const ipfs = context.getIpfs()
  if (ipfs == null) {
    throw Error('IPFS node was not found')
  } else {
    const perform = Task.perform(
      type,
      /**
       * @param {Context} context
       */
      context => task(ipfs, context),
      init
    )
    return await perform(context)
  }
}
Specialized version of `Task.perform` which will only perform a task if
`context.getIpfs()` returns an `IPFSService` passing it into the task as a
first argument. Otherwise it fails without dispatching any actions.

@template {string} Type - Type of the task which, correponds to `.type` of
dispatched actions.
@template Success - Return type of the task, which will correspond to
`.job.result.value` of dispatched action on succefully completed task.
@template Init - Initial data
@template State - Type of the `context.getState()` for this task.
@template {BundlerContext<State, Perform<Type, Error, Success, Init>, Ext, Extra>} Context

@param {Type} type - Type of the actions this will dispatch.
@param {(service:IPFSService, context:Context) => Promise<Success>} task
@param {Init[]} rest
@returns {(context:Context) => Promise<Success>}