Source: service/download-service.js

const Service = require('./service');
const HttpRequestBuilder = require('../http/http-request-builder');
const ServiceRequest = require('./service-request');
const PATH_STATEMENTS = require('./service-paths').PATH_STATEMENTS;

const LoggingUtils = require('../logging/logging-utils');
const TermConverter = require('../model/term-converter');

/**
 * Service for downloading data via {@link GetStatementsPayload}.
 *
 * @author Mihail Radkov
 * @author Svilen Velikov
 */
class DownloadService extends Service {
  /**
   * Fetch rdf data from statements endpoint using provided parameters.
   *
   * The request is configured so that expected response should be a readable
   * stream.
   *
   * Provided request params will be automatically converted to N-Triples if
   * they are not already encoded as such.
   *
   * @param {GetStatementsPayload} payload is an object holding request params
   *
   * @return {ServiceRequest} a service request that will resolve to a readable
   * stream to which the client can subscribe and consume the emitted strings
   * depending on the provided response type as soon as they are available.
   */
  download(payload) {
    const requestBuilder = HttpRequestBuilder.httpGet(PATH_STATEMENTS)
      .addAcceptHeader(payload.getResponseType())
      .setResponseType('stream')
      .setParams({
        subj: TermConverter.toNTripleValue(payload.getSubject()),
        pred: TermConverter.toNTripleValue(payload.getPredicate()),
        obj: TermConverter.toNTripleValue(payload.getObject()),
        context: TermConverter.toNTripleValues(payload.getContext()),
        infer: payload.getInference()
      });

    return new ServiceRequest(requestBuilder, () => {
      return this.httpRequestExecutor(requestBuilder).then((response) => {
        this.logger.debug(LoggingUtils.getLogPayload(response,
          requestBuilder.getParams()), 'Downloaded data');
        return response.getData();
      });
    });
  }

  /**
   * @inheritDoc
   */
  getServiceName() {
    return 'DownloadService';
  }
}

module.exports = DownloadService;