foreignStorage

2/16/2022, 9:49:50 PM

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name        foreignStorage
// @namespace   Violentmonkey Scripts
// @match       *://*/*
// @grant       none
// @version     1.0
// @author      -
// @description 2/16/2022, 9:49:50 PM
// @license MIT
// ==/UserScript==

{
  const url = localStorage.foreign_storage_dev
    ? 'http://localhost:3000/'
    : 'https://foreign-storage.herokuapp.com/'
  
  window.foreignStorage = {
    async setItem(key, str) {
      if (arguments.length < 2 || typeof key != 'string' || typeof str != 'string') {
        throw new Error('Exactly two arguments of type string required')
      }
      const options = { method: 'POST', headers: { key }, body: str }
      const answer = await fetch(url + 'setItem', options)
        .then(resp => resp.json())

      if (answer.success) return true
      if (answer.errors) throw new Error(answer.errors?.join('; ') || answer)
    },

    async getItem(key) {
      if (arguments.length < 1 || typeof key != 'string') {
        throw new Error('One argument of type string required')
      }
      const options = { method: 'GET', headers: { key } }
      const answer = await fetch(url + 'getItem', options)
        .then(resp => resp.json())

      if (answer.errors?.[0] == 'undefined') return undefined
      if (answer.errors) throw new Error(answer.errors?.join('; ') || answer)
      return answer
    },

    async removeItem(key) {
      if (arguments.length < 1 || typeof key != 'string') {
        throw new Error('One argument of type string required')
      }
      const options = { method: 'DELETE', headers: { key } }
      const answer = await fetch(url + 'removeItem', options)
        .then(resp => resp.json())

      if (answer.success) return true
      if (answer.errors) throw new Error(answer.errors?.join('; ') || answer)
    },

    async clear() {
      const answer = await fetch(url + 'clear', { method: 'DELETE' })
        .then(resp => resp.json())

      if (answer.success) return true
      if (answer.errors) throw new Error(answer.errors?.join('; ') || answer)
    },

    async getLength() {
      const answer = await fetch(url + 'getLength')
        .then(resp => resp.json())

      if (answer.errors) throw new Error(answer.errors?.join('; ') || answer)
      return answer
    },

    async listKeys() {
      const answer = await fetch(url + 'listKeys')
        .then(resp => resp.json())

      if (answer.errors) throw new Error(answer.errors?.join('; ') || answer)
      return answer
    }
  }
  
}