Files
breez-sdk-liquid/packages/react-native/src/index.ts
ok300 434fb80d49 Add shutdown signal (#238)
* Add shutdown signal handling

Revert periodic sync interval change

Revert keep-alive interval change

CLI: Add disconnect command

SDK: Add scaffolding for is_started, shutdown()

Simplify instance init

* Rebase on savage-async-ws branch

* Avoid waiting when shutdown signal is received in the sync loop

* Directly use shutdown signal in background threads

* Acquire is_started lock at the very beginning of start()

* Fix cargo clippy warnings

* Update RN generator (kt): set bindingLiquidSdk to null on disconnect()

* Update RN generator (swift): set bindingLiquidSdk to nil on disconnect()

* Startup: only run foreground sync() if this could be the first run

* Start a sync() in background, before regular sync() loop

* Remove ensure_started check from start()

* Add bindings for disconnect()

* Remove foreground sync condition from startup

* Simplify background sync loop
2024-05-30 08:04:30 +00:00

199 lines
4.9 KiB
TypeScript

import { NativeModules, Platform, NativeEventEmitter } from "react-native"
const LINKING_ERROR =
`The package 'react-native-breez-liquid-sdk' doesn't seem to be linked. Make sure: \n\n` +
Platform.select({ ios: "- You have run 'pod install'\n", default: "" }) +
"- You rebuilt the app after installing the package\n" +
"- You are not using Expo managed workflow\n"
const BreezLiquidSDK = NativeModules.RNBreezLiquidSDK
? NativeModules.RNBreezLiquidSDK
: new Proxy(
{},
{
get() {
throw new Error(LINKING_ERROR)
}
}
)
const BreezLiquidSDKEmitter = new NativeEventEmitter(BreezLiquidSDK)
export interface BackupRequest {
backupPath?: string
}
export interface ConnectRequest {
mnemonic: string
network: Network
dataDir?: string
}
export interface GetInfoRequest {
withScan: boolean
}
export interface GetInfoResponse {
balanceSat: number
pendingSendSat: number
pendingReceiveSat: number
pubkey: string
}
export interface Payment {
txId: string
swapId?: string
timestamp: number
amountSat: number
feesSat?: number
preimage?: string
refundTxId?: string
refundTxAmountSat?: number
paymentType: PaymentType
status: PaymentState
}
export interface PrepareReceiveRequest {
payerAmountSat: number
}
export interface PrepareReceiveResponse {
payerAmountSat: number
feesSat: number
}
export interface PrepareSendRequest {
invoice: string
}
export interface PrepareSendResponse {
invoice: string
feesSat: number
}
export interface ReceivePaymentResponse {
id: string
invoice: string
}
export interface RestoreRequest {
backupPath?: string
}
export interface SendPaymentResponse {
txid: string
}
export enum LiquidSdkEventVariant {
PAYMENT_FAILED = "paymentFailed",
PAYMENT_PENDING = "paymentPending",
PAYMENT_REFUNDED = "paymentRefunded",
PAYMENT_REFUND_PENDING = "paymentRefundPending",
PAYMENT_SUCCEED = "paymentSucceed",
PAYMENT_WAITING_CONFIRMATION = "paymentWaitingConfirmation",
SYNCED = "synced"
}
export type LiquidSdkEvent = {
type: LiquidSdkEventVariant.PAYMENT_FAILED,
details: Payment
} | {
type: LiquidSdkEventVariant.PAYMENT_PENDING,
details: Payment
} | {
type: LiquidSdkEventVariant.PAYMENT_REFUNDED,
details: Payment
} | {
type: LiquidSdkEventVariant.PAYMENT_REFUND_PENDING,
details: Payment
} | {
type: LiquidSdkEventVariant.PAYMENT_SUCCEED,
details: Payment
} | {
type: LiquidSdkEventVariant.PAYMENT_WAITING_CONFIRMATION,
details: Payment
} | {
type: LiquidSdkEventVariant.SYNCED
}
export enum Network {
LIQUID = "liquid",
LIQUID_TESTNET = "liquidTestnet"
}
export enum PaymentState {
CREATED = "created",
PENDING = "pending",
COMPLETE = "complete",
FAILED = "failed"
}
export enum PaymentType {
RECEIVE = "receive",
SEND = "send"
}
export type EventListener = (e: LiquidSdkEvent) => void
export const connect = async (req: ConnectRequest): Promise<void> => {
const response = await BreezLiquidSDK.connect(req)
return response
}
export const addEventListener = async (listener: EventListener): Promise<string> => {
const response = await BreezLiquidSDK.addEventListener()
BreezLiquidSDKEmitter.addListener(`event-${response}`, listener)
return response
}
export const removeEventListener = async (id: string): Promise<void> => {
await BreezLiquidSDK.removeEventListener(id)
}
export const getInfo = async (req: GetInfoRequest): Promise<GetInfoResponse> => {
const response = await BreezLiquidSDK.getInfo(req)
return response
}
export const prepareSendPayment = async (req: PrepareSendRequest): Promise<PrepareSendResponse> => {
const response = await BreezLiquidSDK.prepareSendPayment(req)
return response
}
export const sendPayment = async (req: PrepareSendResponse): Promise<SendPaymentResponse> => {
const response = await BreezLiquidSDK.sendPayment(req)
return response
}
export const prepareReceivePayment = async (req: PrepareReceiveRequest): Promise<PrepareReceiveResponse> => {
const response = await BreezLiquidSDK.prepareReceivePayment(req)
return response
}
export const receivePayment = async (req: PrepareReceiveResponse): Promise<ReceivePaymentResponse> => {
const response = await BreezLiquidSDK.receivePayment(req)
return response
}
export const listPayments = async (): Promise<Payment[]> => {
const response = await BreezLiquidSDK.listPayments()
return response
}
export const sync = async (): Promise<void> => {
await BreezLiquidSDK.sync()
}
export const backup = async (req: BackupRequest): Promise<void> => {
await BreezLiquidSDK.backup(req)
}
export const restore = async (req: RestoreRequest): Promise<void> => {
await BreezLiquidSDK.restore(req)
}
export const disconnect = async (): Promise<void> => {
await BreezLiquidSDK.disconnect()
}