UNPKG

lnurl-pay

Version:

Client library for lnurl-pay and lightning address

91 lines (90 loc) 3.14 kB
import { __awaiter, __generator } from "tslib"; import { decodeUrlOrAddress, isOnionUrl, checkedToSats, getJson, isUrl, sha256, } from './utils'; var TAG_PAY_REQUEST = 'payRequest'; export var requestPayServiceParams = function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) { var url, json, params; var lnUrlOrAddress = _b.lnUrlOrAddress, _c = _b.onionAllowed, onionAllowed = _c === void 0 ? false : _c, _d = _b.fetchGet, fetchGet = _d === void 0 ? getJson : _d; return __generator(this, function (_e) { switch (_e.label) { case 0: url = decodeUrlOrAddress(lnUrlOrAddress); if (!isUrl(url)) throw new Error('Invalid lnUrlOrAddress'); if (!onionAllowed && isOnionUrl(url)) throw new Error('Onion requests not allowed'); return [4 /*yield*/, fetchGet({ url: url })]; case 1: json = _e.sent(); params = parseLnUrlPayServiceResponse(json); if (!params) throw new Error('Invalid pay service params'); return [2 /*return*/, params]; } }); }); }; /** * Parse the ln service response to LnUrlPayServiceResponse * @method parseLnUrlPayServiceResponse * @param data object to parse * @return LnUrlPayServiceResponse */ var parseLnUrlPayServiceResponse = function (data) { if (data.tag !== TAG_PAY_REQUEST) return null; var callback = (data.callback + '').trim(); if (!isUrl(callback)) return null; var min = checkedToSats(Math.ceil(Number(data.minSendable || 0) / 1000)); var max = checkedToSats(Math.floor(Number(data.maxSendable) / 1000)); if (!(min && max) || min > max) return null; var metadata; var metadataHash; try { metadata = JSON.parse(data.metadata + ''); metadataHash = sha256(data.metadata + '', 'utf8'); } catch (_a) { metadata = []; metadataHash = sha256('[]', 'utf8'); } var image = ''; var description = ''; var identifier = ''; for (var i = 0; i < metadata.length; i++) { var _b = metadata[i], k = _b[0], v = _b[1]; switch (k) { case 'text/plain': description = v; break; case 'text/identifier': identifier = v; break; case 'image/png;base64': case 'image/jpeg;base64': image = 'data:' + k + ',' + v; break; } } var domain; try { domain = new URL(callback).hostname; } catch (_c) { // fail silently and let domain remain undefined if callback is not a valid URL } return { callback: callback, fixed: min === max, min: min, max: max, domain: domain, metadata: metadata, metadataHash: metadataHash, identifier: identifier, description: description, image: image, commentAllowed: Number(data.commentAllowed) || 0, rawData: data, }; };