Skip to content
// Helpers for ~/.config/notify/notify.json and profile files.

function normalizeServer(s) {
  var url = String(s && (s.url || s.server || s.host || s.endpoint || s.notify_url) || "").trim().replace(/\/+$/, "")
  var pin = String(s && (s.pin || s.token || s.apiKey || s.api_key || s.password) || "")
  var key = String(s && (s.api_key || s.apiKey || s.token || s.pin) || pin)
  return {
    name: String(s && s.name || ""),
    url: url,
    api_key: key,
    pin: pin
  }
}

function validServer(s) {
  var url = String(s && (s.url || s.server || s.host || s.endpoint || s.notify_url) || "").trim()
  return url.length > 0
}

function parseProfile(name, content) {
  var parsed
  try {
    parsed = JSON.parse(String(content || "{}"))
  } catch (e) {
    return { name: name, servers: [] }
  }
  var list = []
  var profileName = String(name || "").replace(/\.json$/, "")
  if (Array.isArray(parsed)) {
    list = parsed
  } else if (parsed && typeof parsed === "object") {
    if (parsed.name && typeof parsed.name === "string" && parsed.name.trim().length > 0) {
      profileName = parsed.name.trim()
    }
    if (Array.isArray(parsed.servers)) {
      list = parsed.servers
    } else {
      list = [parsed]
    }
  }
  return {
    name: profileName,
    servers: list.filter(validServer).map(normalizeServer)
  }
}

// The scanner emits @@CONFIG, main config JSON, then @@FILE <name>, JSON.
function parseDump(text) {
  var profiles = []
  var active = ""
  var lines = String(text || "").split("\n")
  var currentName = ""
  var current = []

  function finish() {
    if (currentName !== "") {
      var prof = parseProfile(currentName, current.join("\n"))
      if (prof.servers.length > 0)
        profiles.push(prof)
    }
    currentName = ""
    current = []
  }

  for (var i = 0; i < lines.length; i++) {
    var line = lines[i]
    if (line === "@@CONFIG") {
      finish()
      var configText = []
      i++
      while (i < lines.length && lines[i].indexOf("@@FILE ") !== 0) {
        configText.push(lines[i])
        i++
      }
      try {
        var rawConfig = configText.join("\n")
        var config = JSON.parse(rawConfig)
        active = String(config && config.active || "")
        var mainProfile = parseProfile("notify", rawConfig)
        if (mainProfile.servers.length > 0) {
          profiles.push(mainProfile)
          if (!active) active = mainProfile.name
        }
      } catch (e) {}
      if (i >= lines.length) break
      line = lines[i]
    }
    if (line.indexOf("@@FILE ") === 0) {
      finish()
      currentName = line.slice(7).trim()
    } else if (currentName !== "") {
      current.push(line)
    }
  }
  finish()
  return { profiles: profiles, active: active }
}

function byName(profiles, name) {
  var key = String(name || "")
  for (var i = 0; i < profiles.length; i++)
    if (profiles[i].name === key) return profiles[i]
  return null
}

function shellQuote(value) {
  return "'" + String(value).replace(/'/g, "'\\''") + "'"
}