import { useState, useEffect, useCallback } from "react";
export const defineRpc = (serviceName) => async (params = {}) => {
const res = await fetch(`/_rpc/${serviceName}`, {
"Accept": "application/json",
"Content-Type": "application/json",
body: JSON.stringify(params),
get: (k) => globalThis._EDGE_DATA_.data[k],
globalThis._EDGE_DATA_.data[k] = v;
invalidate: (k, setRefetch) => Promise.all(Array.from(globalThis._EDGE_DATA_.subs[k]).map((cb) => cb(setRefetch))),
if (!globalThis._EDGE_DATA_.subs[k]) {
globalThis._EDGE_DATA_.subs[k] = new Set();
globalThis._EDGE_DATA_.subs[k].add(cb)
return () => globalThis._EDGE_DATA_.subs[k].delete(cb);
export const useQuery = (key, fn) => {
const [, toggle] = useState(false);
const [isRefetching, setIsRefetching] = useState(false);
const [err, setErr] = useState(null);
const refetch = useCallback(async (setRefetch = true) => {
cache.set(key, await fn());
return cache.subscribe(key, refetch);
const value = cache.get(key);
if (value instanceof Promise) {
} else if (value instanceof Error) {
return { data: value, isRefetching, err, refetch };
cache.set(key, fn().then((v) => cache.set(key, v)));
export const useMutation = (fn) => {
const [isMutating, setIsMutating] = useState(false);
const [err, setErr] = useState(null);
const mutate = useCallback(async (params) => {