edgevector
Version:
Official TypeScript/JavaScript SDK for EdgeVector - Edge-native multi-paradigm database with AI-first features
283 lines (280 loc) • 8.15 kB
JavaScript
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