diff --git a/packages/web3-providers/src/helpers.ts b/packages/web3-providers/src/helpers.ts index 151cb3952632..b4f0bf6359fd 100644 --- a/packages/web3-providers/src/helpers.ts +++ b/packages/web3-providers/src/helpers.ts @@ -1,4 +1,4 @@ -export async function fetchJSON(url: string): Promise { - const res = await globalThis.fetch(url) +export async function fetchJSON(requestInfo: RequestInfo, requestInit?: RequestInit): Promise { + const res = await globalThis.fetch(requestInfo, requestInit) return res.json() } diff --git a/packages/web3-providers/src/kv/constants.ts b/packages/web3-providers/src/kv/constants.ts new file mode 100644 index 000000000000..e8a2e9ae696b --- /dev/null +++ b/packages/web3-providers/src/kv/constants.ts @@ -0,0 +1 @@ +export const KV_ROOT_URL = 'https://kv.r2d2.to' diff --git a/packages/web3-providers/src/kv/index.ts b/packages/web3-providers/src/kv/index.ts new file mode 100644 index 000000000000..257ed50630f8 --- /dev/null +++ b/packages/web3-providers/src/kv/index.ts @@ -0,0 +1,57 @@ +import urlcat from 'urlcat' +import { fetchJSON } from '../helpers' +import type { StorageAPI } from '../types' +import { KV_ROOT_URL } from './constants' + +export class JSON_Storage implements StorageAPI.Storage { + constructor(private prefix: string) {} + + async set(key: string, value: T) { + return fetchJSON( + urlcat(KV_ROOT_URL, 'api/:name', { + name: `${this.prefix}_${key}`, + }), + { + method: 'PUT', + mode: 'cors', + credentials: 'omit', + body: JSON.stringify(value), + }, + ) + } + async get(key: string) { + const response = await fetchJSON( + urlcat(KV_ROOT_URL, 'api/:name', { + name: `${this.prefix}_${key}`, + }), + { + method: 'GET', + mode: 'cors', + credentials: 'omit', + }, + ) + try { + return JSON.parse(response) as T + } catch { + return + } + } + async delete(key: string) { + await fetchJSON( + urlcat(KV_ROOT_URL, 'api/:name', { + name: `${this.prefix}_${key}`, + }), + { + method: 'DELETE', + mode: 'cors', + credentials: 'omit', + }, + ) + } +} + +export class KeyValueAPI implements StorageAPI.Provider { + createStorage(key: string): StorageAPI.Storage { + return new JSON_Storage(key) + } +} diff --git a/packages/web3-providers/src/types.ts b/packages/web3-providers/src/types.ts index b4978c8a5b25..8ab37d7c6362 100644 --- a/packages/web3-providers/src/types.ts +++ b/packages/web3-providers/src/types.ts @@ -287,3 +287,15 @@ export namespace NonFungibleTokenAPI { getCollections?: (address: string, opts?: Options) => Promise> } } + +export namespace StorageAPI { + export interface Storage { + set(key: string, value: T): Promise + get(key: string): Promise + delete(key: string): Promise + } + + export interface Provider { + createStorage(key: string): Storage + } +}