Skip to content

Commit 7b2ece2

Browse files
committed
Fixing bug
1 parent a736c37 commit 7b2ece2

File tree

3 files changed

+56
-31
lines changed

3 files changed

+56
-31
lines changed

packages/nextjs/hooks/useWebSocket.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useCallback, useEffect, useRef, useState } from "react";
2-
import { InvoiceRequest, InvoiceResponse, ServerStatus } from "~~/types/utils";
2+
import { ConnectionResponse, InvoiceRequest, InvoiceResponse, ServerStatus } from "~~/types/utils";
33

44
export const useWebSocket = (url: string) => {
55
const socket = useRef<WebSocket | null>(null);
@@ -41,12 +41,15 @@ export const useWebSocket = (url: string) => {
4141
socket.current.onerror = event => setError(event);
4242
socket.current.onmessage = event => {
4343
try {
44-
const responseData: InvoiceResponse = JSON.parse(event.data);
45-
if (responseData.status) {
46-
setStatus(responseData.status as ServerStatus);
44+
const responseData: ConnectionResponse | InvoiceResponse = JSON.parse(event.data);
45+
if (responseData && "serverStatus" in responseData) {
46+
setStatus(responseData.serverStatus as ServerStatus);
47+
return;
48+
}
49+
if (responseData && "status" in responseData) {
50+
setData(responseData);
4751
return;
4852
}
49-
setData(responseData);
5053
} catch (err) {
5154
console.error("Failed to parse message", err);
5255
}

packages/nextjs/types/utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ export interface InvoiceResponse {
1919
message: string;
2020
}
2121

22+
export interface ConnectionResponse {
23+
serverStatus: ServerStatus;
24+
}
25+
2226
export enum ServerStatus {
2327
ACTIVE = "ACTIVE",
2428
INACTIVE = "INACTIVE",

packages/server/src/app.ts

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ dotenv.config();
1313
// Verify environment variables
1414
const { PORT, LND_MACAROON, LND_SOCKET, RPC_URL, LSP_PRIVATE_KEY, CHAIN_ID } =
1515
process.env;
16-
if ( !RPC_URL || !LSP_PRIVATE_KEY || !CHAIN_ID) {
16+
if (!RPC_URL || !LSP_PRIVATE_KEY || !CHAIN_ID) {
1717
console.error("Missing environment variables");
1818
process.exit(1);
1919
}
@@ -39,7 +39,9 @@ export type CachedPayment = {
3939
contractId: string;
4040
secret: string;
4141
};
42+
4243
let cachedPayments: CachedPayment[] = [];
44+
let pendingContracts: string[] = [];
4345
// ideally this should be stored in a database, but for the sake of simplicity we are using an in-memory cache
4446

4547
console.log(`RPC Provider is running on ${RPC_URL}`);
@@ -49,17 +51,33 @@ console.log(`LSP Address: ${signer.address}`);
4951
wss.on("connection", (ws: WebSocket) => {
5052
const serverStatus = process.env.LND_MACAROON ? "ACTIVE" : "MOCK";
5153
console.log("Client connected");
52-
ws.send(JSON.stringify({ status: serverStatus, message: "Connected to server" }));
54+
ws.send(
55+
JSON.stringify({
56+
serverStatus: serverStatus,
57+
message: "Connected to server",
58+
})
59+
);
5360

5461
ws.on("message", async (message: string) => {
5562
console.log("Received message:", message);
63+
const request: InvoiceRequest = JSON.parse(message);
64+
if (pendingContracts.includes(request.contractId)) {
65+
ws.send(
66+
JSON.stringify({
67+
status: "error",
68+
message: "Contract is already being processed.",
69+
})
70+
);
71+
return;
72+
}
73+
pendingContracts.push(request.contractId);
5674
try {
57-
const request: InvoiceRequest = JSON.parse(message);
5875
await processInvoiceRequest(request, ws);
5976
} catch (error) {
6077
console.error("Error processing message:", error);
6178
ws.send(JSON.stringify({ status: "error", message: "Invalid request" }));
6279
}
80+
pendingContracts = pendingContracts.filter((c) => c !== request.contractId);
6381
});
6482

6583
ws.on("close", () => console.log("Client disconnected"));
@@ -75,22 +93,24 @@ async function processInvoiceRequest(request: InvoiceRequest, ws: WebSocket) {
7593

7694
console.log("Invoice Request Received:", request);
7795

78-
// Check if LND_MACAROON and LND_SOCKET are empty to simulate mock mode
79-
if (!process.env.LND_MACAROON && !process.env.LND_SOCKET) {
80-
console.log("Mock Server Mode: Simulating payment success");
81-
82-
// Simulate processing delay
83-
await new Promise(resolve => setTimeout(resolve, 1000)); // 1 second delay for realism
84-
85-
// Directly respond with a simulated success message
86-
ws.send(JSON.stringify({
96+
// Check if LND_MACAROON and LND_SOCKET are empty to simulate mock mode
97+
if (!process.env.LND_MACAROON && !process.env.LND_SOCKET) {
98+
console.log("Mock Server Mode: Simulating payment success");
99+
100+
// Simulate processing delay
101+
await new Promise((resolve) => setTimeout(resolve, 1000)); // 1 second delay for realism
102+
103+
// Directly respond with a simulated success message
104+
ws.send(
105+
JSON.stringify({
87106
status: "success",
88107
message: "Invoice paid successfully in mock mode.",
89-
}));
90-
91-
// Exit early since we're in mock mode
92-
return;
93-
}
108+
})
109+
);
110+
111+
// Exit early since we're in mock mode
112+
return;
113+
}
94114

95115
try {
96116
const options = { gasPrice: ethers.parseUnits("0.001", "gwei") };
@@ -135,10 +155,14 @@ async function processInvoiceRequest(request: InvoiceRequest, ws: WebSocket) {
135155
max_fee: providerConfig.maxLNFee,
136156
});
137157
console.log("Payment Response:", paymentResponse);
138-
158+
ws.send(
159+
JSON.stringify({
160+
status: "success",
161+
message: "Invoice paid successfully.",
162+
})
163+
);
139164
// Critical point, if this withdraw fails, the LSP will lose funds
140165
// We should cache the paymentResponse.secret and request.contractId and retry the withdrawal if it fails
141-
142166
await htlcContract
143167
.withdraw(request.contractId, "0x" + paymentResponse.secret, options)
144168
.then((tx: any) => {
@@ -151,13 +175,7 @@ async function processInvoiceRequest(request: InvoiceRequest, ws: WebSocket) {
151175
secret: paymentResponse.secret,
152176
});
153177
});
154-
155-
ws.send(
156-
JSON.stringify({
157-
status: "success",
158-
message: "Invoice paid successfully.",
159-
})
160-
);
178+
console.log("Payment processed successfully");
161179
} catch (error) {
162180
console.error("Error during invoice processing:", error);
163181
ws.send(

0 commit comments

Comments
 (0)