OverviewFilesCommitsIssuesDocsReleasesPeers

keet-deobfuscated / @holepunchto / keet-store / store / room / joint / room-pairing.saga.js

132 lines · javascript ref:
import { select as o, put as e, take as i, getContext as t } from "redux-saga/effects"
import { ERRORS as r } from "@holepunchto/keet-core/legacy-constants"
import { apiSubscribeSaga as n } from "../../lib"
import { getCoreBackend as a } from "../../../backend"
import { apiCall as s } from "../../../api/core"
import { PLATFORM_CONTEXT_KEY as d } from "../../constants"
import {
  taskErrorSaga as m,
  pairInvalidInviteError as c,
  GENERIC_PAIRING_ERROR as l,
} from "../../error"
import {
  parseInvitation as p,
  removeInvitationQueryParams as I,
  createInvitationLink as y,
} from "../../identity"
import { NOTIFICATION_CODE as f, userCustomNotification as g } from "../../notification"
import { getRoomListDiscoveryIds as u } from "../list/room-list.reducer"
import { createInvitationMessageId as P, getInvitationMessageId as v } from "./invitation"
import { switchRoomSubmit as E } from "../room.action"
import { getRoomIsFirstRoom as A } from "../room.selector"
import {
  clearPairingRoom as b,
  getRoomPairingIdActive as L,
  setRoomInvitation as N,
  setPairingRoom as R,
  setRoomPairError as T,
  setRoomPairingActive as h,
  getRoomPairingMessageId as k,
  getRoomAllPairing as S,
} from "./room-joint.reducer"
import {
  PAIRING_STATUS as C,
  createAskedPairing as x,
  getRoomPairingItems as O,
  parsePendingRoomResponse as _,
} from "./room-joint.model"
import { ROOM_INVITE_CONFIG_DEFAULT as w } from "../room.constant"
export function* createInvitationSaga(
  { appProtocol: o },
  { payload: { roomId: i, invitationPreview: t, messageId: n, isPublic: d = !1, opts: c = w } },
) {
  try {
    const r = a(),
      m = yield s(r.createInvitation, i, c)
    let l
    ;((l = y({ invitation: m, isPublic: d, appProtocol: o })),
      n && (l = P({ invitationLink: l, messageId: n })),
      yield e(N({ invitationLink: l, invitationPreview: t })))
  } catch (o) {
    o.code === r.AUTOBASE_IS_NOT_WRITEABLE
      ? yield e(g({ code: f.INVITATION_AUTOBASE_WRITABLE_ERROR }))
      : yield m("createInvitationSaga", o)
  }
}
export function* roomInvitationHandler({ link: o, skipParse: i = !1, setActive: n = !1 }) {
  const y = a()
  let f = !1
  try {
    const {
      config: { recognizedAppProtocolList: r },
    } = yield t(d)
    let a = i ? o : p(o, r)
    if (!a) return f
    f = !0
    const m = v(o)
    i && m && (a = I(a))
    const { seedId: c, key: l } = yield s(y.startPairingRoom, a)
    if (l) yield e(E({ roomId: l, messageId: m }))
    else {
      if (!c) throw new Error("room pairing failed: no seedId")
      ;(yield e(R(x({ seedId: c, messageId: m }))), n && (yield e(h({ seedId: c }))))
    }
  } catch (o) {
    ;(yield m("roomInvitationHandler", o, { logWarn: !0 }),
      o.code === r.INVALID_INVITATION_TYPE
        ? yield e(c())
        : yield e(T(o.code && o.message ? o.message : l)))
  }
  return f
}
export function* roomPairingCancelSaga({ payload: o }) {
  const i = a()
  try {
    ;(yield s(i.stopPairingRoom, o), yield e(R({ seedId: o, status: C.CANCELLED })))
  } catch (o) {
    yield m("roomPairingCancelSaga", o)
  }
}
export function* roomsPairingDataSaga({ pendingRoomChannel: e }) {
  yield n(
    [a().subscribePendingRooms],
    function* (i) {
      const t = yield o(u),
        r = yield o(S),
        n = O(r, i, t),
        a = Object.values(n).flat()
      for (const o of a) e.put(o)
    },
    { onError: (o) => m("subscribePendingRooms", o) },
  )
}
export function* roomPairingSaga({ pendingRoomChannel: t }) {
  try {
    for (;;) {
      const r = yield i(t),
        n = _(r)
      switch (r.status) {
        case C.NEW:
          yield e(R(n))
          break
        case C.CANCELLED:
          yield e(b({ seedId: n.seedId, status: n.status, setNextActive: !0 }))
          break
        case C.COMPLETED: {
          const i = yield o(L),
            t = i && n.roomId && i === n.seedId,
            r = yield o(k(n.roomId)),
            a = yield o(A, n.roomId)
          ;((t || (a && !i) || r) && (yield e(E({ roomId: n.roomId, messageId: r }))),
            yield e(b({ seedId: n.seedId, status: n.status, setNextActive: !t })))
          break
        }
      }
    }
  } catch (o) {
    yield m("roomPairingSaga", o)
  } finally {
    t?.close()
  }
}