function dataStore(objectContext, cipherBundle, stream, size,
    streamingV4Params, backendInfo, log, cb) {
    const cbOnce = jsutil.once(cb);
    const dataStreamTmp = prepareStream(stream, streamingV4Params, log, cbOnce);
    if (!dataStreamTmp) {
        return process.nextTick(() => cb(errors.InvalidArgument));
    }
    const dataStream = stripTrailingChecksumStream(dataStreamTmp, log, cbOnce);
    return data.put(
        cipherBundle, dataStream, size, objectContext, backendInfo, log,
        (err, dataRetrievalInfo, hashedStream) => {
            if (err) {
                log.error('error in datastore', {
                    error: err,
                });
                return cbOnce(err);
            }
            if (!dataRetrievalInfo) {
                log.fatal('data put returned neither an error nor a key', {
                    method: 'storeObject::dataStore',
                });
                return cbOnce(errors.InternalError);
            }
            log.trace('dataStore: backend stored key', {
                dataRetrievalInfo,
            });
            return checkHashMatchMD5(stream, hashedStream,
                                     dataRetrievalInfo, log, cbOnce);
        });
}
Stores object and responds back with key and storage type
@param {object} objectContext - object's keyContext for sproxyd Key
computation (put API)
@param {object} cipherBundle - cipher bundle that encrypt the data
@param {object} stream - the stream containing the data
@param {number} size - data size in the stream
@param {object | null } streamingV4Params - if v4 auth, object containing
accessKey, signatureFromRequest, region, scopeDate, timestamp, and
credentialScope (to be used for streaming v4 auth if applicable)
@param {BackendInfo} backendInfo - info to determine which data
backend to use
@param {RequestLogger} log - the current stream logger
@param {function} cb - callback containing result for the next task
@return {undefined}