OverviewFilesCommitsIssuesDocsReleasesPeers

keet-deobfuscated / @holepunchto / keet-store / store / chat / message / message-query.js

104 lines · javascript ref:
import {
  QUERY_CHANGE_THRESHOLD as t,
  QUERY_UP_MESSAGE_THRESHOLD as e,
  QUERY_DOWN_MESSAGE_THRESHOLD as r,
  SUBSCRIBE_MESSAGE_THRESHOLD as n,
  QUERY_FIRST_LOAD_COUNT as o,
} from "../chat.constant"
export const isSeqInQuery = (t, e) => !(t < 0) && e.lte >= t && e.gte <= t
export const isQueryValid = (t) => {
  if (!t) return !1
  const { gte: e, lte: r } = t
  if (void 0 !== e && (!Number.isInteger(e) || e < 0)) return !1
  if (void 0 !== r && (!Number.isInteger(r) || r < 0)) return !1
  if (void 0 !== e && void 0 !== r) {
    if (e > r) return !1
    if (e < 0 || r < 0) return !1
  }
  return !0
}
export const hasQueryIntersection = (t, e) => t.gte <= e.lte && e.gte <= t.lte
export const getQueryCount = (t) =>
  isQueryValid(t) && Number.isInteger(t.gte) && Number.isInteger(t.lte) ? t.lte - t.gte + 1 : 0
export function isQueryChanged(e, r, n = {}) {
  if (!e || !r || !isQueryValid(r)) return !1
  const { gte: o, lte: l } = e,
    u =
      Number.isInteger(o) && Number.isInteger(r.gte)
        ? Math.abs(o - r.gte) > (n?.gte ?? t)
        : o !== r.gte,
    s =
      Number.isInteger(l) && Number.isInteger(r.lte)
        ? Math.abs(l - r.lte) > (n?.lte ?? t)
        : l !== r.lte
  return u || s
}
export const createFirstQuery = ({ count: t }) => ({
  gte: Math.max(0, t - 1 - o),
  lte: Math.max(0, t - 1),
})
export const createFirstMiddleQuery = ({ count: t, bottomSeq: e }) => ({
  gte: Math.max(0, e - o),
  lte: Math.min(e, t - 1),
})
export const createRawQuery = ({ count: t, top: e, bottom: r }) => ({
  gte: Math.max(0, e),
  lte: Math.min(r, t - 1),
})
export const createFetchQuery = ({ gte: t, lte: n }, o) => ({
  gte: Math.max(0, t - e),
  lte: Math.min(n + r, o - 1),
})
export const createSubscribeQuery = ({ gte: t, lte: e }, r) => ({
  gte: Math.max(0, t - n),
  lte: Math.min(e + n, r - 1),
})
export const joinTwoQueryOrNull = (t, e) =>
  t.lte >= e.gte - 1 && e.lte >= t.gte - 1
    ? { gte: Math.min(t.gte, e.gte), lte: Math.max(t.lte, e.lte) }
    : null
export const joinQueries = (t) => {
  const e = [...t],
    { length: r } = e
  for (let t = r - 1; t > 0; t -= 1) {
    const r = e[t]
    for (let n = t - 1; n >= 0; n -= 1) {
      const o = e[n],
        l = joinTwoQueryOrNull(r, o)
      if (l) {
        ;((e[n] = l), (e[t] = null))
        break
      }
    }
  }
  return e.filter((t) => t)
}
export const limitQueries = (t, e, r) => {
  const n = []
  for (const o of t)
    if (o.lte >= e && o.gte <= r) {
      const t = Math.max(o.gte, e),
        l = Math.min(o.lte, r)
      n.push(t === o.gte && l === o.lte ? o : { gte: t, lte: l })
    }
  return n
}
export const substractQuery = (t, e) => {
  let r = t.gte,
    n = t.lte
  return (
    r >= e.gte && r <= e.lte && (r = e.lte + 1),
    n <= e.lte && n >= e.gte && (n = e.gte - 1),
    r > n ? null : r === t.gte && n === t.lte ? t : { gte: r, lte: n }
  )
}
export const substractQueries = (t, e) => {
  let r = t,
    n = r
  do {
    n = r
    for (const t of e) if (((r = substractQuery(r, t)), !r)) return null
  } while (n !== r)
  return r
}