This commit is contained in:
pablof7z 2023-03-30 21:10:27 +03:00
parent e07a856deb
commit ddba968541
11 changed files with 707 additions and 65 deletions

505
package-lock.json generated
View file

@ -1,21 +1,25 @@
{ {
"name": "nostri.chat", "name": "nostri.chat",
"version": "0.1.1", "version": "0.1.2",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "nostri.chat", "name": "nostri.chat",
"version": "0.1.1", "version": "0.1.2",
"dependencies": { "dependencies": {
"@nostr-connect/connect": "^0.2.3", "@nostr-connect/connect": "^0.2.3",
"@rollup/plugin-commonjs": "^24.0.1", "@rollup/plugin-commonjs": "^24.0.1",
"@rollup/plugin-json": "^6.0.0",
"@rollup/plugin-typescript": "^11.0.0", "@rollup/plugin-typescript": "^11.0.0",
"@sveltejs/adapter-node": "^1.1.7", "@sveltejs/adapter-node": "^1.1.7",
"@tailwindcss/forms": "^0.5.3", "@tailwindcss/forms": "^0.5.3",
"@tailwindcss/typography": "^0.5.9", "@tailwindcss/typography": "^0.5.9",
"emoji-regex": "^10.2.1",
"eventemitter3": "^5.0.0", "eventemitter3": "^5.0.0",
"light-bolt11-decoder": "^3.0.0",
"nostr": "^0.2.7", "nostr": "^0.2.7",
"nostr-dev-kit": "file:../../nostr/ndk/nostr-dev-kit",
"nostr-tools": "^1.2.1", "nostr-tools": "^1.2.1",
"rollup-plugin-css-only": "^4.3.0", "rollup-plugin-css-only": "^4.3.0",
"rollup-plugin-esformatter": "^3.0.0", "rollup-plugin-esformatter": "^3.0.0",
@ -27,6 +31,8 @@
"svelte-qr": "^1.0.0", "svelte-qr": "^1.0.0",
"svelte-scrollto": "^0.2.0", "svelte-scrollto": "^0.2.0",
"uuid": "^9.0.0", "uuid": "^9.0.0",
"webln": "^0.3.2",
"websocket-polyfill": "^0.0.3",
"ws": "^8.12.0" "ws": "^8.12.0"
}, },
"devDependencies": { "devDependencies": {
@ -46,6 +52,24 @@
"vite": "^4.0.0" "vite": "^4.0.0"
} }
}, },
"../../nostr/ndk/nostr-dev-kit": {
"version": "0.0.3",
"license": "MIT",
"dependencies": {
"eventemitter3": "^5.0.0",
"light-bolt11-decoder": "^3.0.0",
"node-fetch": "^3.3.1",
"nostr-tools": "^1.6.0",
"websocket-polyfill": "^0.0.3"
},
"devDependencies": {
"@types/jest": "^29.5.0",
"@types/node": "^14.11.2",
"gts": "^3.1.1",
"jest": "^29.5.0",
"typescript": "~4.7.0"
}
},
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
"version": "7.18.6", "version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
@ -484,24 +508,24 @@
} }
}, },
"node_modules/@sveltejs/kit": { "node_modules/@sveltejs/kit": {
"version": "1.3.7", "version": "1.14.0",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.3.7.tgz", "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.14.0.tgz",
"integrity": "sha512-H0V8qpd7sax/f/i90lSBEVjubuCkex9M1KvARdptwirLDL9qtJXRUClK25zrDi9IpqIMtbxYnZmfiaaTLcxTGQ==", "integrity": "sha512-4e/cZT0z4IppEkqNvMrurGz6VE1gScukFU7XqwTL/yrGJGXHqS9D7RvsOcE1hASsgrMu6w/fKTIhxT5oN0K1Jw==",
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
"@sveltejs/vite-plugin-svelte": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^2.0.0",
"@types/cookie": "^0.5.1", "@types/cookie": "^0.5.1",
"cookie": "^0.5.0", "cookie": "^0.5.0",
"devalue": "^4.2.3", "devalue": "^4.3.0",
"esm-env": "^1.0.0", "esm-env": "^1.0.0",
"kleur": "^4.1.5", "kleur": "^4.1.5",
"magic-string": "^0.27.0", "magic-string": "^0.30.0",
"mime": "^3.0.0", "mime": "^3.0.0",
"sade": "^1.8.1", "sade": "^1.8.1",
"set-cookie-parser": "^2.5.1", "set-cookie-parser": "^2.5.1",
"sirv": "^2.0.2", "sirv": "^2.0.2",
"tiny-glob": "^0.2.9", "tiny-glob": "^0.2.9",
"undici": "5.16.0" "undici": "5.21.0"
}, },
"bin": { "bin": {
"svelte-kit": "svelte-kit.js" "svelte-kit": "svelte-kit.js"
@ -514,6 +538,17 @@
"vite": "^4.0.0" "vite": "^4.0.0"
} }
}, },
"node_modules/@sveltejs/kit/node_modules/magic-string": {
"version": "0.30.0",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz",
"integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.4.13"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@sveltejs/package": { "node_modules/@sveltejs/package": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/@sveltejs/package/-/package-1.0.2.tgz", "resolved": "https://registry.npmjs.org/@sveltejs/package/-/package-1.0.2.tgz",
@ -590,6 +625,14 @@
"node": ">=10.13.0" "node": ">=10.13.0"
} }
}, },
"node_modules/@types/chrome": {
"version": "0.0.74",
"resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.74.tgz",
"integrity": "sha512-hzosS5CkQcIKCgxcsV2AzbJ36KNxG/Db2YEN/erEu7Boprg+KpMDLBQqKFmSo+JkQMGqRcicUyqCowJpuT+C6A==",
"dependencies": {
"@types/filesystem": "*"
}
},
"node_modules/@types/cookie": { "node_modules/@types/cookie": {
"version": "0.5.1", "version": "0.5.1",
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz",
@ -601,6 +644,19 @@
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
"integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ=="
}, },
"node_modules/@types/filesystem": {
"version": "0.0.32",
"resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz",
"integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==",
"dependencies": {
"@types/filewriter": "*"
}
},
"node_modules/@types/filewriter": {
"version": "0.0.29",
"resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz",
"integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ=="
},
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "18.11.18", "version": "18.11.18",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
@ -921,6 +977,18 @@
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
}, },
"node_modules/bufferutil": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz",
"integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==",
"hasInstallScript": true,
"dependencies": {
"node-gyp-build": "^4.3.0"
},
"engines": {
"node": ">=6.14.2"
}
},
"node_modules/builtin-modules": { "node_modules/builtin-modules": {
"version": "3.3.0", "version": "3.3.0",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
@ -1235,6 +1303,15 @@
"node": ">=8.0.0" "node": ">=8.0.0"
} }
}, },
"node_modules/d": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
"integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
"dependencies": {
"es5-ext": "^0.10.50",
"type": "^1.0.1"
}
},
"node_modules/debug": { "node_modules/debug": {
"version": "4.3.4", "version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@ -1300,10 +1377,9 @@
} }
}, },
"node_modules/devalue": { "node_modules/devalue": {
"version": "4.2.3", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-4.2.3.tgz", "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz",
"integrity": "sha512-JG6Q248aN0pgFL57e3zqTVeFraBe+5W2ugvv1mLXsJP6YYIYJhRZhAl7QP8haJrqob6X10F9NEkuCvNILZTPeQ==", "integrity": "sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA=="
"license": "MIT"
}, },
"node_modules/didyoumean": { "node_modules/didyoumean": {
"version": "1.2.2", "version": "1.2.2",
@ -1402,6 +1478,11 @@
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
"integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA=="
}, },
"node_modules/emoji-regex": {
"version": "10.2.1",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz",
"integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA=="
},
"node_modules/entities": { "node_modules/entities": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
@ -1410,11 +1491,44 @@
"url": "https://github.com/fb55/entities?sponsor=1" "url": "https://github.com/fb55/entities?sponsor=1"
} }
}, },
"node_modules/es5-ext": {
"version": "0.10.62",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz",
"integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==",
"hasInstallScript": true,
"dependencies": {
"es6-iterator": "^2.0.3",
"es6-symbol": "^3.1.3",
"next-tick": "^1.1.0"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/es6-iterator": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
"dependencies": {
"d": "1",
"es5-ext": "^0.10.35",
"es6-symbol": "^3.1.1"
}
},
"node_modules/es6-promise": { "node_modules/es6-promise": {
"version": "3.3.1", "version": "3.3.1",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
"integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==" "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg=="
}, },
"node_modules/es6-symbol": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
"integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
"dependencies": {
"d": "^1.0.1",
"ext": "^1.1.2"
}
},
"node_modules/esbuild": { "node_modules/esbuild": {
"version": "0.16.17", "version": "0.16.17",
"hasInstallScript": true, "hasInstallScript": true,
@ -1924,6 +2038,19 @@
"node": ">=0.8.x" "node": ">=0.8.x"
} }
}, },
"node_modules/ext": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
"integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
"dependencies": {
"type": "^2.7.2"
}
},
"node_modules/ext/node_modules/type": {
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
"integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
},
"node_modules/fast-glob": { "node_modules/fast-glob": {
"version": "3.2.12", "version": "3.2.12",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
@ -2251,6 +2378,11 @@
"@types/estree": "*" "@types/estree": "*"
} }
}, },
"node_modules/is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
},
"node_modules/isexe": { "node_modules/isexe": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@ -2283,6 +2415,14 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/light-bolt11-decoder": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/light-bolt11-decoder/-/light-bolt11-decoder-3.0.0.tgz",
"integrity": "sha512-AKvOigD2pmC8ktnn2TIqdJu0K0qk6ukUmTvHwF3JNkm8uWCqt18Ijn33A/a7gaRZ4PghJ59X+8+MXrzLKdBTmQ==",
"dependencies": {
"@scure/base": "1.1.1"
}
},
"node_modules/lilconfig": { "node_modules/lilconfig": {
"version": "2.0.6", "version": "2.0.6",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
@ -2567,6 +2707,11 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
} }
}, },
"node_modules/next-tick": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
},
"node_modules/no-case": { "node_modules/no-case": {
"version": "3.0.4", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
@ -2584,6 +2729,16 @@
"integrity": "sha512-GSCXyoZBUaaPwVWdYncMEmzlSUjF9J/YeEHpklYJCyg8wPuJP3NzDx0BkiwArzINkdX2HJHvUJhL6vVWPOQQcg==", "integrity": "sha512-GSCXyoZBUaaPwVWdYncMEmzlSUjF9J/YeEHpklYJCyg8wPuJP3NzDx0BkiwArzINkdX2HJHvUJhL6vVWPOQQcg==",
"deprecated": "Switch to namespaced @noble/secp256k1 for security and feature updates" "deprecated": "Switch to namespaced @noble/secp256k1 for security and feature updates"
}, },
"node_modules/node-gyp-build": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz",
"integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==",
"bin": {
"node-gyp-build": "bin.js",
"node-gyp-build-optional": "optional.js",
"node-gyp-build-test": "build-test.js"
}
},
"node_modules/node-releases": { "node_modules/node-releases": {
"version": "2.0.9", "version": "2.0.9",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz",
@ -2627,6 +2782,10 @@
"ws": "^8.8.1" "ws": "^8.8.1"
} }
}, },
"node_modules/nostr-dev-kit": {
"resolved": "../../nostr/ndk/nostr-dev-kit",
"link": true
},
"node_modules/nostr-tools": { "node_modules/nostr-tools": {
"version": "1.7.4", "version": "1.7.4",
"resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-1.7.4.tgz", "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-1.7.4.tgz",
@ -4408,6 +4567,24 @@
"devOptional": true, "devOptional": true,
"license": "0BSD" "license": "0BSD"
}, },
"node_modules/tstl": {
"version": "2.5.13",
"resolved": "https://registry.npmjs.org/tstl/-/tstl-2.5.13.tgz",
"integrity": "sha512-h9wayHHFI5+yqt8iau0vqH96cTNhezhZ/Fk/hrIdpfkiMu3lg9nzyvMfs5bIdX51IVzZO6DudLqhkL/rVXpT6g=="
},
"node_modules/type": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
},
"node_modules/typedarray-to-buffer": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"dependencies": {
"is-typedarray": "^1.0.0"
}
},
"node_modules/typescript": { "node_modules/typescript": {
"version": "4.9.5", "version": "4.9.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
@ -4421,8 +4598,9 @@
} }
}, },
"node_modules/undici": { "node_modules/undici": {
"version": "5.16.0", "version": "5.21.0",
"license": "MIT", "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz",
"integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==",
"dependencies": { "dependencies": {
"busboy": "^1.6.0" "busboy": "^1.6.0"
}, },
@ -4466,6 +4644,18 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/utf-8-validate": {
"version": "5.0.10",
"resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
"integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
"hasInstallScript": true,
"dependencies": {
"node-gyp-build": "^4.3.0"
},
"engines": {
"node": ">=6.14.2"
}
},
"node_modules/util-deprecate": { "node_modules/util-deprecate": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@ -4556,6 +4746,52 @@
} }
} }
}, },
"node_modules/webln": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/webln/-/webln-0.3.2.tgz",
"integrity": "sha512-YYT83aOCLup2AmqvJdKtdeBTaZpjC6/JDMe8o6x1kbTYWwiwrtWHyO//PAsPixF3jwFsAkj5DmiceB6w/QSe7Q==",
"dependencies": {
"@types/chrome": "^0.0.74"
}
},
"node_modules/websocket": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz",
"integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==",
"dependencies": {
"bufferutil": "^4.0.1",
"debug": "^2.2.0",
"es5-ext": "^0.10.50",
"typedarray-to-buffer": "^3.1.5",
"utf-8-validate": "^5.0.2",
"yaeti": "^0.0.6"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/websocket-polyfill": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/websocket-polyfill/-/websocket-polyfill-0.0.3.tgz",
"integrity": "sha512-pF3kR8Uaoau78MpUmFfzbIRxXj9PeQrCuPepGE6JIsfsJ/o/iXr07Q2iQNzKSSblQJ0FiGWlS64N4pVSm+O3Dg==",
"dependencies": {
"tstl": "^2.0.7",
"websocket": "^1.0.28"
}
},
"node_modules/websocket/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/websocket/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/which": { "node_modules/which": {
"version": "1.3.1", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
@ -4600,6 +4836,14 @@
"node": ">=0.4" "node": ">=0.4"
} }
}, },
"node_modules/yaeti": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
"integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==",
"engines": {
"node": ">=0.10.32"
}
},
"node_modules/yaml": { "node_modules/yaml": {
"version": "1.10.2", "version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
@ -4903,23 +5147,33 @@
} }
}, },
"@sveltejs/kit": { "@sveltejs/kit": {
"version": "1.3.7", "version": "1.14.0",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.3.7.tgz", "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.14.0.tgz",
"integrity": "sha512-H0V8qpd7sax/f/i90lSBEVjubuCkex9M1KvARdptwirLDL9qtJXRUClK25zrDi9IpqIMtbxYnZmfiaaTLcxTGQ==", "integrity": "sha512-4e/cZT0z4IppEkqNvMrurGz6VE1gScukFU7XqwTL/yrGJGXHqS9D7RvsOcE1hASsgrMu6w/fKTIhxT5oN0K1Jw==",
"requires": { "requires": {
"@sveltejs/vite-plugin-svelte": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^2.0.0",
"@types/cookie": "^0.5.1", "@types/cookie": "^0.5.1",
"cookie": "^0.5.0", "cookie": "^0.5.0",
"devalue": "^4.2.3", "devalue": "^4.3.0",
"esm-env": "^1.0.0", "esm-env": "^1.0.0",
"kleur": "^4.1.5", "kleur": "^4.1.5",
"magic-string": "^0.27.0", "magic-string": "^0.30.0",
"mime": "^3.0.0", "mime": "^3.0.0",
"sade": "^1.8.1", "sade": "^1.8.1",
"set-cookie-parser": "^2.5.1", "set-cookie-parser": "^2.5.1",
"sirv": "^2.0.2", "sirv": "^2.0.2",
"tiny-glob": "^0.2.9", "tiny-glob": "^0.2.9",
"undici": "5.16.0" "undici": "5.21.0"
},
"dependencies": {
"magic-string": {
"version": "0.30.0",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz",
"integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==",
"requires": {
"@jridgewell/sourcemap-codec": "^1.4.13"
}
}
} }
}, },
"@sveltejs/package": { "@sveltejs/package": {
@ -4971,6 +5225,14 @@
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
"integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="
}, },
"@types/chrome": {
"version": "0.0.74",
"resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.74.tgz",
"integrity": "sha512-hzosS5CkQcIKCgxcsV2AzbJ36KNxG/Db2YEN/erEu7Boprg+KpMDLBQqKFmSo+JkQMGqRcicUyqCowJpuT+C6A==",
"requires": {
"@types/filesystem": "*"
}
},
"@types/cookie": { "@types/cookie": {
"version": "0.5.1", "version": "0.5.1",
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz",
@ -4981,6 +5243,19 @@
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
"integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ=="
}, },
"@types/filesystem": {
"version": "0.0.32",
"resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz",
"integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==",
"requires": {
"@types/filewriter": "*"
}
},
"@types/filewriter": {
"version": "0.0.29",
"resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz",
"integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ=="
},
"@types/node": { "@types/node": {
"version": "18.11.18", "version": "18.11.18",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
@ -5225,6 +5500,14 @@
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
}, },
"bufferutil": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz",
"integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==",
"requires": {
"node-gyp-build": "^4.3.0"
}
},
"builtin-modules": { "builtin-modules": {
"version": "3.3.0", "version": "3.3.0",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
@ -5437,6 +5720,15 @@
"css-tree": "^1.1.2" "css-tree": "^1.1.2"
} }
}, },
"d": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
"integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
"requires": {
"es5-ext": "^0.10.50",
"type": "^1.0.1"
}
},
"debug": { "debug": {
"version": "4.3.4", "version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@ -5477,9 +5769,9 @@
} }
}, },
"devalue": { "devalue": {
"version": "4.2.3", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-4.2.3.tgz", "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz",
"integrity": "sha512-JG6Q248aN0pgFL57e3zqTVeFraBe+5W2ugvv1mLXsJP6YYIYJhRZhAl7QP8haJrqob6X10F9NEkuCvNILZTPeQ==" "integrity": "sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA=="
}, },
"didyoumean": { "didyoumean": {
"version": "1.2.2", "version": "1.2.2",
@ -5550,16 +5842,50 @@
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
"integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA=="
}, },
"emoji-regex": {
"version": "10.2.1",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz",
"integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA=="
},
"entities": { "entities": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
}, },
"es5-ext": {
"version": "0.10.62",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz",
"integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==",
"requires": {
"es6-iterator": "^2.0.3",
"es6-symbol": "^3.1.3",
"next-tick": "^1.1.0"
}
},
"es6-iterator": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
"requires": {
"d": "1",
"es5-ext": "^0.10.35",
"es6-symbol": "^3.1.1"
}
},
"es6-promise": { "es6-promise": {
"version": "3.3.1", "version": "3.3.1",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
"integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==" "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg=="
}, },
"es6-symbol": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
"integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
"requires": {
"d": "^1.0.1",
"ext": "^1.1.2"
}
},
"esbuild": { "esbuild": {
"version": "0.16.17", "version": "0.16.17",
"requires": { "requires": {
@ -5832,6 +6158,21 @@
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
}, },
"ext": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
"integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
"requires": {
"type": "^2.7.2"
},
"dependencies": {
"type": {
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
"integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
}
}
},
"fast-glob": { "fast-glob": {
"version": "3.2.12", "version": "3.2.12",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
@ -6067,6 +6408,11 @@
"@types/estree": "*" "@types/estree": "*"
} }
}, },
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
},
"isexe": { "isexe": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@ -6092,6 +6438,14 @@
"resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
"integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="
}, },
"light-bolt11-decoder": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/light-bolt11-decoder/-/light-bolt11-decoder-3.0.0.tgz",
"integrity": "sha512-AKvOigD2pmC8ktnn2TIqdJu0K0qk6ukUmTvHwF3JNkm8uWCqt18Ijn33A/a7gaRZ4PghJ59X+8+MXrzLKdBTmQ==",
"requires": {
"@scure/base": "1.1.1"
}
},
"lilconfig": { "lilconfig": {
"version": "2.0.6", "version": "2.0.6",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
@ -6297,6 +6651,11 @@
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
}, },
"next-tick": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
},
"no-case": { "no-case": {
"version": "3.0.4", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
@ -6312,6 +6671,11 @@
"resolved": "https://registry.npmjs.org/noble-secp256k1/-/noble-secp256k1-1.2.14.tgz", "resolved": "https://registry.npmjs.org/noble-secp256k1/-/noble-secp256k1-1.2.14.tgz",
"integrity": "sha512-GSCXyoZBUaaPwVWdYncMEmzlSUjF9J/YeEHpklYJCyg8wPuJP3NzDx0BkiwArzINkdX2HJHvUJhL6vVWPOQQcg==" "integrity": "sha512-GSCXyoZBUaaPwVWdYncMEmzlSUjF9J/YeEHpklYJCyg8wPuJP3NzDx0BkiwArzINkdX2HJHvUJhL6vVWPOQQcg=="
}, },
"node-gyp-build": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz",
"integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ=="
},
"node-releases": { "node-releases": {
"version": "2.0.9", "version": "2.0.9",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz",
@ -6342,6 +6706,21 @@
"ws": "^8.8.1" "ws": "^8.8.1"
} }
}, },
"nostr-dev-kit": {
"version": "file:../../nostr/ndk/nostr-dev-kit",
"requires": {
"@types/jest": "^29.5.0",
"@types/node": "^14.11.2",
"eventemitter3": "^5.0.0",
"gts": "^3.1.1",
"jest": "^29.5.0",
"light-bolt11-decoder": "^3.0.0",
"node-fetch": "^3.3.1",
"nostr-tools": "^1.6.0",
"typescript": "~4.7.0",
"websocket-polyfill": "^0.0.3"
}
},
"nostr-tools": { "nostr-tools": {
"version": "1.7.4", "version": "1.7.4",
"resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-1.7.4.tgz", "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-1.7.4.tgz",
@ -7526,13 +7905,33 @@
"integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
"devOptional": true "devOptional": true
}, },
"tstl": {
"version": "2.5.13",
"resolved": "https://registry.npmjs.org/tstl/-/tstl-2.5.13.tgz",
"integrity": "sha512-h9wayHHFI5+yqt8iau0vqH96cTNhezhZ/Fk/hrIdpfkiMu3lg9nzyvMfs5bIdX51IVzZO6DudLqhkL/rVXpT6g=="
},
"type": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
},
"typedarray-to-buffer": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"requires": {
"is-typedarray": "^1.0.0"
}
},
"typescript": { "typescript": {
"version": "4.9.5", "version": "4.9.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
"integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g=="
}, },
"undici": { "undici": {
"version": "5.16.0", "version": "5.21.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz",
"integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==",
"requires": { "requires": {
"busboy": "^1.6.0" "busboy": "^1.6.0"
} }
@ -7554,6 +7953,14 @@
"os-homedir": "^1.0.0" "os-homedir": "^1.0.0"
} }
}, },
"utf-8-validate": {
"version": "5.0.10",
"resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
"integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
"requires": {
"node-gyp-build": "^4.3.0"
}
},
"util-deprecate": { "util-deprecate": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@ -7592,6 +7999,51 @@
"integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==",
"requires": {} "requires": {}
}, },
"webln": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/webln/-/webln-0.3.2.tgz",
"integrity": "sha512-YYT83aOCLup2AmqvJdKtdeBTaZpjC6/JDMe8o6x1kbTYWwiwrtWHyO//PAsPixF3jwFsAkj5DmiceB6w/QSe7Q==",
"requires": {
"@types/chrome": "^0.0.74"
}
},
"websocket": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz",
"integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==",
"requires": {
"bufferutil": "^4.0.1",
"debug": "^2.2.0",
"es5-ext": "^0.10.50",
"typedarray-to-buffer": "^3.1.5",
"utf-8-validate": "^5.0.2",
"yaeti": "^0.0.6"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}
}
},
"websocket-polyfill": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/websocket-polyfill/-/websocket-polyfill-0.0.3.tgz",
"integrity": "sha512-pF3kR8Uaoau78MpUmFfzbIRxXj9PeQrCuPepGE6JIsfsJ/o/iXr07Q2iQNzKSSblQJ0FiGWlS64N4pVSm+O3Dg==",
"requires": {
"tstl": "^2.0.7",
"websocket": "^1.0.28"
}
},
"which": { "which": {
"version": "1.3.1", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
@ -7616,6 +8068,11 @@
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
}, },
"yaeti": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
"integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug=="
},
"yaml": { "yaml": {
"version": "1.10.2", "version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",

View file

@ -1,6 +1,6 @@
{ {
"name": "nostri.chat", "name": "nostri.chat",
"version": "0.1.2", "version": "0.1.5",
"scripts": { "scripts": {
"dev": "vite dev", "dev": "vite dev",
"build": "svelte-kit sync && svelte-package", "build": "svelte-kit sync && svelte-package",
@ -26,12 +26,16 @@
"dependencies": { "dependencies": {
"@nostr-connect/connect": "^0.2.3", "@nostr-connect/connect": "^0.2.3",
"@rollup/plugin-commonjs": "^24.0.1", "@rollup/plugin-commonjs": "^24.0.1",
"@rollup/plugin-json": "^6.0.0",
"@rollup/plugin-typescript": "^11.0.0", "@rollup/plugin-typescript": "^11.0.0",
"@sveltejs/adapter-node": "^1.1.7", "@sveltejs/adapter-node": "^1.1.7",
"@tailwindcss/forms": "^0.5.3", "@tailwindcss/forms": "^0.5.3",
"@tailwindcss/typography": "^0.5.9", "@tailwindcss/typography": "^0.5.9",
"emoji-regex": "^10.2.1",
"eventemitter3": "^5.0.0", "eventemitter3": "^5.0.0",
"light-bolt11-decoder": "^3.0.0",
"nostr": "^0.2.7", "nostr": "^0.2.7",
"nostr-dev-kit": "file:../../nostr/ndk/nostr-dev-kit",
"nostr-tools": "^1.2.1", "nostr-tools": "^1.2.1",
"rollup-plugin-css-only": "^4.3.0", "rollup-plugin-css-only": "^4.3.0",
"rollup-plugin-esformatter": "^3.0.0", "rollup-plugin-esformatter": "^3.0.0",
@ -43,6 +47,8 @@
"svelte-qr": "^1.0.0", "svelte-qr": "^1.0.0",
"svelte-scrollto": "^0.2.0", "svelte-scrollto": "^0.2.0",
"uuid": "^9.0.0", "uuid": "^9.0.0",
"webln": "^0.3.2",
"websocket-polyfill": "^0.0.3",
"ws": "^8.12.0" "ws": "^8.12.0"
} }
} }

View file

@ -7,6 +7,7 @@ import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs"; import commonjs from "@rollup/plugin-commonjs";
import css from "rollup-plugin-css-only"; import css from "rollup-plugin-css-only";
import serve from "rollup-plugin-serve"; import serve from "rollup-plugin-serve";
import json from "@rollup/plugin-json";
import livereload from "rollup-plugin-livereload"; import livereload from "rollup-plugin-livereload";
import { terser } from "rollup-plugin-terser"; import { terser } from "rollup-plugin-terser";
import esformatter from "rollup-plugin-esformatter"; import esformatter from "rollup-plugin-esformatter";
@ -17,7 +18,7 @@ const production = true; //false;// !process.env.ROLLUP_WATCH;
export default { export default {
input: "src/widget.js", input: "src/widget.js",
output: { output: {
file: "public/bundle.js", file: "static/public/bundle.js",
format: "iife", format: "iife",
name: "app", name: "app",
sourcemap: production, sourcemap: production,
@ -42,6 +43,7 @@ export default {
dedupe: ["svelte"], dedupe: ["svelte"],
preferBuiltins: false preferBuiltins: false
}), }),
json(),
commonjs(), commonjs(),
// export CSS in separate file for better performance // export CSS in separate file for better performance

View file

@ -1,5 +1,5 @@
<script> <script>
import { chatAdapter, chatData, selectedMessage } from './lib/store'; import { chatAdapter, chatData, selectedMessage, zapsPerMessage } from './lib/store';
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import NostrNote from './NostrNote.svelte'; import NostrNote from './NostrNote.svelte';
import * as animateScroll from "svelte-scrollto"; import * as animateScroll from "svelte-scrollto";
@ -129,6 +129,14 @@
}) })
} }
function zapReceived(zap) {
const event = events.find(event => event.id === zap.zappedEvent);
if (!event) { return; }
if (!$zapsPerMessage[event.id]) $zapsPerMessage[event.id] = [];
$zapsPerMessage[event.id].push(zap);
}
function reactionReceived(reaction) { function reactionReceived(reaction) {
const event = events.find(event => event.id === reaction.id); const event = events.find(event => event.id === reaction.id);
if (!event) { return; } if (!event) { return; }
@ -148,6 +156,7 @@
}) })
$chatAdapter.on('reaction', reactionReceived); $chatAdapter.on('reaction', reactionReceived);
$chatAdapter.on('zap', zapReceived);
$chatAdapter.on('deleted', (deletedEvents) => { $chatAdapter.on('deleted', (deletedEvents) => {
deletedEvents.forEach(deletedEventId => { deletedEvents.forEach(deletedEventId => {
const index = events.findIndex(event => event.id === deletedEventId); const index = events.findIndex(event => event.id === deletedEventId);
@ -217,8 +226,8 @@
<div class=" <div class="
bg-purple-700 text-white bg-purple-700 text-white
-m-5 mb-3 -mx-4 -mt-5 mb-3
px-5 py-3 px-4 py-3
overflow-clip overflow-clip
flex flex-row justify-between items-center flex flex-row justify-between items-center
"> ">
@ -266,7 +275,7 @@
{/if} {/if}
<div id="messages-container" class="overflow-auto -mx-4 px-4" style="height: 50vh; min-height: 300px;"> <div id="messages-container" class="overflow-auto -mx-4 px-4" style="height: 50vh; min-height: 300px;">
<div id="messages-container-inner"> <div id="messages-container-inner" class="flex flex-col gap-4">
{#if $selectedMessage} {#if $selectedMessage}
<NostrNote event={getEventById($selectedMessage)} {responses} {websiteOwnerPubkey} /> <NostrNote event={getEventById($selectedMessage)} {responses} {websiteOwnerPubkey} />
{:else} {:else}
@ -284,8 +293,8 @@
<div class="flex flex-col"> <div class="flex flex-col">
<div class=" <div class="
border-y border-y-slate-200 border-y border-y-slate-200
-mx-5 my-2 bg-slate-100 text-black text-sm -mx-4 my-2 bg-slate-100 text-black text-sm
px-5 py-2 px-4 py-2
"> ">
{#if chatConfiguration.chatType === 'DM'} {#if chatConfiguration.chatType === 'DM'}
<b>Encrypted chat:</b> <b>Encrypted chat:</b>

View file

@ -1,7 +1,9 @@
<script> <script>
import { onMount } from 'svelte'; import { afterUpdate, onMount } from 'svelte';
import { selectedMessage } from './lib/store'; import { selectedMessage, zappingMessage, zapsPerMessage } from './lib/store';
import { chatData, chatAdapter } from './lib/store'; import { chatData, chatAdapter } from './lib/store';
import { nip19 } from 'nostr-tools';
import ZapAmountButton from './ZapAmountButton.svelte';
// import { prettifyContent } from '$lib/utils'; // import { prettifyContent } from '$lib/utils';
export let event; export let event;
export let responses; export let responses;
@ -9,6 +11,11 @@
let profiles = {}; let profiles = {};
let profilePicture; let profilePicture;
let npub;
let zappingIt;
let hovering;
let zappedAmount = 0;
function selectMessage() { function selectMessage() {
if ($selectedMessage === event.id) { if ($selectedMessage === event.id) {
@ -21,7 +28,7 @@
// delay-fetch responses // delay-fetch responses
onMount(() => { onMount(() => {
$chatAdapter.delayedSubscribe( $chatAdapter.delayedSubscribe(
{kinds: [1], '#e': [event.id]} {kinds: [1, 9735], '#e': [event.id]}
, 'responses', 500) , 'responses', 500)
}) })
@ -29,27 +36,107 @@
$: profiles = $chatData.profiles; $: profiles = $chatData.profiles;
$: displayName = profiles[event.pubkey] && profiles[event.pubkey].display_name || `[${event.pubkey.slice(0, 6)}]`; $: displayName = profiles[event.pubkey] && profiles[event.pubkey].display_name || `[${event.pubkey.slice(0, 6)}]`;
$: nip05 = profiles[event.pubkey] && profiles[event.pubkey].nip05; // $: nip05 = profiles[event.pubkey] && profiles[event.pubkey].nip05;
$: zappingIt = $zappingMessage === event.id;
$: {
try {
npub = nip19.npubEncode(event.pubkey);
} catch (e) {
npub = event.pubkey;
}
}
$: profilePicture = profiles[event.pubkey] && profiles[event.pubkey].picture || `https://robohash.org/${event.pubkey.slice(0, 2)}.png?set=set1`; $chatAdapter.on('zap', () => {
zappedAmount = $zapsPerMessage[event.id]?.reduce((acc, zap) => acc + zap.amount, 0) || 0;
});
const repliedIds = event.tags.filter(e => e[0] === 'e').map(e => e[1]); $: {
zappedAmount = $zapsPerMessage[event.id]?.reduce((acc, zap) => acc + zap.amount, 0) || 0;
}
afterUpdate(() => {
zappedAmount = $zapsPerMessage[event.id]?.reduce((acc, zap) => acc + zap.amount, 0) || 0;
});
$: profilePicture = profiles[event.pubkey] && profiles[event.pubkey].picture || `https://robohash.org/${event.pubkey.slice(0, 1)}.png?set=set1`;
// const repliedIds = event.tags.filter(e => e[0] === 'e').map(e => e[1]);
let timestamp = new Date(event.created_at * 1000); let timestamp = new Date(event.created_at * 1000);
</script> </script>
<div <div
class=" class="
block p-2-lg mb-3 flex flex-col gap-4
p-2-lg mb-3
text-wrap text-wrap
relative
" "
on:mouseenter={() => (hovering = true)}
on:mouseleave={() => (hovering = false)}
> >
<div class="flex flex-row gap-4"> <div class="flex flex-row gap-3">
<div class="min-w-fit"> <div class="min-w-fit flex flex-col gap-2">
<a href={`nostr:${npub}`}>
<img src="{profilePicture}" class=" <img src="{profilePicture}" class="
block w-10 h-10 rounded-full block w-8 h-8 rounded-full
{byWebsiteOwner ? 'ring-purple-700 ring-4' : 'ring-gray-300 ring-2'} {byWebsiteOwner ? 'ring-purple-700 ring-4' : ''}
" alt="" /> " alt="" />
</a>
<button
class="
rounded-full
{zappedAmount > 0 ? 'opacity-100 text-base' : 'bg-orange-500 opacity-10 text-xl'}
w-8 h-8
flex items-center
justify-center
hover:opacity-100
"
on:click|preventDefault={() => $zappingMessage = $zappingMessage === event.id ? null : event.id}
>
{#if zappedAmount > 0}
<p class="flex flex-col items-center my-4">
⚡️
<span class="text-orange-500 font-semibold">
{zappedAmount}
</span>
</p>
{:else}
⚡️
{/if}
</button>
<div class="
{zappingIt ?
'w-full rounded-full bg-white drop-shadow-xl justify-between border-2 border-gray-200' :
' rounded-full w-8 h-8 justify-center'
}
flex items-center absolute ml-5 mt-10 z-10">
{#if zappingIt}
<div class="flex flex-row items-stretch justify-between w-full">
<div class="flex flex-col hover:bg-orange-500 text-white rounded-full w-12 h-12 items-center justify-center cursor-pointer">
<ZapAmountButton icon="👍" amount={500} {event} />
</div>
<div class="flex flex-col hover:bg-orange-500 text-white rounded-full w-12 h-12 items-center justify-center cursor-pointer">
<ZapAmountButton icon="🤙" amount={2500} amountDisplay={'2.5k'} {event} />
</div>
<div class="flex flex-col hover:bg-orange-500 text-white rounded-full w-12 h-12 items-center justify-center cursor-pointer">
<ZapAmountButton icon="🙌" amount={5000} amountDisplay={'5k'} {event} />
</div>
<div class="flex flex-col hover:bg-orange-500 text-white rounded-full w-12 h-12 items-center justify-center cursor-pointer">
<ZapAmountButton icon="🧡" amount={10000} amountDisplay={'10k'} {event} />
</div>
<div class="flex flex-col hover:bg-orange-500 text-white rounded-full w-12 h-12 items-center justify-center cursor-pointer">
<ZapAmountButton icon="🤯" amount={100000} amountDisplay={'100k'} {event} />
</div>
<div class="flex flex-col hover:bg-orange-500 text-white rounded-full w-12 h-12 items-center justify-center cursor-pointer">
<ZapAmountButton icon="😎" amount={1000000} amountDisplay={'1M'} {event} />
</div>
</div>
{/if}
</div>
<!-- <span class="text-base font-semibold text-clip">{displayName}</span> <!-- <span class="text-base font-semibold text-clip">{displayName}</span>
{#if nip05} {#if nip05}
<span class="text-sm text-gray-400">{nip05}</span> <span class="text-sm text-gray-400">{nip05}</span>
@ -64,13 +151,17 @@
max-h-64 text-base max-h-64 text-base
cursor-pointer cursor-pointer
border border-slate-200 border border-slate-200
{$selectedMessage === event.id ? 'bg-purple-700 text-white' : 'bg-slate-50 text-gray-500 hover:bg-slate-100'} {$selectedMessage === event.id ? 'bg-purple-700 text-white' : 'bg-white text-gray-900 hover:bg-slate-100'}
p-4 py-2 overflow-auto rounded-2xl p-4 py-2 overflow-auto rounded-2xl
" on:click|preventDefault={()=>{selectMessage(event.id)}}> shadow-sm
" on:click|preventDefault={()=>{selectMessage(event.id)}}
on:keydown|preventDefault={()=>{selectMessage(event.id)}}
on:keyup|preventDefault={()=>{selectMessage(event.id)}}
>
{event.content} {event.content}
</div> </div>
<div class="flex flex-row-reverse justify-between mt-1 overflow-clip items-center"> <div class="flex flex-row-reverse justify-between mt-1 overflow-clip items-center relative">
<div class="text-xs text-gray-400 text-ellipsis overflow-clip whitespace-nowrap"> <div class="text-xs text-gray-400 text-ellipsis overflow-clip whitespace-nowrap">
<span class="py-2"> <span class="py-2">
{timestamp.toLocaleString()} {timestamp.toLocaleString()}
@ -92,7 +183,7 @@
</div> </div>
{#if responses[event.id].length > 0} {#if responses[event.id].length > 0}
<div class="pl-5 border-l border-l-gray-400 mb-10"> <div class="pl-5 border-l border-l-gray-400 flex flex-col gap-4">
{#each responses[event.id] as response} {#each responses[event.id] as response}
<svelte:self {websiteOwnerPubkey} event={response} {responses} /> <svelte:self {websiteOwnerPubkey} event={response} {responses} />
{/each} {/each}

View file

@ -24,11 +24,15 @@
} }
</script> </script>
<div class="fixed bottom-5 right-5 mb-5 flex flex-col item-end font-sans"> <div class="
fixed bottom-5 right-5 mb-5 flex flex-col item-end font-sans
">
{#if showChat} {#if showChat}
<div class=" <div class="
shadow-2xl shadow-2xl
bg-white mb-5 w-96 max-w-screen-sm text-black rounded-xl p-5 bg-white/90 backdrop-brightness-150 backdrop-blur-md mb-5 w-96 max-w-screen-sm text-black rounded-3xl p-5
overflow-auto
flex flex-col justify-end
{minimizeChat ? 'hidden' : ''} {minimizeChat ? 'hidden' : ''}
" style="max-height: 80vh;"> " style="max-height: 80vh;">
{#if !dismissedIntro} {#if !dismissedIntro}

View file

@ -0,0 +1,42 @@
<script>
export let icon, amount, amountDisplay, event;
import { zappingMessage } from './lib/store';
import NDK, { NDKEvent, NDKNip07Signer } from 'nostr-dev-kit';
import { requestProvider } from 'webln';
let hover = false;
async function zap() {
const signer = new NDKNip07Signer();
const pubkey = await signer.configure(window);
const ndk = new NDK({ explicitRelayUrls: ['wss://nos.lol', 'wss://relay.nostr.band', 'wss://relay.damus.io', 'wss://nostr.mom', 'wss://no.str.cr'] });
ndk.signer = signer;
await ndk.connect();
const ndkEvent = new NDKEvent(ndk, event);
const pr = await ndkEvent.zap(amount * 1000);
try {
const webln = await requestProvider();
await webln.sendPayment(pr);
$zappingMessage = null;
} catch (err) {
$zappingMessage = null;
console.log(err);
}
}
</script>
<!-- svelte-ignore a11y-click-events-have-key-events -->
<div
on:mouseenter={() => (hover = true)}
on:mouseleave={() => (hover = false)}
on:click|preventDefault={zap}
>
{#if !hover}
<span class="text-xl">{icon}</span>
{:else}
<span class="text-base text-white flex flex-col items-center">
{amountDisplay||amount}
</span>
{/if}
</div>

View file

@ -5,6 +5,7 @@ import { createEventDispatcher } from 'svelte';
import EventEmitter from 'events'; import EventEmitter from 'events';
import * as uuid from 'uuid'; import * as uuid from 'uuid';
import debug from 'debug'; import debug from 'debug';
import { NDKEvent, zapInvoiceFromEvent } from 'nostr-dev-kit';
const log = new debug('nostr:adapter'); const log = new debug('nostr:adapter');
const profilesLog = new debug('nostr:adapter:profiles'); const profilesLog = new debug('nostr:adapter:profiles');
@ -174,10 +175,27 @@ class NstrAdapter {
if (!this.#delayedSubscriptionTimeouts[family]) { if (!this.#delayedSubscriptionTimeouts[family]) {
this.#delayedSubscriptionTimeouts[family] = setTimeout(() => { this.#delayedSubscriptionTimeouts[family] = setTimeout(() => {
delete this.#delayedSubscriptionTimeouts[family]; delete this.#delayedSubscriptionTimeouts[family];
filters = this.#delayedSubscriptions[family];
// if there are more than 10 filters then we need to split them up
// into multiple subscriptions
let filters = this.#delayedSubscriptions[family];
delete this.#delayedSubscriptions[family]; delete this.#delayedSubscriptions[family];
// split filters into groups of 10
let groups = [];
groups = filters.reduce((groups, filter, index) => {
if (index % 10 === 0) {
groups.push([]);
}
groups[groups.length - 1].push(filter);
return groups;
}, groups);
console.log(`turned ${filters.length} filters into ${groups.length} groups`);
groups.forEach((filters) => {
this.subscribe(filters, (e) => { this.#emitMessage(e)}); this.subscribe(filters, (e) => { this.#emitMessage(e)});
});
}, timeout) }, timeout)
} }
} }
@ -191,6 +209,9 @@ class NstrAdapter {
const subId = uuid.v4(); const subId = uuid.v4();
this.#handlers[subId] = messageCallback; this.#handlers[subId] = messageCallback;
if (!Array.isArray(filters)) { filters = [filters] } if (!Array.isArray(filters)) { filters = [filters] }
this.#pool.subscribe(subId, filters); this.#pool.subscribe(subId, filters);
this.#pool.on('event', (relay, recSubId, e) => { this.#pool.on('event', (relay, recSubId, e) => {
this.onEvent(e, this.#handlers[recSubId]) this.onEvent(e, this.#handlers[recSubId])
@ -212,23 +233,24 @@ class NstrAdapter {
event.content = await this.decrypt(this.#websiteOwnerPubkey, event.content); event.content = await this.decrypt(this.#websiteOwnerPubkey, event.content);
} }
if (event.kind === 1) {
if (!event.tags.find(t => t[0] === 'e')) {
// a top level message that we should subscribe to since responses won't tag the url
this.subscribe({ kinds: [1], '#e': [event.id] })
}
}
let deletedEvents = [] let deletedEvents = []
if (event.kind === 5) { if (event.kind === 5) {
deletedEvents = event.tags.filter(tag => tag[0] === 'e').map(tag => tag[1]); deletedEvents = event.tags.filter(tag => tag[0] === 'e').map(tag => tag[1]);
} }
let zap;
if (event.kind === 9735) {
const ndkEvent = new NDKEvent(null, event);
zap = zapInvoiceFromEvent(ndkEvent);
console.log(`received a zap invoice: ${zap}`, event);
}
switch (event.kind) { switch (event.kind) {
case 1: this.#eventEmitter.emit('message', event); break; case 1: this.#eventEmitter.emit('message', event); break;
case 4: this.#eventEmitter.emit('message', event); break; case 4: this.#eventEmitter.emit('message', event); break;
case 5: this.#eventEmitter.emit('deleted', deletedEvents); break; case 5: this.#eventEmitter.emit('deleted', deletedEvents); break;
case 7: this.#eventEmitter.emit('reaction', event); break; case 7: this.#eventEmitter.emit('reaction', event); break;
case 9735: this.#eventEmitter.emit('zap', zap); break;
default: default:
// alert('unknown event kind ' + event.kind) // alert('unknown event kind ' + event.kind)
console.log('unknown event kind', event.kind, event); console.log('unknown event kind', event.kind, event);

View file

@ -3,3 +3,5 @@ import { writable } from 'svelte/store';
export const chatAdapter = writable(null); export const chatAdapter = writable(null);
export const chatData = writable({ events: [], profiles: {}}); export const chatData = writable({ events: [], profiles: {}});
export const selectedMessage = writable(null); export const selectedMessage = writable(null);
export const zappingMessage = writable(null);
export const zapsPerMessage = writable({});

6
src/lib/utils.js Normal file
View file

@ -0,0 +1,6 @@
export function prettifyContent(content) {
const bitcoinImage = "<img src=\"https://abs.twimg.com/hashflags/Bitcoin_evergreen/Bitcoin_evergreen.png\" style=\"width: 1.2em; vertical-align: -20%; margin-right: 0.075em; height: 1.2em; margin-left: 2px; display: inline-block;\">";
return content
.replace(/#bitcoin/i, `#bitcoin${bitcoinImage}`);
}

View file

@ -1,4 +1,5 @@
<script> <script>
import 'websocket-polyfill';
import Container from '../Container.svelte'; import Container from '../Container.svelte';
import Widget from '../Widget.svelte'; import Widget from '../Widget.svelte';
import { chatAdapter } from '$lib/store'; import { chatAdapter } from '$lib/store';
@ -10,10 +11,10 @@
let chatReferenceTags = []; let chatReferenceTags = [];
const relays = [ const relays = [
'wss://relay.f7z.io', 'wss://relay.f7z.io',
'wss://nos.lol',
'wss://relay.nostr.info', 'wss://relay.nostr.info',
'wss://nostr-pub.wellorder.net', 'wss://nostr-pub.wellorder.net',
'wss://relay.current.fyi', 'wss://relay.nos.lol',
'wss://nostr.walletofsatoshi.com',
'wss://relay.nostr.band', 'wss://relay.nostr.band',
]; ];
@ -80,7 +81,7 @@
"> ">
<div class=" <div class="
shadow-2xl shadow-2xl
bg-white mb-5 w-96 max-w-screen-sm text-black rounded-3xl p-5 overflow-auto bg-gray-100/90 backdrop-blur-md mb-5 w-96 max-w-screen-sm text-black rounded-3xl px-4 py-5 overflow-auto
flex flex-col justify-end flex flex-col justify-end
fixed fixed
" style="{chatStarted ? 'max-height: 80vh;' : 'padding: 4rem 2rem !important;'}"> " style="{chatStarted ? 'max-height: 80vh;' : 'padding: 4rem 2rem !important;'}">