OverviewFilesCommitsIssuesDocsReleasesPeers

keet-deobfuscated / @holepunchto / keet-store / store / member / member-subscription.js

95 lines · javascript ref:
import { createAction as e } from "@reduxjs/toolkit"
import { put as r } from "redux-saga/effects"
import { forkChildren as m, block as t } from "../lib"
import { taskErrorSaga as o } from "../error"
import { subscribeMemberProfileSaga as s } from "./member.saga"
export const memberSubscribeCmd = e("member/subscribe-cmd")
export const memberUnsubscribeCmd = e("member/unsubscribe-cmd")
export const memberStartSubsCmd = e("member/start-subs-cmd")
export const memberSubscribeIdsCmd = e("member/subscribe-ids-cmd")
const d = 50
export const createMemberSubscriptionMiddleware =
  (e = 50) =>
  ({ dispatch: r }) => {
    const m = new Map(),
      t = (e) => {
        let r = m.get(e)
        return (
          r || ((r = { timer: 0, updateAt: 0, roomId: e, counter: new Map() }), m.set(e, r)),
          r
        )
      },
      o = (m) => {
        if (((m.updateAt = Date.now() + e), m.timer)) return
        const t = () => {
          const e = m.updateAt - Date.now()
          if (e > 0) return void (m.timer = setTimeout(t, e))
          m.timer = null
          const { counter: o, roomId: s } = m,
            d = Array.from(o.keys())
          r(memberSubscribeIdsCmd({ roomId: s, memberIds: d }))
        }
        t()
      },
      s = (e, r) => {
        const { counter: m } = e,
          t = m.get(r)
        t ? m.set(r, t + 1) : (m.set(r, 1), o(e))
      },
      d = (e, r) => {
        const { counter: m } = e,
          t = m.get(r)
        t && (t > 1 ? m.set(r, t - 1) : (m.delete(r), o(e)))
      }
    return (e) => (m) => {
      if (memberSubscribeCmd.match(m))
        return (
          (({ roomId: e, memberIds: r, memberId: m }) => {
            if (!e) return
            const o = t(e)
            m && s(o, m)
            const d = r?.length
            for (let e = 0; e < d; e += 1) {
              const m = r[e]
              m && s(o, m)
            }
          })(m.payload),
          m
        )
      if (memberUnsubscribeCmd.match(m))
        return (
          (({ roomId: e, memberIds: r, memberId: m }) => {
            if (!e) return
            const o = t(e)
            m && d(o, m)
            const s = r?.length
            for (let e = 0; e < s; e += 1) {
              const m = r[e]
              m && d(o, m)
            }
          })(m.payload),
          m
        )
      if (memberStartSubsCmd.match(m)) {
        const { roomId: e } = m.payload
        if (e) {
          const { counter: m } = t(e),
            o = Array.from(m.keys())
          o.length > 0 && r(memberSubscribeIdsCmd({ roomId: e, memberIds: o }))
        }
        return m
      }
      return e(m)
    }
  }
export function* memberAllSubscriptionSaga({ roomId: e }) {
  ;(yield* m(
    (r) => memberSubscribeIdsCmd.match(r) && r.payload.roomId === e,
    (e) => e.payload.memberIds,
    ({ taskId: r }) => s({ roomId: e, memberId: r }),
    (e) => o("memberSubscriptionSaga", e),
  ),
    yield r(memberStartSubsCmd({ roomId: e })),
    yield t())
}