bug: prevent multiple parallel WebLN calls
This commit is contained in:
parent
1ad0270819
commit
f30a9075a2
@ -5,7 +5,7 @@ import { TaggedRawEvent } from "@snort/nostr";
|
|||||||
import { EventKind, Tag, Event as NEvent, RelaySettings } from "@snort/nostr";
|
import { EventKind, Tag, Event as NEvent, RelaySettings } from "@snort/nostr";
|
||||||
import { RootState } from "State/Store";
|
import { RootState } from "State/Store";
|
||||||
import { HexKey, RawEvent, u256, UserMetadata, Lists } from "@snort/nostr";
|
import { HexKey, RawEvent, u256, UserMetadata, Lists } from "@snort/nostr";
|
||||||
import { bech32ToHex, unwrap } from "Util";
|
import { bech32ToHex, delay, unwrap } from "Util";
|
||||||
import { DefaultRelays, HashtagRegex } from "Const";
|
import { DefaultRelays, HashtagRegex } from "Const";
|
||||||
import { System } from "System";
|
import { System } from "System";
|
||||||
|
|
||||||
@ -398,12 +398,6 @@ export default function useEventPublisher() {
|
|||||||
|
|
||||||
let isNip07Busy = false;
|
let isNip07Busy = false;
|
||||||
|
|
||||||
const delay = (t: number) => {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
setTimeout(resolve, t);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const barrierNip07 = async <T>(then: () => Promise<T>): Promise<T> => {
|
export const barrierNip07 = async <T>(then: () => Promise<T>): Promise<T> => {
|
||||||
while (isNip07Busy) {
|
while (isNip07Busy) {
|
||||||
await delay(10);
|
await delay(10);
|
||||||
|
@ -1,25 +1,82 @@
|
|||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
|
import { delay, unwrap } from "Util";
|
||||||
|
|
||||||
interface WebLNPaymentResponse {
|
let isWebLnBusy = false;
|
||||||
paymentHash: string;
|
export const barrierWebLn = async <T>(then: () => Promise<T>): Promise<T> => {
|
||||||
|
while (isWebLnBusy) {
|
||||||
|
await delay(10);
|
||||||
|
}
|
||||||
|
isWebLnBusy = true;
|
||||||
|
try {
|
||||||
|
return await then();
|
||||||
|
} finally {
|
||||||
|
isWebLnBusy = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
interface SendPaymentResponse {
|
||||||
|
paymentHash?: string;
|
||||||
preimage: string;
|
preimage: string;
|
||||||
route: {
|
route?: {
|
||||||
total_amt: number;
|
total_amt: number;
|
||||||
total_fees: number;
|
total_fees: number;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface RequestInvoiceArgs {
|
||||||
|
amount?: string | number;
|
||||||
|
defaultAmount?: string | number;
|
||||||
|
minimumAmount?: string | number;
|
||||||
|
maximumAmount?: string | number;
|
||||||
|
defaultMemo?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface RequestInvoiceResponse {
|
||||||
|
paymentRequest: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface GetInfoResponse {
|
||||||
|
node: {
|
||||||
|
alias: string;
|
||||||
|
pubkey: string;
|
||||||
|
color?: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SignMessageResponse {
|
||||||
|
message: string;
|
||||||
|
signature: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface WebLN {
|
||||||
|
enabled: boolean;
|
||||||
|
getInfo(): Promise<GetInfoResponse>;
|
||||||
|
enable: () => Promise<void>;
|
||||||
|
makeInvoice(args: RequestInvoiceArgs): Promise<RequestInvoiceResponse>;
|
||||||
|
signMessage(message: string): Promise<SignMessageResponse>;
|
||||||
|
verifyMessage(signature: string, message: string): Promise<void>;
|
||||||
|
sendPayment: (pr: string) => Promise<SendPaymentResponse>;
|
||||||
|
}
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
interface Window {
|
interface Window {
|
||||||
webln?: {
|
webln?: WebLN;
|
||||||
enabled: boolean;
|
|
||||||
enable: () => Promise<void>;
|
|
||||||
sendPayment: (pr: string) => Promise<WebLNPaymentResponse>;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function useWebln(enable = true) {
|
export default function useWebln(enable = true) {
|
||||||
const maybeWebLn = "webln" in window ? window.webln : null;
|
const maybeWebLn =
|
||||||
|
"webln" in window && window.webln
|
||||||
|
? ({
|
||||||
|
enabled: unwrap(window.webln).enabled,
|
||||||
|
getInfo: () => barrierWebLn(() => unwrap(window.webln).getInfo()),
|
||||||
|
enable: () => barrierWebLn(() => unwrap(window.webln).enable()),
|
||||||
|
makeInvoice: args => barrierWebLn(() => unwrap(window.webln).makeInvoice(args)),
|
||||||
|
signMessage: msg => barrierWebLn(() => unwrap(window.webln).signMessage(msg)),
|
||||||
|
verifyMessage: (sig, msg) => barrierWebLn(() => unwrap(window.webln).verifyMessage(sig, msg)),
|
||||||
|
sendPayment: pr => barrierWebLn(() => unwrap(window.webln).sendPayment(pr)),
|
||||||
|
} as WebLN)
|
||||||
|
: null;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (maybeWebLn && !maybeWebLn.enabled && enable) {
|
if (maybeWebLn && !maybeWebLn.enabled && enable) {
|
||||||
|
@ -229,3 +229,9 @@ export function splitByUrl(str: string) {
|
|||||||
|
|
||||||
return str.split(urlRegex);
|
return str.split(urlRegex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const delay = (t: number) => {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
setTimeout(resolve, t);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user