import React, { useState } from "react"; import logo from "./logo.svg"; import "./App.scss"; import { createClient, FluenceClient } from "@fluencelabs/fluence"; import { get_external_api_multiaddr } from "@fluencelabs/aqua-ipfs"; import { stage } from "@fluencelabs/fluence-network-environment"; import { deploy_service, get_file_size, remove_service, provideFile } from "@fluencelabs/ipfs-execution"; const { create, globSource, urlSource, CID } = require('ipfs-http-client'); const relayNodes = [stage[0], stage[1], stage[2]]; const copyToClipboard = (text: string) => { navigator.clipboard.writeText(text); }; function App() { const [client, setClient] = useState(null); const [serviceId, setServiceId] = useState(null); const [peerIdInput, setPeerIdInput] = useState(""); const [relayPeerIdInput, setRelayPeerIdInput] = useState(""); const [wasm, setWasm] = useState("QmVg9EnanAbwTuEqjjuc1R2uf3AdtEkrNagSifQMkHfyNU"); const [rpcAddr, setRpcAddr] = useState(""); const [fileCID, setFileCID] = useState(""); const [fileSize, setFileSize] = useState(null); const isConnected = client !== null; const gotRpcAddr = rpcAddr !== null; const deployed = serviceId !== null; const connect = async (relayPeerId: string) => { try { let client = await createClient(relayPeerId); setClient(client); await getRpcAddr(client); } catch (err) { console.log("Client initialization failed", err); } }; const getRpcAddr = async (client: FluenceClient) => { if (client === null) { console.log("getRpcAddr client is null"); return; } let result = await get_external_api_multiaddr(client, client.relayPeerId!); console.log("getRpcAddr result", result); let rpcAddr = result.multiaddr; setRpcAddr(rpcAddr); } const deployService = async () => { console.log("wasm %s rpcAddr %s", wasm, rpcAddr); if (client === null || wasm === null || rpcAddr === null) { return; } let service_id = await deploy_service( client, client.relayPeerId!, wasm, rpcAddr, (msg, value) => console.log(msg, value), { ttl: 10000 } ); setServiceId(service_id); }; const getFileSize = async () => { if (client === null || serviceId === null || rpcAddr === null) { return; } let size = await get_file_size(client, client.relayPeerId!, fileCID, rpcAddr, serviceId, { ttl: 10000 }); if (size.success) { setFileSize(size.size.toString()); } else { setFileSize("Error: " + size.error); } }; const removeService = async () => { if (client === null || serviceId === null) { return; } await remove_service(client, client.relayPeerId!, serviceId, { ttl: 10000 }); setServiceId(null); }; console.log("isConnected gotRpcAddr deployed\n", isConnected, gotRpcAddr, deployed); if (!isConnected) { return (
logo
<>

Pick a relay

    {relayNodes.map((x) => (
  • {x.peerId}
  • ))}
); } else if (isConnected && gotRpcAddr && !deployed) { return (
logo
<>

Connected

Peer id: {client!.selfPeerId}
Relay peer id: {client!.relayPeerId}
IPFS RPC: {rpcAddr?.substring(0, 49) + "..."}

Set process_files.wasm module CID

To deploy a service, specify CID of WebAssembly module.

setWasm(e.target.value)} value={wasm!} />

Deploy ProcessFiles service

process_files.wasm will be downloaded to the Fluence node, and then a service will be dynamically created from it! After that, you will be able to use that service to get sizes of IPFS files!

) } else if (deployed) { return (
logo
<>

Deployed

Peer id: {client!.selfPeerId}
Relay peer id: {client!.relayPeerId}
process_files.wasm CID: {wasm}
ProcessFiles service ID: {serviceId}
File Size: {fileSize}

Get file size

Upload any file to IPFS node

{ rpcAddr }

paste CID here and get the size of that file via ProcessFiles service you have just deployed

setFileCID(e.target.value)} value={fileCID} />
) } else { return (
logo
<>

Unimplemented! isConnected {isConnected} deployed {deployed} wasm {wasm}

) } } export default App;