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",
"version": "0.1.1",
"version": "0.1.2",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "nostri.chat",
"version": "0.1.1",
"version": "0.1.2",
"dependencies": {
"@nostr-connect/connect": "^0.2.3",
"@rollup/plugin-commonjs": "^24.0.1",
"@rollup/plugin-json": "^6.0.0",
"@rollup/plugin-typescript": "^11.0.0",
"@sveltejs/adapter-node": "^1.1.7",
"@tailwindcss/forms": "^0.5.3",
"@tailwindcss/typography": "^0.5.9",
"emoji-regex": "^10.2.1",
"eventemitter3": "^5.0.0",
"light-bolt11-decoder": "^3.0.0",
"nostr": "^0.2.7",
"nostr-dev-kit": "file:../../nostr/ndk/nostr-dev-kit",
"nostr-tools": "^1.2.1",
"rollup-plugin-css-only": "^4.3.0",
"rollup-plugin-esformatter": "^3.0.0",
@ -27,6 +31,8 @@
"svelte-qr": "^1.0.0",
"svelte-scrollto": "^0.2.0",
"uuid": "^9.0.0",
"webln": "^0.3.2",
"websocket-polyfill": "^0.0.3",
"ws": "^8.12.0"
},
"devDependencies": {
@ -46,6 +52,24 @@
"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": {
"version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
@ -484,24 +508,24 @@
}
},
"node_modules/@sveltejs/kit": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.3.7.tgz",
"integrity": "sha512-H0V8qpd7sax/f/i90lSBEVjubuCkex9M1KvARdptwirLDL9qtJXRUClK25zrDi9IpqIMtbxYnZmfiaaTLcxTGQ==",
"version": "1.14.0",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.14.0.tgz",
"integrity": "sha512-4e/cZT0z4IppEkqNvMrurGz6VE1gScukFU7XqwTL/yrGJGXHqS9D7RvsOcE1hASsgrMu6w/fKTIhxT5oN0K1Jw==",
"hasInstallScript": true,
"dependencies": {
"@sveltejs/vite-plugin-svelte": "^2.0.0",
"@types/cookie": "^0.5.1",
"cookie": "^0.5.0",
"devalue": "^4.2.3",
"devalue": "^4.3.0",
"esm-env": "^1.0.0",
"kleur": "^4.1.5",
"magic-string": "^0.27.0",
"magic-string": "^0.30.0",
"mime": "^3.0.0",
"sade": "^1.8.1",
"set-cookie-parser": "^2.5.1",
"sirv": "^2.0.2",
"tiny-glob": "^0.2.9",
"undici": "5.16.0"
"undici": "5.21.0"
},
"bin": {
"svelte-kit": "svelte-kit.js"
@ -514,6 +538,17 @@
"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": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@sveltejs/package/-/package-1.0.2.tgz",
@ -590,6 +625,14 @@
"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": {
"version": "0.5.1",
"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",
"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": {
"version": "18.11.18",
"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",
"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": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
@ -1235,6 +1303,15 @@
"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": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@ -1300,10 +1377,9 @@
}
},
"node_modules/devalue": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-4.2.3.tgz",
"integrity": "sha512-JG6Q248aN0pgFL57e3zqTVeFraBe+5W2ugvv1mLXsJP6YYIYJhRZhAl7QP8haJrqob6X10F9NEkuCvNILZTPeQ==",
"license": "MIT"
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz",
"integrity": "sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA=="
},
"node_modules/didyoumean": {
"version": "1.2.2",
@ -1402,6 +1478,11 @@
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
"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": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
@ -1410,11 +1491,44 @@
"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": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
"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": {
"version": "0.16.17",
"hasInstallScript": true,
@ -1924,6 +2038,19 @@
"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": {
"version": "3.2.12",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
@ -2251,6 +2378,11 @@
"@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": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@ -2283,6 +2415,14 @@
"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": {
"version": "2.0.6",
"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_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": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
@ -2584,6 +2729,16 @@
"integrity": "sha512-GSCXyoZBUaaPwVWdYncMEmzlSUjF9J/YeEHpklYJCyg8wPuJP3NzDx0BkiwArzINkdX2HJHvUJhL6vVWPOQQcg==",
"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": {
"version": "2.0.9",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz",
@ -2627,6 +2782,10 @@
"ws": "^8.8.1"
}
},
"node_modules/nostr-dev-kit": {
"resolved": "../../nostr/ndk/nostr-dev-kit",
"link": true
},
"node_modules/nostr-tools": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-1.7.4.tgz",
@ -4408,6 +4567,24 @@
"devOptional": true,
"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": {
"version": "4.9.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
@ -4421,8 +4598,9 @@
}
},
"node_modules/undici": {
"version": "5.16.0",
"license": "MIT",
"version": "5.21.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz",
"integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==",
"dependencies": {
"busboy": "^1.6.0"
},
@ -4466,6 +4644,18 @@
"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": {
"version": "1.0.2",
"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": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
@ -4600,6 +4836,14 @@
"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": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
@ -4903,23 +5147,33 @@
}
},
"@sveltejs/kit": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.3.7.tgz",
"integrity": "sha512-H0V8qpd7sax/f/i90lSBEVjubuCkex9M1KvARdptwirLDL9qtJXRUClK25zrDi9IpqIMtbxYnZmfiaaTLcxTGQ==",
"version": "1.14.0",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.14.0.tgz",
"integrity": "sha512-4e/cZT0z4IppEkqNvMrurGz6VE1gScukFU7XqwTL/yrGJGXHqS9D7RvsOcE1hASsgrMu6w/fKTIhxT5oN0K1Jw==",
"requires": {
"@sveltejs/vite-plugin-svelte": "^2.0.0",
"@types/cookie": "^0.5.1",
"cookie": "^0.5.0",
"devalue": "^4.2.3",
"devalue": "^4.3.0",
"esm-env": "^1.0.0",
"kleur": "^4.1.5",
"magic-string": "^0.27.0",
"magic-string": "^0.30.0",
"mime": "^3.0.0",
"sade": "^1.8.1",
"set-cookie-parser": "^2.5.1",
"sirv": "^2.0.2",
"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": {
@ -4971,6 +5225,14 @@
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
"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": {
"version": "0.5.1",
"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",
"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": {
"version": "18.11.18",
"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",
"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": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
@ -5437,6 +5720,15 @@
"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": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@ -5477,9 +5769,9 @@
}
},
"devalue": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-4.2.3.tgz",
"integrity": "sha512-JG6Q248aN0pgFL57e3zqTVeFraBe+5W2ugvv1mLXsJP6YYIYJhRZhAl7QP8haJrqob6X10F9NEkuCvNILZTPeQ=="
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz",
"integrity": "sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA=="
},
"didyoumean": {
"version": "1.2.2",
@ -5550,16 +5842,50 @@
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
"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": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"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": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
"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": {
"version": "0.16.17",
"requires": {
@ -5832,6 +6158,21 @@
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
"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": {
"version": "3.2.12",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
@ -6067,6 +6408,11 @@
"@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": {
"version": "2.0.0",
"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",
"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": {
"version": "2.0.6",
"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",
"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": {
"version": "3.0.4",
"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",
"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": {
"version": "2.0.9",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz",
@ -6342,6 +6706,21 @@
"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": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-1.7.4.tgz",
@ -7526,13 +7905,33 @@
"integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
"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": {
"version": "4.9.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
"integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g=="
},
"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": {
"busboy": "^1.6.0"
}
@ -7554,6 +7953,14 @@
"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": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@ -7592,6 +7999,51 @@
"integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==",
"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": {
"version": "1.3.1",
"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",
"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": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",

View file

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

View file

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

View file

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

View file

@ -1,7 +1,9 @@
<script>
import { onMount } from 'svelte';
import { selectedMessage } from './lib/store';
import { afterUpdate, onMount } from 'svelte';
import { selectedMessage, zappingMessage, zapsPerMessage } from './lib/store';
import { chatData, chatAdapter } from './lib/store';
import { nip19 } from 'nostr-tools';
import ZapAmountButton from './ZapAmountButton.svelte';
// import { prettifyContent } from '$lib/utils';
export let event;
export let responses;
@ -9,6 +11,11 @@
let profiles = {};
let profilePicture;
let npub;
let zappingIt;
let hovering;
let zappedAmount = 0;
function selectMessage() {
if ($selectedMessage === event.id) {
@ -21,7 +28,7 @@
// delay-fetch responses
onMount(() => {
$chatAdapter.delayedSubscribe(
{kinds: [1], '#e': [event.id]}
{kinds: [1, 9735], '#e': [event.id]}
, 'responses', 500)
})
@ -29,27 +36,107 @@
$: profiles = $chatData.profiles;
$: 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);
</script>
<div
class="
block p-2-lg mb-3
flex flex-col gap-4
p-2-lg mb-3
text-wrap
relative
"
on:mouseenter={() => (hovering = true)}
on:mouseleave={() => (hovering = false)}
>
<div class="flex flex-row gap-4">
<div class="min-w-fit">
<img src="{profilePicture}" class="
block w-10 h-10 rounded-full
{byWebsiteOwner ? 'ring-purple-700 ring-4' : 'ring-gray-300 ring-2'}
" alt="" />
<div class="flex flex-row gap-3">
<div class="min-w-fit flex flex-col gap-2">
<a href={`nostr:${npub}`}>
<img src="{profilePicture}" class="
block w-8 h-8 rounded-full
{byWebsiteOwner ? 'ring-purple-700 ring-4' : ''}
" 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>
{#if nip05}
<span class="text-sm text-gray-400">{nip05}</span>
@ -64,13 +151,17 @@
max-h-64 text-base
cursor-pointer
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
" 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}
</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">
<span class="py-2">
{timestamp.toLocaleString()}
@ -92,7 +183,7 @@
</div>
{#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}
<svelte:self {websiteOwnerPubkey} event={response} {responses} />
{/each}

View file

@ -24,11 +24,15 @@
}
</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}
<div class="
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' : ''}
" style="max-height: 80vh;">
{#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 * as uuid from 'uuid';
import debug from 'debug';
import { NDKEvent, zapInvoiceFromEvent } from 'nostr-dev-kit';
const log = new debug('nostr:adapter');
const profilesLog = new debug('nostr:adapter:profiles');
@ -174,10 +175,27 @@ class NstrAdapter {
if (!this.#delayedSubscriptionTimeouts[family]) {
this.#delayedSubscriptionTimeouts[family] = setTimeout(() => {
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];
this.subscribe(filters, (e) => { this.#emitMessage(e)});
// 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)});
});
}, timeout)
}
}
@ -191,6 +209,9 @@ class NstrAdapter {
const subId = uuid.v4();
this.#handlers[subId] = messageCallback;
if (!Array.isArray(filters)) { filters = [filters] }
this.#pool.subscribe(subId, filters);
this.#pool.on('event', (relay, recSubId, e) => {
this.onEvent(e, this.#handlers[recSubId])
@ -212,23 +233,24 @@ class NstrAdapter {
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 = []
if (event.kind === 5) {
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) {
case 1: this.#eventEmitter.emit('message', event); break;
case 4: this.#eventEmitter.emit('message', event); break;
case 5: this.#eventEmitter.emit('deleted', deletedEvents); break;
case 7: this.#eventEmitter.emit('reaction', event); break;
case 9735: this.#eventEmitter.emit('zap', zap); break;
default:
// alert('unknown event kind ' + event.kind)
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 chatData = writable({ events: [], profiles: {}});
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>
import 'websocket-polyfill';
import Container from '../Container.svelte';
import Widget from '../Widget.svelte';
import { chatAdapter } from '$lib/store';
@ -10,10 +11,10 @@
let chatReferenceTags = [];
const relays = [
'wss://relay.f7z.io',
'wss://nos.lol',
'wss://relay.nostr.info',
'wss://nostr-pub.wellorder.net',
'wss://relay.current.fyi',
'wss://relay.nos.lol',
'wss://nostr.walletofsatoshi.com',
'wss://relay.nostr.band',
];
@ -80,7 +81,7 @@
">
<div class="
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
fixed
" style="{chatStarted ? 'max-height: 80vh;' : 'padding: 4rem 2rem !important;'}">