Skip to content
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 20 additions & 3 deletions next.config.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,24 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
serverExternalPackages: ['wagmi', '@wagmi/core', '@wagmi/connectors', '@walletconnect/ethereum-provider', '@walletconnect/universal-provider', 'pino', 'pino-pretty', 'thread-stream'],
serverExternalPackages: [
'wagmi',
'@wagmi/core',
'@wagmi/connectors',
'@walletconnect/ethereum-provider',
'@walletconnect/universal-provider',
'pino',
'pino-pretty',
'thread-stream',
],
turbopack: {
resolveAlias: {
fs: { browser: './src/empty.js' },
net: { browser: './src/empty.js' },
tls: { browser: './src/empty.js' },
dgram: { browser: './src/empty.js' },
dns: { browser: './src/empty.js' },
'rdf-canonize-native': { browser: './src/empty.js' },
},
rules: {
'*.svg': {
loaders: ['@svgr/webpack'],
Expand All @@ -17,8 +34,8 @@ const nextConfig = {
net: false,
tls: false,
dgram: false,
dns: false
}
dns: false,
};
}
config.module.rules.push({
test: /\.svg$/,
Expand Down
24 changes: 1 addition & 23 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,31 +21,11 @@
"@emotion/styled": "^11.14.1",
"@gitbook/embed": "^0.4.0",
"@google/generative-ai": "^0.24.1",
"@libp2p/autonat": "^3.0.9",
"@libp2p/bootstrap": "^12.0.10",
"@libp2p/circuit-relay-v2": "^4.1.2",
"@libp2p/crypto": "^5.1.13",
"@libp2p/dcutr": "^3.0.9",
"@libp2p/identify": "^4.0.9",
"@libp2p/kad-dht": "^16.1.2",
"@libp2p/keychain": "^6.0.9",
"@libp2p/mdns": "^12.0.10",
"@libp2p/peer-id": "^6.0.4",
"@libp2p/peer-id-factory": "^4.2.4",
"@libp2p/ping": "^3.0.9",
"@libp2p/pubsub": "^10.1.18",
"@libp2p/pubsub-peer-discovery": "^12.0.0",
"@libp2p/tcp": "^11.0.9",
"@libp2p/tls": "^3.0.10",
"@libp2p/upnp-nat": "^4.0.9",
"@libp2p/utils": "^7.0.12",
"@libp2p/websockets": "^10.1.2",
"@mui/icons-material": "^7.3.6",
"@mui/material": "^7.3.6",
"@mui/x-data-grid": "^8.14.1",
"@multiformats/multiaddr": "^12.2.3",
"@oceanprotocol/contracts": "2.6.0",
"@oceanprotocol/lib": "5.1.1",
"@oceanprotocol/lib": "7.0.0-next.12",
"@ramp-network/ramp-instant-sdk": "^6.2.0",
"@tanstack/react-query": "^5.28.4",
"@wagmi/core": "^3.0.0",
Expand All @@ -65,7 +45,6 @@
"jparticles": "^3.5.0",
"json-edit-react": "^1.29.0",
"jszip": "^3.10.1",
"libp2p": "^3.1.2",
"micromodal": "^0.4.10",
"myetherwallet-blockies": "^0.1.1",
"next": "16.1.7",
Expand All @@ -76,7 +55,6 @@
"react-dom": "^18",
"react-toastify": "^11.0.5",
"recharts": "^3.3.0",
"uint8arrays": "^4.0.6",
"wagmi": "^3.1.0",
"yup": "^1.7.1"
},
Expand Down
14 changes: 3 additions & 11 deletions src/components/button/download-logs-button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ export const DownloadLogsButton = ({ job }: DownloadLogsButtonProps) => {

const { token } = await createAuthToken({
consumerAddress: account.address,
multiaddrsOrPeerId: job.peerId,
nodeUri: job.peerId,
signMessage,
});

const jobStatus = await getComputeJobStatus(job.peerId, jobId, account.address);
const jobStatus = await getComputeJobStatus(job.peerId, jobId, token);
const logFiles: any[] = jobStatus?.[0]?.results?.filter((result: any) => result.filename.includes('.log')) ?? [];

if (logFiles.length === 0) {
Expand All @@ -52,15 +52,7 @@ export const DownloadLogsButton = ({ job }: DownloadLogsButtonProps) => {
for (let i = 0; i < logFiles.length; i++) {
setDownloadProgress({ current: i, total: logFiles.length });

const generator = streamComputeResult(
job.peerId,
jobId,
logFiles[i].index,
token,
account.address,
abortController.signal,
logFiles[i].filesize ?? 0
);
const generator = await streamComputeResult(job.peerId, token, jobId, logFiles[i].index);

const chunks: Uint8Array[] = [];
for await (const chunk of generator) {
Expand Down
20 changes: 6 additions & 14 deletions src/components/button/download-result-button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,30 +27,22 @@ export const DownloadResultButton = ({ job }: DownloadResultButtonProps) => {
const jobId = (job.environment ?? job.environmentId).split('-')[0] + '-' + job.jobId;
setIsDownloading(true);

const jobStatus = await getComputeJobStatus(job.peerId, jobId, account.address);
const archive = jobStatus?.[0]?.results?.find((result: any) => result.filename.includes('.tar'));
const filesize: number = archive?.filesize ?? 0;

const { token } = await createAuthToken({
consumerAddress: account.address,
multiaddrsOrPeerId: job.peerId,
nodeUri: job.peerId,
signMessage,
});

const jobStatus = await getComputeJobStatus(job.peerId, jobId, token);
const archive = jobStatus?.[0]?.results?.find((result: any) => result.filename.includes('.tar'));
const filesize: number = archive?.filesize ?? 0;

const abortController = new AbortController();
abortRef.current = abortController;

setDownloadProgress({ bytes: 0, total: filesize });

const generator = streamComputeResult(
job.peerId,
jobId,
archive?.index,
token,
account.address,
abortController.signal,
filesize
);
const generator = await streamComputeResult(job.peerId, token, jobId, archive?.index);

const showSaveFilePicker = (window as any).showSaveFilePicker as
| ((options?: any) => Promise<FileSystemFileHandle>)
Expand Down
7 changes: 3 additions & 4 deletions src/components/node-details/node-info.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ const NodeInfo: React.FC<NodeInfoProps> = ({ envs, node, nodeOnline }) => {
await fetchConfig({
consumerAddress: account.address,
expiryTimestamp: Date.now() + 5 * 60 * 1000, // 5 minutes expiry
multiaddrsOrPeerId: node.id,
nodeUri: node.id,
signMessage,
});
} catch (error) {
Expand All @@ -121,7 +121,7 @@ const NodeInfo: React.FC<NodeInfoProps> = ({ envs, node, nodeOnline }) => {
await pushConfig({
consumerAddress: account.address,
expiryTimestamp: Date.now() + 5 * 60 * 1000, // 5 minutes expiry
multiaddrsOrPeerId: node.id,
nodeUri: node.id,
signMessage,
config,
});
Expand Down Expand Up @@ -163,8 +163,7 @@ const NodeInfo: React.FC<NodeInfoProps> = ({ envs, node, nodeOnline }) => {
try {
const logs = await getNodeLogs({
consumerAddress: account.address,
expiryTimestamp: Date.now() + 5 * 60 * 1000,
multiaddrsOrPeerId: node.id,
nodeUri: node.id,
params: { startTime, endTime, maxLogs },
signMessage,
});
Expand Down
8 changes: 4 additions & 4 deletions src/components/run-job/select-resources.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ const SelectResources = ({ environment, freeCompute, token }: SelectResourcesPro
setSelectedResources,
} = useRunJobContext();

const { node: p2pNode } = useP2P();
const { isReady: p2pReady } = useP2P();

const [initComputeError, setInitComputeError] = useState<unknown | null>(null);
const [isLoadingCost, setIsLoadingCost] = useState(false);
Expand Down Expand Up @@ -198,7 +198,7 @@ const SelectResources = ({ environment, freeCompute, token }: SelectResourcesPro
environment,
freeCompute,
maxJobDurationSeconds: maxJobDurationSec < 1 ? 1 : Math.ceil(maxJobDurationSec),
multiaddrsOrPeerId,
multiaddrsOrPeerId: multiaddrsOrPeerId!,
onError: (error) => setInitComputeError(error),
resources,
tokenAddress: token?.address,
Expand Down Expand Up @@ -228,7 +228,7 @@ const SelectResources = ({ environment, freeCompute, token }: SelectResourcesPro
clearTimeout(costEstimateTimeoutRef.current);
}
};
}, [estimateCost, fetchEstimatedCost]);
}, [estimateCost]);

const selectAllGpus = () => {
formik.setFieldValue(
Expand Down Expand Up @@ -300,7 +300,7 @@ const SelectResources = ({ environment, freeCompute, token }: SelectResourcesPro
</h3>
);
}
if (!p2pNode || (!estimatedTotalCost && estimatedTotalCost !== 0)) {
if (!p2pReady || (!estimatedTotalCost && estimatedTotalCost !== 0)) {
return (
<h3 className={styles.estimationMessage}>
<CircularProgress size={24} />
Expand Down
7 changes: 3 additions & 4 deletions src/components/run-job/summary.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,7 @@
const sufficientEscrow = (escrowBalance ?? 0) >= estimatedTotalCost;
const suffficientAuthorized =
Number(authorizations?.maxLockedAmount ?? 0) >= estimatedTotalCost + currentLockedAmount;
const enoughLockSeconds =
Number(authorizations?.maxLockSeconds ?? 0) >= (minLockSeconds ?? 0);
const enoughLockSeconds = Number(authorizations?.maxLockSeconds ?? 0) >= (minLockSeconds ?? 0);
const hasAvailableLockSlot =
Number(authorizations?.currentLocks ?? 0) < Number(authorizations?.maxLockCounts ?? 0);
if (sufficientEscrow && suffficientAuthorized && enoughLockSeconds && hasAvailableLockSlot) {
Expand All @@ -88,7 +87,7 @@
router.replace({ pathname: '/run-job/payment', query: router.query });
}
}
}, [

Check warning on line 90 in src/components/run-job/summary.tsx

View workflow job for this annotation

GitHub Actions / lint

React Hook useCallback has a missing dependency: 'minLockSeconds'. Either include it or remove the dependency array
freeCompute,
token,
ocean,
Expand Down Expand Up @@ -119,7 +118,7 @@
try {
const { token: generatedAuthToken } = await createAuthToken({
consumerAddress: account.address,
multiaddrsOrPeerId: multiaddrsOrPeerId!,
nodeUri: multiaddrsOrPeerId!,
signMessage,
});
setAuthToken(generatedAuthToken);
Expand All @@ -139,7 +138,7 @@
if (!authToken || !account.address || !ocean) {
return;
}
const peerMultiaddr = await getPeerMultiaddr(multiaddrsOrPeerId!);
const peerMultiaddr = await getPeerMultiaddr(nodeInfo.id);
const resources = [
...gpus.map((availableGpu) => ({
id: availableGpu.id,
Expand Down
8 changes: 4 additions & 4 deletions src/components/run-node/node-connection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const NodeConnection = () => {

const { account } = useOceanAccount();

const { clearRunNodeSelection, connectToNode, p2pNode, peerId } = useRunNodeContext();
const { clearRunNodeSelection, connectToNode, isP2PReady, peerId } = useRunNodeContext();

// This is a workaround for the modal not closing after connecting
// https://github.com/alchemyplatform/aa-sdk/issues/2327
Expand Down Expand Up @@ -81,11 +81,11 @@ const NodeConnection = () => {
<Button
className="alignSelfEnd"
color="accent1"
contentBefore={p2pNode ? <LinkIcon /> : null}
loading={!p2pNode || formik.isSubmitting}
contentBefore={isP2PReady ? <LinkIcon /> : null}
loading={!isP2PReady || formik.isSubmitting}
onClick={formik.submitForm}
>
{p2pNode ? 'Connect' : 'Initializing...'}
{isP2PReady ? 'Connect' : 'Initializing...'}
</Button>
</>
)}
Expand Down
31 changes: 17 additions & 14 deletions src/context/run-job-context.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import {
NodeEnvironments,
} from '@/types/environments';
import { roundTokenAmount } from '@/utils/formatters';
import { multiaddr } from '@multiformats/multiaddr';
import axios from 'axios';
import { useSearchParams } from 'next/navigation';
import { createContext, ReactNode, useCallback, useContext, useEffect, useState } from 'react';
Expand All @@ -36,7 +35,7 @@ type RunJobContextType = {
environment: ComputeEnvironment;
freeCompute: boolean;
maxJobDurationSeconds: number;
multiaddrsOrPeerId: MultiaddrsOrPeerId;
multiaddrsOrPeerId: string[] | string;
onError?: (error: unknown) => void;
onSuccess?: (cost: number, minLockSeconds: number) => void;
resources: { id: string; amount: number }[];
Expand Down Expand Up @@ -73,7 +72,7 @@ const RunJobContext = createContext<RunJobContextType | undefined>(undefined);

export const RunJobProvider = ({ children }: { children: ReactNode }) => {
const { provider } = useOceanAccount();
const { initializeCompute, node: p2pNode } = useP2P();
const { initializeCompute, isReady: p2pIsReady } = useP2P();

const searchParams = useSearchParams();
const [estimatedTotalCost, setEstimatedTotalCost] = useState<number | null>(null);
Expand Down Expand Up @@ -134,8 +133,10 @@ export const RunJobProvider = ({ children }: { children: ReactNode }) => {
setSelectedEnv(environment);
setFreeCompute(freeCompute);
setNodeInfo(nodeInfo);
const multiaddrs = new Set(nodeInfo?.multiaddrs?.filter(Boolean).filter(multiaddr));
setMultiaddrsOrPeerId(multiaddrs.size > 0 ? Array.from(multiaddrs) : nodeInfo?.id);

const addrs = (nodeInfo.multiaddrs ?? []).map((a) => (a.includes('/p2p/') ? a : `${a}/p2p/${nodeInfo.id}`));
setMultiaddrsOrPeerId(addrs.length > 0 ? addrs : nodeInfo.id);

if (resources) {
setSelectedResources(resources);
}
Expand Down Expand Up @@ -169,7 +170,7 @@ export const RunJobProvider = ({ children }: { children: ReactNode }) => {
environment: ComputeEnvironment;
freeCompute: boolean;
maxJobDurationSeconds: number;
multiaddrsOrPeerId: MultiaddrsOrPeerId;
multiaddrsOrPeerId: string[] | string;
onError?: (error: unknown) => void;
onSuccess?: (cost: number, minLockSeconds: number) => void;
resources: { id: string; amount: number }[];
Expand All @@ -179,7 +180,7 @@ export const RunJobProvider = ({ children }: { children: ReactNode }) => {
setEstimatedTotalCost(0);
return;
}
if (!provider || !p2pNode) {
if (!provider || !p2pIsReady) {
return;
}
try {
Expand All @@ -190,8 +191,7 @@ export const RunJobProvider = ({ children }: { children: ReactNode }) => {
multiaddrsOrPeerId,
environment.consumerAddress,
resources,
CHAIN_ID,
provider
CHAIN_ID
);
setEstimatedTotalCost(roundTokenAmount(Number(cost), tokenAddress, 'up'));
setMinLockSeconds(minLockSeconds);
Expand All @@ -201,7 +201,7 @@ export const RunJobProvider = ({ children }: { children: ReactNode }) => {
console.error('Failed to fetch estimated cost:', error);
}
},
[initializeCompute, p2pNode, provider]
[initializeCompute, p2pIsReady, provider]
);

/**
Expand Down Expand Up @@ -241,7 +241,6 @@ export const RunJobProvider = ({ children }: { children: ReactNode }) => {
);
const foundEnv = foundNode?.computeEnvironments.environments.find((env) => env.id === queryEnv);
if (foundNode && foundEnv) {
const multiaddrs = new Set(foundNode?.multiaddrs?.filter(Boolean).filter(multiaddr));
const queryFree = searchParams.get('free') === 'true';
const qJobDuration = searchParams.get('maxJobDuration');
const queryGpusArray = searchParams.getAll('gpus[]');
Expand Down Expand Up @@ -290,6 +289,10 @@ export const RunJobProvider = ({ children }: { children: ReactNode }) => {
nodeInfo: foundNode,
resources,
});
const foundAddrs = (foundNode.multiaddrs ?? []).map((a) =>
a.includes('/p2p/') ? a : `${a}/p2p/${foundNode.id}`
);
const resolvedNodeUri = foundAddrs.length > 0 ? foundAddrs : foundNode.id;
if (!queryFree) {
const queryToken = searchParams.get('token');
if (queryToken) {
Expand All @@ -298,7 +301,7 @@ export const RunJobProvider = ({ children }: { children: ReactNode }) => {
environment: foundEnv,
freeCompute: queryFree,
maxJobDurationSeconds: resources.maxJobDurationSeconds,
multiaddrsOrPeerId: multiaddrs.size > 0 ? Array.from(multiaddrs) : foundNode.id,
multiaddrsOrPeerId: resolvedNodeUri,
resources: [
...(resources.cpuId && resources.cpuCores ? [{ id: resources.cpuId, amount: resources.cpuCores }] : []),
...(resources.ramId && resources.ram ? [{ id: resources.ramId, amount: resources.ram }] : []),
Expand Down Expand Up @@ -332,13 +335,13 @@ export const RunJobProvider = ({ children }: { children: ReactNode }) => {
const queryFree = searchParams.get('free') === 'true';
// For paid compute, also wait for p2p node and provider in order to fetch the cost
// For free compute, they are not needed
if (queryFree || (p2pNode && provider)) {
if (queryFree || (p2pIsReady && provider)) {
setHydrateFromUrlStarted(true);
hydrateContextFromQueryParams();
}
}
}
}, [hydrateContextFromQueryParams, hydrateFromUrlStarted, p2pNode, provider, searchParams]);
}, [hydrateContextFromQueryParams, hydrateFromUrlStarted, p2pIsReady, provider, searchParams]);

return (
<RunJobContext.Provider
Expand Down
Loading
Loading