decred.org/dcrdex@v1.0.5/server/cmd/dexadm/script.js (about)

     1  async function requestJSON (method, addr, opts) {
     2    opts = opts || {}
     3    const req = {
     4      method: method,
     5      headers: {  'Content-Type': opts.contentType ?? 'application/json' },
     6      body: opts.reqBody
     7    }
     8    const resp = await window.fetch(addr, req)
     9    const body = await resp.text()
    10    if (resp.status !== 200) { console.log(resp); throw new Error(`${resp.status}: ${resp.statusText} : ${body}`) }
    11    if (body.length === 0) return "OK"
    12    if (opts.raw) return body
    13    return JSON.parse(body)
    14  }
    15  
    16  (async () => {
    17    const page = {}
    18    for (const el of document.querySelectorAll('[id]')) page[el.id] = el
    19  
    20    page.responseTmpl.remove()
    21    page.responseTmpl.removeAttribute('id')
    22  
    23    const writeResult = (path, res, isError) => {
    24      const div = page.responseTmpl.cloneNode(true)
    25      const tmpl = Array.from(div.querySelectorAll('[data-tmpl]')).reduce((d, el) => {
    26        d[el.dataset.tmpl] = el
    27        return d
    28      }, {})
    29      page.responses.prepend(div)
    30      tmpl.path.textContent = path
    31      tmpl.close.addEventListener('click', () => div.remove())
    32      tmpl.response.textContent = res
    33      if (isError) tmpl.response.classList.add('errcolor')
    34      while (page.responses.children.length > 20) page.responses.removeChild(page.respones.lastChild)
    35      page.responses.scrollTo(0, 0)
    36    }
    37  
    38    const doRequest = async (method, path, opts) => {
    39      try {
    40        const resp = await requestJSON(method, path, opts)
    41        if (opts?.raw) tmpl.response.textContent = resp
    42        else writeResult(path, JSON.stringify(resp, null, 4))
    43      } catch (e) {
    44        writeResult(path, e.toString(), true)
    45      }
    46    }
    47  
    48    const get = (path, opts) => doRequest('GET', path, opts)
    49    const post = (path, reqBody, contentType) => doRequest('POST', path, { reqBody, contentType })
    50  
    51    page.assetBttn.addEventListener('click', () => get(`/asset/${page.assetInput.value}`))
    52    page.feeScaleBttn.addEventListener('click', () => get(`/asset/${page.assetInput.value}/setfeescale/${page.feeScaleInput.value}`))
    53    page.configBttn.addEventListener('click', () => get('/config'))
    54    page.listAccountsBttn.addEventListener('click', () => get('/accounts'))
    55    page.accountInfoBttn.addEventListener('click', () => get(`/account/${page.accountIDInput.value}`))
    56    page.accountOutcomesBttn.addEventListener('click', () => get(`/account/${page.accountIDInput.value}/outcomes?n=100`))
    57    page.matchFailsBttn.addEventListener('click', () => get(`/account/${page.accountIDInput.value}/fails?n=100`))
    58    page.forgiveMatchBttn.addEventListener('click', () => get(`/account/${page.accountIDInput.value}/forgive_match/${page.forgiveMatchIDInput.value}`))
    59    page.notifyAccountBttn.addEventListener('click', () => post(`/account/${page.accountIDInput.value}/notify`, page.notifyAccountInput.value, 'text/plain'))
    60    page.broadcastBttn.addEventListener('click', () => post(`/notifyall`, page.broadcastInput.value, 'text/plain'))
    61    page.viewMarketsBttn.addEventListener('click', () => get('/markets'))
    62    page.marketInfoBttn.addEventListener('click', () => get(`/market/${page.marketIDInput.value}`))
    63    page.marketBookBttn.addEventListener('click', () => get(`/market/${page.marketIDInput.value}/orderbook`))
    64    page.marketEpochBttn.addEventListener('click', () => get(`/market/${page.marketIDInput.value}/epochorders`))
    65    page.marketMatchesBttn.addEventListener('click', () => {
    66      const uri = `/market/${page.marketIDInput.value}/matches?n=100&includeinactive=${page.includeInactiveMatches.checked ? 'true' : 'false'}`
    67      get(uri, { raw: true })
    68    })
    69    page.suspendTimeCheckbox.addEventListener('change', () => page.suspendTimeInput.classList.toggle('d-none', !page.suspendTimeCheckbox.checked))
    70    page.unsuspendTimeCheckbox.addEventListener('change', () => page.unsuspendTimeInput.classList.toggle('d-none', !page.unsuspendTimeCheckbox.checked))
    71    const susun = (tag, withTime, timeV) => {
    72      if (!page.marketIDInput.value) return writeResult('/market', "no market specified", true)
    73      if (withTime && timeV === '') return writeResult('/market', "datetime not set", true)
    74      const params = new URLSearchParams()
    75      if (tag === 'suspend') params.append('persist', `${page.persistBook.checked ? 'true' : 'false'}`)
    76      if (withTime && timeV) params.append('t', (new Date(timeV)).getTime())
    77      get(`/market/${page.marketIDInput.value}/${tag}?${params.toString()}`)
    78    }
    79    page.suspendBttn.addEventListener('click', () => susun('suspend', page.suspendTimeCheckbox.checked, page.suspendTimeInput.value))
    80    page.resumeBttn.addEventListener('click', () => susun('resume', page.unsuspendTimeCheckbox.checked, page.unsuspendTimeInput.value))
    81    page.generatePrepaidBondsBttn.addEventListener('click', () => {
    82      const [n, days, strength] = [page.prepaidBondCountInput.value, page.prepaidBondDaysInput.value, page.prepaidBondStrengthInput.value]
    83      get(`/prepaybonds?n=${n}&days=${days}&strength=${strength}`)
    84    })
    85  })()