{"version":3,"sources":["https://lively-kernel.org/voices/BP2019RH1-data/server.mjs"],"names":["http","fs","URL","TracedData","messagesPath","individualsPathOriginal","individualsPaths","fs_readFile","file","Promise","resolve","reject","readFile","err","data","Server","onRequest","req","res","console","log","method","url","parse","pathname","match","end","getMetadataMessages","m","index","parseInt","getMessageWithIndex","getMetadataIndividuals","getIndividualsWithIndex","filename","replace","compressedIndividuals","buildCompressedIndividualsRaw","buildCompressedIndividualsWithThemeObjectRaw","buildCompressedIndividualsWithThemeObjectAnswered","buildCompressedIndividualsWithThemeObjectGroupedRaw","buildCompressedIndividualsWithThemeObjectGroupedAnswered","Object","keys","includes","date","covidData","buildCovid19KenyaConversationObject","key","buildCovid19KenyaConversationObjectFlatThemes","buildCovid19KenyaConversationInferredObject","buildCovid19ConversationObject","attribute_list","all_attributes","attributes","c","push","key_data","buildDistanceMatrix","JSON","evalQuery","POST","load","start","Date","now","messagesText","length","individualsTextArray","path","fileContent","rawIndividuals","map","ea","split","part","pop","concat","apply","rawMessages","messages","parsedIndividuals","individuals","deserialize","getAllKeys","forEach","individual","stringify","getItems","basicKeys","getBasicKeys","themeKeys","getThemeKeysRaw","buildCompressedIndividualStringWithThemeObjectRaw","individualString","basicsString","themeString","buildCompressedIndividualStringThemeObjectAnswered","themes","getThemeKeysGrouped","buildCompressedIndividualStringThemeObjectGroupedRaw","themesString","groupKey","buildCompressedIndividualStringThemeObjectGroupedAnswered","rawData","result","lookupFilename","lookupString","lookup","element","attribute","tag","getCovidKeyFromValue","undefined","countyConstitFilename","countyConstitLookupRaw","countyConstitLookup","lookupDate","filenameTags","rawDataTags","dataTags","tagLookup","dt","message","themeStub","themePresent","tagId","value","isNaN","rawKeys","themeGroups","splice","themeMap","i","ranges","dists","Array","Set","d","k","add","a","Math","max","min","e","dist","gower_dist","b","sum","gower_dist_attr","round","Number","EPSILON","range","isArray","outer","inner","elem","abs","query","eval","fullBody","on","chunk","toString","evalResult","Function","isError","port","createServer","listen"],"mappings":"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","file":"server.mjs","sourcesContent":["import http from 'http';\nimport fs from 'fs';\nimport URL from 'url';\nimport TracedData from \"../parsing-data/avf-data\"; \n\nvar messagesPath =  \"../voices-replaced/messages_traced_data.jsonl_replaced\"\nvar individualsPathOriginal = \"../voices-replaced/individuals_traced_data.jsonl_replaced\"\nvar individualsPaths = [\"../voices-replaced/individuals_traced_data1.jsonl_replaced\", \"../voices-replaced/individuals_traced_data2.jsonl_replaced\"]\n\n// for faster dev cycles - just read in smaller head data samples\n// var messagesPath =  \"../voices-replaced/head_messages.json\"\n// var individualsPaths = [\"../voices-replaced/head_individuals.json\"]\n\nvar fs_readFile = function(file) {\n  return new Promise((resolve, reject) => fs.readFile(file, \"utf8\", (err, data) => {\n    if (err) {\n      reject(err)\n    } else {\n      resolve(data)\n    }\n  }))\n};\n\nclass Server {\n  \n  static async onRequest(req, res) {\n    console.log(req.method)\n    var url = URL.parse(req.url, true, false);\n    var pathname = url.pathname\n    \n    if (pathname.match(/messages\\/metadata/)) {\n      res.end(this.getMetadataMessages())\n    }\n    \n    let m = pathname.match(/messages\\/([0-9]+)/)\n    if (m) {\n      let index = parseInt(m[1])\n      res.end(this.getMessageWithIndex(index))\n    }\n    \n    if (pathname.match(/individuals\\/metadata/)) {\n      res.end(this.getMetadataIndividuals())\n    }\n    \n    m = pathname.match(/individuals\\/([0-9]+)/)\n    if (m) {\n      let index = parseInt(m[1])\n      res.end(this.getIndividualsWithIndex(index))\n    }\n    \n    m = pathname.match(/compressedIndividuals\\/(.+)\\/rebuildRaw/)\n    if (m) {\n      let filename = m[1]\n      filename = filename.replace(/\\/rebuildRaw$/, \"\")\n      this.compressedIndividuals[\"raw\"][filename] = await this.buildCompressedIndividualsRaw(filename)\n      res.end(this.compressedIndividuals[\"raw\"][filename])\n    }\n    \n    m = pathname.match(/compressedIndividuals\\/(.+)\\/rebuildThemeObjectRaw/)\n    if (m) {\n      let filename = m[1]\n      filename = filename.replace(/\\/rebuild$/, \"\")\n      this.compressedIndividuals[\"themeObjectRaw\"][filename] = await this.buildCompressedIndividualsWithThemeObjectRaw(filename)\n      res.end(this.compressedIndividuals[\"themeObjectRaw\"][filename])\n    }\n    \n    m = pathname.match(/compressedIndividuals\\/(.+)\\/rebuildThemeObjectAnswered/)\n    if (m) {\n      let filename = m[1]\n      filename = filename.replace(/\\/loadThemeObjectAnswered$/, \"\")\n      this.compressedIndividuals[\"themeObjectAnswered\"][filename] = await this.buildCompressedIndividualsWithThemeObjectAnswered(filename)\n      res.end(this.compressedIndividuals[\"themeObjectAnswered\"][filename])\n    }\n    \n    m = pathname.match(/compressedIndividuals\\/(.+)\\/rebuildThemeObjectGroupedRaw/)\n    if (m) {\n      let filename = m[1]\n      filename = filename.replace(/\\/rebuildThemeObjectGroupedRaw$/, \"\")\n      this.compressedIndividuals[\"themeObjectGroupedRaw\"][filename] = await this.buildCompressedIndividualsWithThemeObjectGroupedRaw(filename)\n      res.end(this.compressedIndividuals[\"themeObjectGroupedRaw\"][filename])\n    }\n    \n    m = pathname.match(/compressedIndividuals\\/(.+)\\/rebuildThemeObjectGroupedAnswered/)\n    if (m) {\n      let filename = m[1]\n      filename = filename.replace(/\\/loadThemeObjectGroupedAnswered$/, \"\")\n      this.compressedIndividuals[\"themeObjectGroupedAnswered\"][filename] = await this.buildCompressedIndividualsWithThemeObjectGroupedAnswered(filename)\n      res.end(this.compressedIndividuals[\"themeObjectGroupedAnswered\"][filename])\n    }\n    \n    m = pathname.match(/compressedIndividuals\\/(.+)\\/loadRaw/)\n    if (m) {\n      let filename = m[1]\n      filename = filename.replace(/\\/loadRaw$/, \"\")\n      if (!Object.keys(this.compressedIndividuals[\"raw\"]).includes(filename)) {\n        this.compressedIndividuals[\"raw\"][filename] = await this.buildCompressedIndividualsRaw(filename)\n      }\n      res.end(this.compressedIndividuals[\"raw\"][filename])\n    }\n    \n    m = pathname.match(/compressedIndividuals\\/(.+)\\/loadThemeObjectRaw/)\n    if (m) {\n      let filename = m[1]\n      filename = filename.replace(/\\/loadThemeObjectRaw$/, \"\")\n      if (!Object.keys(this.compressedIndividuals[\"themeObjectRaw\"]).includes(filename)) {\n        this.compressedIndividuals[\"themeObjectRaw\"][filename] = await this.buildCompressedIndividualsWithThemeObjectRaw(filename)\n      }\n      res.end(this.compressedIndividuals[\"themeObjectRaw\"][filename])\n    }\n    \n    m = pathname.match(/compressedIndividuals\\/(.+)\\/loadThemeObjectAnswered/)\n    if (m) {\n      let filename = m[1]\n      filename = filename.replace(/\\/loadThemeObjectAnswered$/, \"\")\n      if (!Object.keys(this.compressedIndividuals[\"themeObjectAnswered\"]).includes(filename)) {\n        this.compressedIndividuals[\"themeObjectAnswered\"][filename] = await this.buildCompressedIndividualsWithThemeObjectAnswered(filename)\n      }\n      res.end(this.compressedIndividuals[\"themeObjectAnswered\"][filename])\n    }\n    \n    m = pathname.match(/compressedIndividuals\\/(.+)\\/loadThemeObjectGroupedRaw/)\n    if (m) {\n      let filename = m[1]\n      filename = filename.replace(/\\/loadThemeObjectGroupedRaw$/, \"\")\n      if (!Object.keys(this.compressedIndividuals[\"themeObjectGroupedRaw\"]).includes(filename)) {\n        this.compressedIndividuals[\"themeObjectGroupedRaw\"][filename] = await this.buildCompressedIndividualsWithThemeObjectGroupedRaw(filename)\n      }\n      res.end(this.compressedIndividuals[\"themeObjectGroupedRaw\"][filename])\n    }\n    \n    m = pathname.match(/compressedIndividuals\\/(.+)\\/loadThemeObjectGroupedAnswered/)\n    if (m) {\n      let filename = m[1]\n      filename = filename.replace(/\\/loadThemeObjectGroupedAnswered$/, \"\")\n      if (!Object.keys(this.compressedIndividuals[\"themeObjectGroupedAnswered\"]).includes(filename)) {\n        this.compressedIndividuals[\"themeObjectGroupedAnswered\"][filename] = await this.buildCompressedIndividualsWithThemeObjectGroupedAnswered(filename)\n      }\n      res.end(this.compressedIndividuals[\"themeObjectGroupedAnswered\"][filename])\n    }\n    \n    m = pathname.match(/CoVid19-Kenya\\/(.+)\\/rebuildHierarchicalThemes/)\n    if (m) {\n      let date = m[1]\n      \n      this.covidData[date] = await this.buildCovid19KenyaConversationObject(date)\n      res.end(this.covidData[date])\n    }\n    \n    m = pathname.match(/CoVid19-Kenya\\/(.+)\\/rebuildFlatThemes/)\n    if (m) {\n      let date = m[1]\n      let key = date + \"_flat\"\n      this.covidData[key] = await this.buildCovid19KenyaConversationObjectFlatThemes(date)\n      res.end(this.covidData[key])\n    }\n    \n    m = pathname.match(/CoVid19-Kenya\\/(.+)\\/rebuildHierarchicalInferredThemes/)\n    if (m) {\n      let date = m[1]\n      let key = date + \"_inferred\"\n      this.covidData[key] = await this.buildCovid19KenyaConversationInferredObject(date)\n      res.end(this.covidData[key])\n    }\n    \n    m = pathname.match(/CoVid19-Kenya\\/(.+)\\/rebuildMessageThemes/)\n    if (m) {\n      let date = m[1]\n      console.log(date)\n      let key = date + \"_message\"\n      this.covidData[key] = await this.buildCovid19ConversationObject(date)\n      res.end(this.covidData[key])\n    }\n\n    m = pathname.match(/CoVid19-Kenya\\/(.+)\\/loadHierarchicalThemes/)\n    if (m) {\n      let date = m[1]\n      if (!Object.keys(this.covidData).includes(date)) {\n        this.covidData[date] = await this.buildCovid19KenyaConversationObject(date)\n      }\n      res.end(this.covidData[date])\n    }\n    \n    m = pathname.match(/CoVid19-Kenya\\/(.+)\\/loadFlatThemes/)\n    if (m) {\n      let date = m[1]\n      let key = date + \"_flat\"\n      if (!Object.keys(this.covidData).includes(key)) {\n        this.covidData[key] = await this.buildCovid19KenyaConversationObjectFlatThemes(date)\n      }\n      res.end(this.covidData[key])\n    }\n    \n    m = pathname.match(/CoVid19-Kenya\\/(.+)\\/loadHierarchicalInferredThemes/)\n    if (m) {\n      let date = m[1]\n      let key = date + \"_inferred\"\n      if (!Object.keys(this.covidData).includes(key)) {\n        this.covidData[key] = await this.buildCovid19KenyaConversationInferredObject(date)\n      }\n      res.end(this.covidData[key])\n    }\n    \n    m = pathname.match(/CoVid19-Kenya\\/(.+)\\/loadMessageThemes/)\n    if (m) {\n      let date = m[1]\n      let key = date + \"_message\"\n      if (!Object.keys(this.covidData).includes(key)) {\n        this.covidData[key] = await this.buildCovid19ConversationObject(date)\n      }\n      res.end(this.covidData[key])\n    }\n    \n    m = pathname.match(/CoVid19\\/(.+)\\/(.+)\\/loadDistanceMatrix/)\n    if (m) {\n      let date = m[1]\n      let attribute_list = m[2]\n      let key = date + \"_distanceMatrix_\" + attribute_list\n      let all_attributes = [\"age\", \"county\", \"themes\", \"gender\", \"constituency\", \"languages\"]\n      \n      let attributes = []\n      \n      for (let c of attribute_list) {\n        attributes.push(all_attributes[+c])\n      }\n      \n      if (!Object.keys(this.covidData).includes(key)) {\n        let key_data = date + \"_flat\"\n        if (!Object.keys(this.covidData).includes(key_data)) {\n          this.covidData[key_data] = await this.buildCovid19KenyaConversationObjectFlatThemes(date)\n        }\n        this.covidData[key] = this.buildDistanceMatrix(JSON.parse(this.covidData[key_data]), attributes)\n      }\n      res.end(this.covidData[key])\n    }\n        \n    m = pathname.match(/eval\\/(.*)/)\n    if (m) {\n      res.end(this.evalQuery(m[1]))\n    }\n    \n    if (req.method == 'POST') {\n        await this.POST(req, res)\n    }\n    \n    //res.end(\"NO MATCHES\")\n  }\n  \n  static async load() {\n    let start = Date.now()\n    this.messagesText = await fs_readFile(messagesPath)\n    console.log(\"READ messages size: \" + this.messagesText.length + \" in \" + (Date.now() - start) + \"ms\")\n    \n    this.individualsTextArray = []\n    for (let path of individualsPaths) {\n      let start = Date.now()\n      var fileContent = await fs_readFile(path)\n      this.individualsTextArray.push(fileContent)\n      console.log(\"READ individuals half \" + \" at \" + path + \" with size: \" + this.individualsTextArray[this.individualsTextArray.length - 1].length + \" in \" + (Date.now() - start) + \"ms\")\n    }\n    \n    start = Date.now()\n    \n    \n    this.rawIndividuals = this.individualsTextArray.map(ea => ea.split(\"\\n\"))\n    \n    //remove last empty line to enable later JSON parsing\n    for (let part of this.rawIndividuals) {\n      part.pop()\n    }\n    this.rawIndividuals = [].concat.apply([], this.rawIndividuals)\n  \n    this.rawMessages = this.messagesText.split(\"\\n\")\n    \n    //remove last empty line to enable later JSON parsing\n    this.rawMessages.pop()\n    \n    start = Date.now()\n    this.messages = this.rawMessages.map(ea => JSON.parse(ea))\n    console.log(\"parsed messages: \" + this.messages.length + \" of \" + this.rawMessages.length + \" in \" + (Date.now() - start) + \"ms\" )\n    \n    start = Date.now()\n    this.parsedIndividuals = this.rawIndividuals.map(ea => JSON.parse(ea))\n    console.log(\"parsed individuals: \" + this.parsedIndividuals.length + \" of \" + this.rawIndividuals.length + \" in \" + (Date.now() - start) + \"ms\" )\n    \n    start = Date.now()\n    this.individuals = this.parsedIndividuals.map((ea) => TracedData.deserialize(ea))\n    console.log(\"deserialized individuals: \" + this.individuals.length + \" of \" + this.rawIndividuals.length + \" in \" + (Date.now() - start) + \"ms\" )\n    \n    this.compressedIndividuals = {\n      \"raw\": {},\n      \"themeObjectRaw\": {},\n      \"themeObjectAnswered\": {},\n      \"themeObjectGroupedRaw\": {},\n      \"themeObjectGroupedAnswered\": {}\n    }\n    \n    console.log(\"Initialized compressed individuals\")\n    \n    this.covidData = {}\n  }\n\n  static getMetadataMessages() {\n    return this.rawMessages.length + \"\"\n  }\n  \n  static getMessageWithIndex(index) {\n    return this.rawMessages[index]\n  }\n  \n  static getMetadataIndividuals() {\n    return this.rawIndividuals.length + \"\"\n  }\n  \n  static getIndividualsWithIndex(index) {\n    return this.rawIndividuals[index]\n  }\n  \n  static async buildCompressedIndividualsRaw(filename) {\n    let keys = await this.getAllKeys(filename)\n    \n    let compressedIndividuals = \"[\"\n    this.individuals.forEach(individual => {\n      compressedIndividuals += JSON.stringify(individual.getItems(keys))\n      compressedIndividuals += \",\"\n    })\n    compressedIndividuals = compressedIndividuals.replace(/,$/, \"\")\n    compressedIndividuals += \"]\"\n    return compressedIndividuals\n  }\n  \n  static async buildCompressedIndividualsWithThemeObjectRaw(filename) {\n    let basicKeys = await this.getBasicKeys(filename)\n    let themeKeys = await this.getThemeKeysRaw(filename)\n    \n    let compressedIndividuals = \"[\"\n    this.individuals.forEach((individual) => {\n      compressedIndividuals += this.buildCompressedIndividualStringWithThemeObjectRaw(individual, basicKeys, themeKeys)\n      compressedIndividuals += \",\"\n    })\n    compressedIndividuals = compressedIndividuals.replace(/,$/, \"\")\n    compressedIndividuals += \"]\"\n    return compressedIndividuals\n  }\n  \n  static buildCompressedIndividualStringWithThemeObjectRaw(individual, basicKeys, themeKeys) {\n    let individualString = \"\"\n    let basicsString = JSON.stringify(individual.getItems(basicKeys))\n    let themeString = JSON.stringify(individual.getItems(themeKeys))\n    basicsString = basicsString.replace(/\\}$/, \"\")\n    individualString += basicsString\n    individualString += ',\"themes\": '\n    individualString += themeString\n    individualString += \"}\"\n    return individualString\n  }\n  \n  static async buildCompressedIndividualsWithThemeObjectAnswered(filename) {\n    let basicKeys = await this.getBasicKeys(filename)\n    let themeKeys = await this.getThemeKeysRaw(filename)\n    \n    let compressedIndividuals = \"[\"\n    this.individuals.forEach(individual => {\n      compressedIndividuals += this.buildCompressedIndividualStringThemeObjectAnswered(individual, basicKeys, themeKeys)\n      compressedIndividuals += \",\"\n    })\n    compressedIndividuals = compressedIndividuals.replace(/,$/, \"\")\n    compressedIndividuals += \"]\"\n    return compressedIndividuals    \n  }\n  \n  static buildCompressedIndividualStringThemeObjectAnswered(individual, basicKeys, themeKeys) {\n    let individualString = \"\"\n    let basicsString = JSON.stringify(individual.getItems(basicKeys))\n    basicsString = basicsString.replace(/\\}$/, \"\")\n    let themes = individual.getItems(themeKeys)\n    let themeString =\"[\"\n    Object.keys(themes).forEach(key => {\n      if (themes[key] === \"1\") {themeString += ('\"' + key + '\", ')}\n    })\n    themeString = themeString.replace(/, $/, \"\")\n    themeString += \"]\" \n    individualString += basicsString\n    individualString += ',\"themes\": '\n    individualString += themeString\n    individualString += \"}\"\n    return individualString\n  }\n  \n  static async buildCompressedIndividualsWithThemeObjectGroupedRaw(filename) {\n    let basicKeys = await this.getBasicKeys(filename)\n    let themeKeys = await this.getThemeKeysGrouped(filename)\n\n    let compressedIndividuals = \"[\"\n    this.individuals.forEach(individual => {\n      compressedIndividuals += this.buildCompressedIndividualStringThemeObjectGroupedRaw(individual, basicKeys, themeKeys)\n      compressedIndividuals += \",\"\n    })\n    compressedIndividuals = compressedIndividuals.replace(/,$/, \"\")\n    compressedIndividuals += \"]\"\n    return compressedIndividuals \n  }\n  \n  static buildCompressedIndividualStringThemeObjectGroupedRaw(individual, basicKeys, themeKeys) {\n    let individualString = \"\"\n    let basicsString = JSON.stringify(individual.getItems(basicKeys))\n    basicsString = basicsString.replace(/\\}$/, \"\")\n    let themesString = \"{\"\n    Object.keys(themeKeys).forEach(groupKey => {\n      themesString += '\"' + groupKey + '\": '\n      themesString += JSON.stringify(individual.getItems(themeKeys[groupKey]))\n      themesString += \",\"\n    })\n    themesString = themesString.replace(/,$/, \"\")\n    themesString += \"}\"\n    \n    individualString += basicsString\n    individualString += ',\"themes\": '\n    individualString += themesString\n    individualString += \"}\"\n    return individualString\n  }\n  \n  static async buildCompressedIndividualsWithThemeObjectGroupedAnswered(filename) {\n    let basicKeys = await this.getBasicKeys(filename)\n    let themeKeys = await this.getThemeKeysGrouped(filename)\n    \n    let compressedIndividuals = \"[\"\n    this.individuals.forEach(individual => {\n      compressedIndividuals += this.buildCompressedIndividualStringThemeObjectGroupedAnswered(individual, basicKeys, themeKeys)\n      compressedIndividuals += \",\"\n    })\n    compressedIndividuals = compressedIndividuals.replace(/,$/, \"\")\n    compressedIndividuals += \"]\"\n    return compressedIndividuals\n  }\n  \n  static buildCompressedIndividualStringThemeObjectGroupedAnswered(individual, basicKeys, themeKeys) {\n    let individualString = \"\"\n    let basicsString = JSON.stringify(individual.getItems(basicKeys))\n    basicsString = basicsString.replace(/\\}$/, \"\")\n    \n    let themesString = \"{\"\n    Object.keys(themeKeys).forEach(groupKey => {\n      let themes = individual.getItems(themeKeys[groupKey])\n      themesString += '\"' + groupKey + '\": ['\n      Object.keys(themes).forEach(key => {\n        if (themes[key] === \"1\") {themesString += ('\"' + key + '\", ')}\n      })\n      themesString = themesString.replace(/, $/, \"\")\n      themesString += \"],\"\n    })\n    themesString = themesString.replace(/,$/, \"\")\n    themesString += \"}\"\n    \n    individualString += basicsString\n    individualString += ',\"themes\": '\n    individualString += themesString\n    individualString += \"}\"\n    return individualString\n  }\n  \n  static async buildCovid19KenyaConversationObject(date) {\n    let filename = \"../CoVid19-Kenya/covid-converation-metadata-\" + date + \".json\"\n    let rawData = await fs_readFile(filename)\n    let data = JSON.parse(rawData)\n    let result = []\n    let attributes = [\"age\", \"gender\", \"constituency\", \"county\"]\n    \n    let lookupFilename = \"../CoVid19-Kenya/covid-lookup-\" + date +\".json\"\n    let lookupString = await fs_readFile(lookupFilename)\n    let lookup = JSON.parse(lookupString)\n    \n    data.forEach((element) => {\n      let individual = {\n        \"id\": element[\"id\"], \n        \"start_date\": element[\"start_date\"], \n        \"end_date\": element[\"end_date\"],\n        \"themes\": {\"L1\": [\"missing\"], \"L2\": [\"missing\"], \"L3\": [\"missing\"]},\n        \"languages\": [\"missing\"]\n      }\n      \n      attributes.forEach((attribute) => {\n        individual[attribute] = \"missing\"\n      })\n      \n      \n      for (let tag of element[\"tags\"]) {\n        let key = this.getCovidKeyFromValue(lookup, tag)\n        if (key == undefined) {\n          continue\n        }\n        \n        if (key === \"languages\") {\n          if (individual[key][0] === \"missing\") {\n            individual[key] = [tag]\n          } else {\n            individual[key].push(tag)\n          }\n        } else if (key === \"L1\" || key === \"L2\" || key === \"L3\") {\n          if (individual[\"themes\"][key][0] === \"missing\") {\n            individual[\"themes\"][key] = [tag]\n          } else {\n            individual[\"themes\"][key].push(tag)\n          }\n        } else {\n          individual[key] = tag\n        }\n      }\n      \n      result.push(individual)\n    })\n    \n    return JSON.stringify(result)\n  }\n\n  static async buildCovid19KenyaConversationInferredObject(date) {\n    let filename = \"../CoVid19-Kenya/covid-converation-metadata-\" + date + \".json\"\n    let rawData = await fs_readFile(filename)\n    let data = JSON.parse(rawData)\n    \n    let result = []\n    let attributes = [\"age\", \"gender\", \"constituency\", \"county\"]\n    \n    let lookupFilename = \"../CoVid19-Kenya/covid-lookup-\" + date +\".json\"\n    let lookupString = await fs_readFile(lookupFilename)\n    let lookup = JSON.parse(lookupString)\n    \n    let countyConstitFilename = \"../CoVid19-Kenya/kenya_county_constituency.json\"\n    let countyConstitLookupRaw = await fs_readFile(countyConstitFilename)\n    let countyConstitLookup = JSON.parse(countyConstitLookupRaw)\n    \n    data.forEach((element) => {\n      let individual = {\n        \"id\": element[\"id\"], \n        \"start_date\": element[\"start_date\"], \n        \"end_date\": element[\"end_date\"],\n        \"themes\": {\"L1\": [\"missing\"], \"L2\": [\"missing\"], \"L3\": [\"missing\"]},\n        \"languages\": [\"missing\"]\n      }\n      \n      attributes.forEach((attribute) => {\n        individual[attribute] = \"missing\"\n      })\n      \n      \n      for (let tag of element[\"tags\"]) {\n        let key = this.getCovidKeyFromValue(lookup, tag)\n        if (key == undefined) {\n          continue\n        }\n        \n        if (key === \"languages\") {\n          if (individual[key][0] === \"missing\") {\n            individual[key] = [tag]\n          } else {\n            individual[key].push(tag)\n          }\n        } else if (key === \"L1\" || key === \"L2\" || key === \"L3\") {\n          if (individual[\"themes\"][key][0] === \"missing\") {\n            individual[\"themes\"][key] = [tag]\n          } else {\n            individual[\"themes\"][key].push(tag)\n          }\n        } else {\n          individual[key] = tag\n        }\n      }\n      \n      if (individual[\"constituency\"] !== \"missing\" && individual[\"county\"] === \"missing\" && Object.keys(countyConstitLookup).includes(individual[\"constituency\"])) {\n        individual[\"county\"] = countyConstitLookup[individual[\"constituency\"]]\n      }\n      \n      result.push(individual)\n    })\n    \n    return JSON.stringify(result)\n  }\n\n  static async buildCovid19KenyaConversationObjectFlatThemes(date) {\n    let filename = \"../CoVid19-Kenya/covid-converation-metadata-\" + date + \".json\"\n    let rawData = await fs_readFile(filename)\n    let data = JSON.parse(rawData)\n    let result = []\n    let attributes = [\"age\", \"gender\", \"constituency\", \"county\"]\n    \n    let lookupFilename = \"../CoVid19-Kenya/covid-lookup-\" + date +\".json\"\n    let lookupString = await fs_readFile(lookupFilename)\n    let lookup = JSON.parse(lookupString)\n    \n    data.forEach((element) => {\n      let individual = {\n        \"id\": element[\"id\"], \n        \"start_date\": element[\"start_date\"], \n        \"end_date\": element[\"end_date\"],\n        \"themes\": [\"missing\"],\n        \"languages\": [\"missing\"]\n      }\n      \n      attributes.forEach((attribute) => {\n        individual[attribute] = \"missing\"\n      })\n      \n      \n      for (let tag of element[\"tags\"]) {\n        let key = this.getCovidKeyFromValue(lookup, tag)\n        if (key == undefined) {\n          continue\n        }\n        \n        if (key === \"languages\") {\n          if (individual[key][0] === \"missing\") {\n            individual[key] = [tag]\n          } else {\n            individual[key].push(tag)\n          }\n        } else if (key === \"L1\" || key === \"L2\" || key === \"L3\") {\n          if (individual[\"themes\"][0] === \"missing\") {\n            individual[\"themes\"] = [tag]\n          } else {\n            individual[\"themes\"].push(tag)\n          }\n        } else {\n          individual[key] = tag\n        }\n      }\n      \n      result.push(individual)\n    })\n    \n    return JSON.stringify(result)    \n  }\n  \n  static async buildCovid19ConversationObject(date=\"2020-04-20\", lookupDate=\"2020-03-24\") {\n    console.log(\"received message\")\n    let filename = \"../CoVid19-Kenya/covid-conversation-\" + \"kenya-\" + date + \".json\"\n    let rawData = await fs_readFile(filename)\n    let data = JSON.parse(rawData)\n    let result = []\n    let attributes = [\"age\", \"gender\", \"constituency\", \"county\"]\n    \n    console.log(\"Loaded data\")\n    \n    // load conversationTags\n    let filenameTags = \"../CoVid19-Kenya/conversationTags.json\"\n    let rawDataTags = await fs_readFile(filenameTags)\n    let dataTags = JSON.parse(rawDataTags)\n    \n    console.log(\"Loaded tags\")\n    \n    let tagLookup = {}\n    dataTags.forEach(dt => {\n      tagLookup[dt[\"__id\"]] = dt[\"text\"]\n    })\n    \n    let lookupFilename = \"../CoVid19-Kenya/covid-lookup-\" + lookupDate +\".json\"\n    let lookupString = await fs_readFile(lookupFilename)\n    let lookup = JSON.parse(lookupString)\n    \n    data.forEach((element) => {\n      let individual = {\n        \"themes\": [\"missing\"],\n        \"languages\": [\"missing\"]\n      }\n      \n      attributes.forEach((attribute) => {\n        individual[attribute] = \"missing\"\n      })\n      \n      \n      for (let message of element[\"messages\"]) {\n        if (message[\"direction\"] === \"MessageDirection.out\") {\n          continue\n        }\n        \n        let themeStub = {\"L1\": [\"missing\"], \"L2\": [\"missing\"], \"L3\": [\"missing\"]}\n        let themePresent = false\n        \n        for (let tagId of message[\"tags\"]) {\n          let tag = tagLookup[tagId]\n          let key = this.getCovidKeyFromValue(lookup, tag)\n          if (key == undefined) {\n            continue\n          }\n\n          if (key === \"languages\") {\n            if (individual[key][0] === \"missing\") {\n              individual[key] = [tag]\n            } else {\n              individual[key].push(tag)\n            }\n          } else if (key === \"L1\" || key === \"L2\" || key === \"L3\") {\n            themePresent = true\n            if (themeStub[key][0] === \"missing\") {\n              themeStub[key] = [tag]\n            } else {\n              themeStub[key].push(tag)\n            }\n          } else {\n            individual[key] = tag\n          }\n        }\n        \n        if (!themePresent) continue\n        \n        if (individual[\"themes\"][0] === \"missing\") {\n          individual[\"themes\"][0] = themeStub\n        } else {\n          individual[\"themes\"].push(themeStub)\n        }\n      }\n      \n      result.push(individual)\n    })\n    \n    return JSON.stringify(result)\n  }\n  \n  static getCovidKeyFromValue(lookup, value) {\n    let attribute\n    \n    if (!isNaN(value)) {\n      attribute = \"age\"\n    } else {\n      attribute = lookup[value]\n    }\n    \n    if (attribute == undefined) {\n      console.log(\"When converting Covid data, couldn't infer attribute from value \" + value)\n    }\n    \n    return attribute\n  }\n  \n  static async getAllKeys(filename) {\n    let rawKeys = await fs_readFile(\"./keys/\" + filename + \".txt\")\n    while (rawKeys.match(/---(.+)\\n/)) {\n      rawKeys = rawKeys.replace(/---(.+)\\n/, \"\")\n    }\n    return rawKeys.split(\"\\n\")\n  }\n  \n  static async getBasicKeys(filename) {\n    let rawKeys = await fs_readFile(\"./keys/\" + filename + \".txt\")\n    return rawKeys.split(\"---themes\")[0].split(\"\\n\")\n  }\n  \n  static async getThemeKeysRaw(filename) {\n    let rawKeys = await fs_readFile(\"./keys/\" + filename + \".txt\")\n    let themeKeys = rawKeys.split(\"---themes\\n\")[1]\n    while (themeKeys.match(/---(.+)\\n/)) {\n      themeKeys = themeKeys.replace(/---(.+)\\n/, \"\")\n    }\n    return themeKeys.split(\"\\n\")\n  }\n  \n  static async getThemeKeysGrouped(filename) {\n    let rawKeys = await fs_readFile(\"./keys/\" + filename + \".txt\")\n    let themeKeys = rawKeys.split(\"---themes\\n\")[1]\n    let themeGroups = themeKeys.split(/---(.+)\\n/)\n    themeGroups.splice(0,1)\n    let themeMap = {}\n    for (let i = 0; i < themeGroups.length; i+=2) {\n      themeMap[themeGroups[i]] = themeGroups[i+1]\n    }\n    Object.keys(themeMap).forEach(key => {\n      themeMap[key] = themeMap[key].split(\"\\n\")\n    })\n    return themeMap\n  }\n  \n  static buildDistanceMatrix(data, attributes) {\n    console.log(\"Building distance matrix with size: \" + data.length)\n    \n    let ranges = {}\n    let dists = Array(data.length)\n    \n    attributes.forEach(attribute => {\n      ranges[attribute] = new Set()\n    })\n\n    data.forEach(d => {\n      attributes.forEach(k => {\n        if (!isNaN(d[k])) {\n          ranges[k].add(d[k])\n        }\n      })\n    })\n\n    attributes.forEach(a => {\n      ranges[a] = Math.max(...ranges[a]) - Math.min(...ranges[a])\n    })\n    \n    for (let i = 0; i < data.length; i++) {\n      dists[i] = Array(data.length)\n      dists[i][i] = 0\n    }\n  \n\n    for (let i = 0; i < data.length; i++) {\n      for (let e = 0; e < i; e++) {\n        let dist = this.gower_dist(data[i], data[e], attributes, ranges)\n        dists[i][e] = dist\n        dists[e][i] = dist\n      }\n    }\n    \n    return JSON.stringify(dists)\n  }\n  \n  static gower_dist(a, b, attributes, ranges) {\n    let sum = 0\n    for (let attribute of attributes) {\n      sum += this.gower_dist_attr(a[attribute], b[attribute], ranges[attribute])\n    }\n\n    return Math.round((sum / attributes.length + Number.EPSILON) * 1000) / 1000\n  }\n\n  static gower_dist_attr(a, b, range) {\n    if (Array.isArray(a) && Array.isArray(b)) {\n      // haha you lose\n      let sum = 1\n      let outer = a\n      let inner = b\n      if (a.length > b.length) {\n        outer = b\n        inner = a\n      }\n\n      outer.forEach(elem => {\n        if (inner.includes(elem)) {\n\n          sum -= 1 / outer.length\n        }\n      })\n\n      return sum\n\n    } else if (isNaN(a) || isNaN(b)) {\n      return a === b ? 0 : 1\n\n    } else if (!isNaN(a) && !isNaN(b)) {\n      return Math.abs(a - b) / range\n\n    }\n  }\n  \n  static evalQuery(query) {\n    return eval(query) + \"\"\n  }\n  \n  static async POST(req, res) {\n    let fullBody = ''\n    req.on('data', function(chunk) {\n      fullBody += chunk.toString();\n    });\n    await new Promise(resolve => req.on('end', resolve))\n    let result \n    try {\n      var evalResult = eval(fullBody)\n      try {\n        JSON.stringify(evalResult)\n      } catch(e) {\n        evalResult = \"\" + evalResult // could not convert to JSON, so we make it a string...\n      }\n      if (evalResult instanceof Function) {\n        evalResult = \"\" + evalResult  // yet another special case\n      } \n      result = {value: evalResult}\n      \n    } catch (e) {\n      result = {value: \"\" + e, isError: true}\n    }\n    res.end(JSON.stringify(result))\n  }\n  \n  static async start() {\n    await this.load()\n    \n    this.port = 10055\n    http\n    .createServer((req, res) => this.onRequest(req, res))\n    .listen(this.port, function(err) {\n      if (err) {\n        throw err;\n      }\n    });\n  }\n\n}\n\nServer.start()"]}