UNPKG

edgevector

Version:

Official TypeScript/JavaScript SDK for EdgeVector - Edge-native multi-paradigm database with AI-first features

283 lines (280 loc) 8.15 kB
import React, { createContext, useRef, useState, useCallback, useEffect, useContext } from 'react'; import { EdgeVector } from './index'; /** * EdgeVector React Hooks * React-specific utilities and hooks for EdgeVector */ /** * Hook for EdgeVector client instance */ function useEdgeVector(options = {}) { const clientRef = useRef(); if (!clientRef.current) { clientRef.current = new EdgeVector({ apiKey: options.apiKey, endpoint: options.endpoint, headers: options.appName ? { 'X-App-Name': options.appName } : {} }); } return clientRef.current; } /** * Hook for collection operations */ function useCollection(collectionName, options = {}) { const client = useEdgeVector(options); const [data, setData] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const collection = client.collection(collectionName); const refresh = useCallback(async (filter = {}) => { setLoading(true); setError(null); try { const results = await collection.find(filter); setData(results); } catch (err) { setError(err); } finally { setLoading(false); } }, [collection]); const insertOne = useCallback(async (document) => { try { const result = await collection.insertOne(document); await refresh(); // Refresh data return result; } catch (err) { setError(err); throw err; } }, [collection, refresh]); const updateOne = useCallback(async (filter, update) => { try { const result = await collection.updateOne(filter, update); await refresh(); // Refresh data return result; } catch (err) { setError(err); throw err; } }, [collection, refresh]); const deleteOne = useCallback(async (filter) => { try { const result = await collection.deleteOne(filter); await refresh(); // Refresh data return result; } catch (err) { setError(err); throw err; } }, [collection, refresh]); // Initial load useEffect(() => { refresh(); }, [refresh]); return { data, loading, error, collection, refresh, insertOne, updateOne, deleteOne }; } /** * Hook for vector search operations */ function useVectorSearch(collectionName, options = {}) { const client = useEdgeVector(options); const [results, setResults] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const collection = client.collection(collectionName); const search = useCallback(async (searchOptions) => { setLoading(true); setError(null); try { const searchResults = await collection.vectorSearch(searchOptions); setResults(searchResults); return searchResults; } catch (err) { setError(err); setResults([]); throw err; } finally { setLoading(false); } }, [collection]); const searchByText = useCallback(async (text, searchOptions = {}) => { return search({ text, ...searchOptions }); }, [search]); const searchByVector = useCallback(async (vector, searchOptions = {}) => { return search({ vector, ...searchOptions }); }, [search]); return { results, loading, error, search, searchByText, searchByVector }; } /** * Hook for real-time data subscriptions */ function useRealTime(collectionName, filter = {}, options = {}) { const client = useEdgeVector(options); const [data, setData] = useState(null); const [connected, setConnected] = useState(false); const [error, setError] = useState(null); const unsubscribeRef = useRef(null); useEffect(() => { const collection = client.collection(collectionName); const subscribe = async () => { try { const unsubscribe = await collection.watch(filter, (event) => { setData(event); setConnected(true); }); unsubscribeRef.current = unsubscribe; setConnected(true); } catch (err) { setError(err); setConnected(false); } }; subscribe(); return () => { if (unsubscribeRef.current) { unsubscribeRef.current(); unsubscribeRef.current = null; } setConnected(false); }; }, [client, collectionName, JSON.stringify(filter)]); return { data, connected, error }; } /** * Hook for health monitoring */ function useHealth(options = {}) { const client = useEdgeVector(options); const [health, setHealth] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const checkHealth = useCallback(async () => { setLoading(true); setError(null); try { const healthData = await client.health(); setHealth(healthData); } catch (err) { setError(err); setHealth(null); } finally { setLoading(false); } }, [client]); // Auto-refresh health every 30 seconds useEffect(() => { checkHealth(); const interval = setInterval(checkHealth, 30000); return () => clearInterval(interval); }, [checkHealth]); return { health, loading, error, refresh: checkHealth }; } /** * Hook for time series operations */ function useTimeSeries(collectionName, options = {}) { const client = useEdgeVector(options); const [data, setData] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const timeseries = client.timeseries(collectionName); const write = useCallback(async (points) => { try { await timeseries.write(points); } catch (err) { setError(err); throw err; } }, [timeseries]); const query = useCallback(async (queryOptions) => { setLoading(true); setError(null); try { const results = await timeseries.query(queryOptions); setData(results); return results; } catch (err) { setError(err); setData([]); throw err; } finally { setLoading(false); } }, [timeseries]); const detectAnomalies = useCallback(async (metric, detectOptions = {}) => { setLoading(true); setError(null); try { const anomalies = await timeseries.detectAnomalies(metric, detectOptions); return anomalies; } catch (err) { setError(err); throw err; } finally { setLoading(false); } }, [timeseries]); return { data, loading, error, write, query, detectAnomalies }; } const EdgeVectorContext = createContext(null); function EdgeVectorProvider({ client, children }) { return React.createElement(EdgeVectorContext.Provider, { value: client }, children); } function useEdgeVectorContext() { const client = useContext(EdgeVectorContext); if (!client) { throw new Error('useEdgeVectorContext must be used within an EdgeVectorProvider'); } return client; } export { EdgeVectorProvider, useCollection, useEdgeVector, useEdgeVectorContext, useHealth, useRealTime, useTimeSeries, useVectorSearch }; //# sourceMappingURL=react.esm.js.map