import { useEffect, useState } from "react"; import { waitForRemotePeer } from "@waku/core"; import { createFullNode, createLightNode, createRelayNode } from "@waku/create"; import type { FullNode, LightNode, RelayNode, Waku } from "@waku/interfaces"; import type { BootstrapNodeOptions, CrateWakuHook, FullNodeOptions, LightNodeOptions, RelayNodeOptions, } from "./types"; type NodeFactory = (options?: T) => Promise; type CreateNodeParams = BootstrapNodeOptions & { factory: NodeFactory; }; const useCreateNode = ( params: CreateNodeParams, ): CrateWakuHook => { const { factory, options, protocols = [] } = params; const [node, setNode] = useState(null); const [isLoading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { let cancelled = false; setLoading(true); factory(options) .then(async (node) => { if (cancelled) { return; } await node.start(); await waitForRemotePeer(node, protocols); setNode(node); setLoading(false); }) .catch((err) => { setLoading(false); setError(`Failed at creating node: ${err?.message || "no message"}`); }); return () => { cancelled = true; }; }, [factory, options, protocols, setNode, setLoading, setError]); return { node, error, isLoading, }; }; /** * Create Light Node helper hook. * @param {Object} params - optional params to configure & bootstrap node * @returns {CrateWakuHook} node, loading state and error */ export const useCreateLightNode = ( params?: BootstrapNodeOptions, ) => { return useCreateNode({ ...params, factory: createLightNode, }); }; /** * Create Relay Node helper hook. * @param {Object} params - optional params to configure & bootstrap node * @returns {CrateWakuHook} node, loading state and error */ export const useCreateRelayNode = ( params?: BootstrapNodeOptions, ) => { return useCreateNode({ ...params, factory: createRelayNode, }); }; /** * Create Full Node helper hook. * @param {Object} params - optional params to configure & bootstrap node * @returns {CrateWakuHook} node, loading state and error */ export const useCreateFullNode = ( params?: BootstrapNodeOptions, ) => { return useCreateNode({ ...params, factory: createFullNode, }); };