From cf57075a38361076fe3388197d21ca8780007964 Mon Sep 17 00:00:00 2001 From: Roland Bewick Date: Tue, 17 Jan 2023 22:00:35 +0700 Subject: [PATCH] feat: add webln.request --- src/client.ts | 22 ++++++++++++++-------- src/index.ts | 7 ++++--- src/provider.ts | 19 +++++++++++++++++-- src/request-method.ts | 26 ++++++++++++++++++++++++++ src/types.ts | 3 +++ 5 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 src/request-method.ts create mode 100644 src/types.ts diff --git a/src/client.ts b/src/client.ts index 9471ded..5cb1939 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,5 +1,5 @@ -import { WebLNProvider } from './provider'; -import { MissingProviderError } from './errors'; +import { WebLNProvider } from "./provider"; +import { MissingProviderError } from "./errors"; /** * Everything needed to get and set providers on the client. @@ -12,19 +12,25 @@ export interface GetProviderParameters { pubkey?: string; } -export function requestProvider(_: GetProviderParameters = {}): Promise { +// TODO: expose webln.enable() response in return type +export function requestProvider( + _: GetProviderParameters = {} +): Promise { return new Promise((resolve, reject) => { - if (typeof window === 'undefined') { - return reject(new Error('Must be called in a browser context')); + if (typeof window === "undefined") { + return reject(new Error("Must be called in a browser context")); } const webln: WebLNProvider = (window as any).webln; if (!webln) { - return reject(new MissingProviderError('Your browser has no WebLN provider')); + return reject( + new MissingProviderError("Your browser has no WebLN provider") + ); } - webln.enable() + webln + .enable() .then(() => resolve(webln)) - .catch(err => reject(err)); + .catch((err) => reject(err)); }); } diff --git a/src/index.ts b/src/index.ts index c6d9d59..b55745c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,4 @@ -export * from './client'; -export * from './provider'; -export * from './errors'; +export * from "./client"; +export * from "./provider"; +export * from "./errors"; +export * from "./request-method"; diff --git a/src/provider.ts b/src/provider.ts index fe400c3..faf373e 100644 --- a/src/provider.ts +++ b/src/provider.ts @@ -2,6 +2,9 @@ * Everything needed to implement your own provider. */ +import { RequestMethod } from "./request-method"; +import { AdditionalString } from "./types"; + export interface WebLNNode { alias: string; pubkey: string; @@ -10,6 +13,9 @@ export interface WebLNNode { export interface GetInfoResponse { node: WebLNNode; + version: string; + supports: ("lightning" | AdditionalString)[]; + methods: RequestMethod[]; } export interface SendPaymentResponse { @@ -39,12 +45,21 @@ export interface SignMessageResponse { signature: string; } +export interface EnableResponse { + enabled: boolean; + remember: boolean; +} + export interface WebLNProvider { - enable(): Promise; + enable(): Promise; getInfo(): Promise; sendPayment(paymentRequest: string): Promise; keysend(args: KeysendArgs): Promise; - makeInvoice(args: string | number | RequestInvoiceArgs): Promise; + makeInvoice( + args: string | number | RequestInvoiceArgs + ): Promise; signMessage(message: string): Promise; verifyMessage(signature: string, message: string): Promise; + // TODO: improve request typings + request(method: RequestMethod, args?: unknown): Promise; } diff --git a/src/request-method.ts b/src/request-method.ts new file mode 100644 index 0000000..82c8433 --- /dev/null +++ b/src/request-method.ts @@ -0,0 +1,26 @@ +import { AdditionalString } from "./types"; + +export type RequestMethod = + | "getinfo" + | "listchannels" + | "listinvoices" + | "channelbalance" + | "walletbalance" + | "openchannel" + | "connectpeer" + | "disconnectpeer" + | "estimatefee" + | "getchaninfo" + | "getnetworkinfo" + | "getnodeinfo" + | "gettransactions" + | "listpayments" + | "listpeers" + | "lookupinvoice" + | "queryroutes" + | "verifymessage" + | "sendtoroute" + | "decodepayreq" + | "routermc" + | "addinvoice" + | AdditionalString; diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..43c3e87 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,3 @@ +// Workaround for code completion to account for values this library doesn't know about yet. +// This allows TypeScript to understand that AdditionalString is a string that is distinct from the string literal type. +export type AdditionalString = string & { _additionalString?: never };