foreignStorage

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

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

You will need to install an extension such as Tampermonkey to install this script.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==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
    }
  }
  
}