All Downloads are FREE. Search and download functionalities are using the official Maven repository.

dom-shared.src.poll.js Maven / Gradle / Ivy

const chunkify = require('./chunkify');

const STATUSES = {
  WIP: 'WIP',
  SUCCESS: 'SUCCESS',
  SUCCESS_CHUNKED: 'SUCCESS_CHUNKED',
  ERROR: 'ERROR',
};
const _DEFAULT_CHUNK_BYTE_LENGTH = 268435456; // 256MB

function createPollResponse(state, {chunkByteLength = 0} = {}) {
  if (!state) {
    return {
      status: STATUSES.ERROR,
      error: 'unexpected poll request received - cannot find state of current operation',
    };
  } else if (state.value) {
    if (chunkByteLength) {
      if (!state.chunks) {
        const stringified = JSON.stringify(state.value);
        state.chunks = chunkify(stringified, chunkByteLength);
        if (state.chunks.length > 0) {
          state.from = 0;
          state.value = stringified;
        }
      }
      if (state.from >= 0) {
        return {
          status: STATUSES.SUCCESS_CHUNKED,
          value: state.value.substring(state.from, (state.from = state.chunks.shift())),
          done: !state.from,
        };
      }
    }
    return {status: STATUSES.SUCCESS, value: state.value};
  } else if (state.error) {
    return {status: STATUSES.ERROR, error: state.error};
  } else {
    return {status: STATUSES.WIP};
  }
}

function poll(context, key, options = {}) {
  context = context || {};
  const result = createPollResponse(context[key], options);

  if (
    result.status === STATUSES.SUCCESS ||
    result.status === STATUSES.ERROR ||
    (result.status === STATUSES.SUCCESS_CHUNKED && result.done)
  ) {
    context[key] = null;
  }

  return result;
}

module.exports = poll;




© 2015 - 2025 Weber Informatics LLC | Privacy Policy