import { createEventSignal } from '@solid-primitives/event-listener' import { makePersisted } from '@solid-primitives/storage' import { createReconnectingWS } from '@solid-primitives/websocket' import ky from 'ky' import _ from 'lodash' export const [selectedEndpoint, setSelectedEndpoint] = makePersisted( createSignal(''), { name: 'selectedEndpoint', storage: localStorage, }, ) export const [endpointList, setEndpointList] = makePersisted( createSignal< { id: string url: string secret: string }[] >([]), { name: 'endpointList', storage: localStorage }, ) export const useRequest = () => { const e = endpoint() if (!e) { return ky.create({}) } const headers = new Headers() if (e.secret) { headers.set('Authorization', `Bearer ${e.secret}`) } return ky.create({ prefixUrl: e.url, headers, }) } export const endpoint = () => endpointList().find(({ id }) => id === selectedEndpoint()) export const secret = () => endpoint()?.secret export const wsEndpointURL = () => _.trimEnd(new URL(endpoint()?.url ?? '').href.replace('http', 'ws'), '/') export const useWsRequest = ( path: string, queries: Record = {}, ) => { const queryParams = new URLSearchParams(queries) queryParams.set('token', secret() ?? '') const ws = createReconnectingWS( `${wsEndpointURL()}/${path}?${queryParams.toString()}`, ) const event = createEventSignal<{ message: MessageEvent }>(ws, 'message') return createMemo(() => { const e = event() if (!e) { return null } return JSON.parse(event()?.data) }) }