From 57d36eaa28817eb74f09dc762a340cbea5bb7e6d Mon Sep 17 00:00:00 2001 From: Bufo <32884105+bufo24@users.noreply.github.com> Date: Thu, 26 Mar 2026 13:54:22 +0100 Subject: [PATCH] fix: patch tapd-api to make TLS cert optional (#678) Co-authored-by: Bufo Co-authored-by: Claude Opus 4.6 (1M context) --- Dockerfile | 1 + package-lock.json | 193 ++++++++++++++++++ package.json | 5 + ...@lightningpolar+tapd-api+0.7.0-alpha.patch | 35 ++++ src/server/modules/node/litd/litd.service.ts | 2 +- 5 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 patches/@lightningpolar+tapd-api+0.7.0-alpha.patch diff --git a/Dockerfile b/Dockerfile index 03582f19..0bcc82f9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,6 +16,7 @@ RUN apk add --update --no-cache \ # Install app dependencies COPY package.json package-lock.json ./ +COPY patches/ ./patches/ RUN --mount=type=cache,target=/root/.npm npm ci # --------------- diff --git a/package-lock.json b/package-lock.json index 6556bfa5..aba99f2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -117,6 +117,7 @@ "husky": "^9.1.7", "jest": "^30.3.0", "lint-staged": "^16.3.3", + "patch-package": "^8.0.1", "prettier": "^3.8.1", "rimraf": "^6.1.3", "ts-jest": "^29.4.6", @@ -9172,6 +9173,13 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -12341,6 +12349,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2" + } + }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", @@ -14767,6 +14785,26 @@ "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", "license": "BSD-2-Clause" }, + "node_modules/json-stable-stringify": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -14816,6 +14854,16 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", @@ -14899,6 +14947,16 @@ "json-buffer": "3.0.1" } }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -16397,6 +16455,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object-treeify": { "version": "1.1.33", "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", @@ -16718,6 +16786,121 @@ "node": ">= 0.4.0" } }, + "node_modules/patch-package": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.1.tgz", + "integrity": "sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^10.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.2.4", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/patch-package/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/patch-package/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/patch-package/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/patch-package/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -19511,6 +19694,16 @@ "integrity": "sha512-ZjCZK0rppSBu7rjHYDYsEaMOIbbT+nWF57hKkv4IUmZWBNrBWBOjIElc0mKRgLM8bm7x/BBlof6t2gi/Oq/Asw==", "license": "MIT" }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", diff --git a/package.json b/package.json index e2981b14..2bca80d0 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "lint": "eslint \"{src,apps,libs,test}/**/*.{ts,tsx}\" --fix", "lint:check": "eslint \"{src,apps,libs,test}/**/*.{ts,tsx}\"", "lint-staged": "lint-staged", + "postinstall": "patch-package", "prepare": "husky", "start": "cross-env NODE_ENV=production nest start", "start:debug": "nest start --debug --watch", @@ -165,6 +166,7 @@ "husky": "^9.1.7", "jest": "^30.3.0", "lint-staged": "^16.3.3", + "patch-package": "^8.0.1", "prettier": "^3.8.1", "rimraf": "^6.1.3", "ts-jest": "^29.4.6", @@ -172,5 +174,8 @@ "tsconfig-paths": "^4.2.0", "typescript": "^5.9.3", "vite": "^7.3.1" + }, + "patchedDependencies": { + "@lightningpolar/tapd-api@0.7.0-alpha": "patches/@lightningpolar+tapd-api+0.7.0-alpha.patch" } } diff --git a/patches/@lightningpolar+tapd-api+0.7.0-alpha.patch b/patches/@lightningpolar+tapd-api+0.7.0-alpha.patch new file mode 100644 index 00000000..51f855cf --- /dev/null +++ b/patches/@lightningpolar+tapd-api+0.7.0-alpha.patch @@ -0,0 +1,35 @@ +diff --git a/node_modules/@lightningpolar/tapd-api/dist/index.d.ts b/node_modules/@lightningpolar/tapd-api/dist/index.d.ts +index 3bc0be7..6041fcf 100644 +--- a/node_modules/@lightningpolar/tapd-api/dist/index.d.ts ++++ b/node_modules/@lightningpolar/tapd-api/dist/index.d.ts +@@ -19,7 +19,7 @@ export interface TapdClientOptions { + /** + * @cert tapd's TLS certificate in HEX format. + */ +- cert: string; ++ cert?: string; + } + /** + * @TaprootAssetsRpcApis The tapd RPC APIs. +diff --git a/node_modules/@lightningpolar/tapd-api/dist/proto.js b/node_modules/@lightningpolar/tapd-api/dist/proto.js +index 22bb802..ba6f149 100644 +--- a/node_modules/@lightningpolar/tapd-api/dist/proto.js ++++ b/node_modules/@lightningpolar/tapd-api/dist/proto.js +@@ -36,8 +36,15 @@ const loadProto = (protoFileName, options) => { + metadata.add('macaroon', options.macaroon); + return callback(null, metadata); + }); +- const channelCredentials = grpc.credentials.createSsl(Buffer.from(options.cert, 'hex')); +- const credentials = grpc.credentials.combineChannelCredentials(channelCredentials, callCredentials); ++ let credentials; ++ if (options.cert) { ++ const channelCredentials = grpc.credentials.createSsl(Buffer.from(options.cert, 'hex')); ++ credentials = grpc.credentials.combineChannelCredentials(channelCredentials, callCredentials); ++ } ++ else { ++ const channelCredentials = grpc.credentials.createSsl(); ++ credentials = grpc.credentials.combineChannelCredentials(channelCredentials, callCredentials); ++ } + const params = { + 'grpc.max_receive_message_length': -1, + 'grpc.max_send_message_length': -1, diff --git a/src/server/modules/node/litd/litd.service.ts b/src/server/modules/node/litd/litd.service.ts index d544af0a..7b502b87 100644 --- a/src/server/modules/node/litd/litd.service.ts +++ b/src/server/modules/node/litd/litd.service.ts @@ -48,7 +48,7 @@ export class LitdService implements LightningProvider, TaprootAssetsProvider { const tapd = TapClient.create({ socket: config.socket, macaroon: config.macaroon || '', - cert: config.cert || '', + cert: config.cert, }); return { lnd, tapd, mode: 'grpc' };