Compare commits

..

No commits in common. "main" and "v1.1.0" have entirely different histories.

6 changed files with 26 additions and 33 deletions

View file

@ -1,17 +1,8 @@
{ {
"name": "Nostr Client", "name": "Nostr Client",
"short_description": "Nostr relay multiplexer",
"version": "1.1.0", "version": "1.1.0",
"short_description": "Nostr client for extensions",
"tile": "/nostrclient/static/images/nostr-bitcoin.png", "tile": "/nostrclient/static/images/nostr-bitcoin.png",
"contributors": ["calle", "motorina0", "dni"], "contributors": ["calle", "motorina0", "dni"],
"min_lnbits_version": "1.4.0", "min_lnbits_version": "1.0.0"
"images": [
{
"uri": "https://raw.githubusercontent.com/lnbits/nostrclient/add-extension-metadata/static/images/1.jpeg"
},
{
"uri": "https://raw.githubusercontent.com/lnbits/nostrclient/add-extension-metadata/static/images/2.jpeg"
}
],
"description_md": "https://raw.githubusercontent.com/lnbits/nostrclient/add-extension-metadata/description.md"
} }

View file

@ -1,8 +1 @@
An always-on relay multiplexer that simplifies connecting to multiple Nostr relays. An always-on extension that can open multiple connections to nostr relays and act as a multiplexer for other clients: You open a single websocket to nostrclient which then sends the data to multiple relays. The responses from these relays are then sent back to the client.
Instead of your Nostr client managing connections to dozens of relays, you connect to a single WebSocket endpoint provided by `nostrclient`, which then fans out your requests to all configured relays and aggregates the responses back to you.
- **Simplified Client Configuration** - Connect to one endpoint instead of managing multiple relay connections
- **Always-On Connectivity** - Your LNbits instance maintains persistent connections to relays
- **Resource Efficient** - Share relay connections across multiple clients
- **Automatic Subscription Management** - Subscription ID rewriting prevents conflicts between clients

Binary file not shown.

Before

Width:  |  Height:  |  Size: 488 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 KiB

View file

@ -476,7 +476,11 @@
getRelays: function () { getRelays: function () {
var self = this var self = this
LNbits.api LNbits.api
.request('GET', '/nostrclient/api/v1/relays') .request(
'GET',
'/nostrclient/api/v1/relays?usr=' + this.g.user.id,
this.g.user.wallets[0].adminkey
)
.then(function (response) { .then(function (response) {
if (response.data) { if (response.data) {
response.data.map(maplrelays) response.data.map(maplrelays)
@ -504,9 +508,12 @@
console.log('ADD RELAY ' + this.relayToAdd) console.log('ADD RELAY ' + this.relayToAdd)
let that = this let that = this
LNbits.api LNbits.api
.request('POST', '/nostrclient/api/v1/relay', null, { .request(
url: this.relayToAdd 'POST',
}) '/nostrclient/api/v1/relay?usr=' + this.g.user.id,
this.g.user.wallets[0].adminkey,
{url: this.relayToAdd}
)
.then(function (response) { .then(function (response) {
console.log('response:', response) console.log('response:', response)
if (response.data) { if (response.data) {
@ -533,7 +540,12 @@
}, },
deleteRelay(url) { deleteRelay(url) {
LNbits.api LNbits.api
.request('DELETE', '/nostrclient/api/v1/relay', null, {url: url}) .request(
'DELETE',
'/nostrclient/api/v1/relay?usr=' + this.g.user.id,
this.g.user.wallets[0].adminkey,
{url: url}
)
.then(response => { .then(response => {
const relayIndex = this.nostrrelayLinks.indexOf(r => r.url === url) const relayIndex = this.nostrrelayLinks.indexOf(r => r.url === url)
if (relayIndex !== -1) { if (relayIndex !== -1) {
@ -549,7 +561,8 @@
try { try {
const {data} = await LNbits.api.request( const {data} = await LNbits.api.request(
'GET', 'GET',
'/nostrclient/api/v1/config' '/nostrclient/api/v1/config',
this.g.user.wallets[0].adminkey
) )
this.config.data = data this.config.data = data
} catch (error) { } catch (error) {
@ -561,7 +574,7 @@
const {data} = await LNbits.api.request( const {data} = await LNbits.api.request(
'PUT', 'PUT',
'/nostrclient/api/v1/config', '/nostrclient/api/v1/config',
null, this.g.user.wallets[0].adminkey,
this.config.data this.config.data
) )
this.config.data = data this.config.data = data
@ -610,7 +623,7 @@
const {data} = await LNbits.api.request( const {data} = await LNbits.api.request(
'PUT', 'PUT',
'/nostrclient/api/v1/relay/test', '/nostrclient/api/v1/relay/test',
null, this.g.user.wallets[0].adminkey,
{ {
sender_private_key: this.testData.senderPrivateKey, sender_private_key: this.testData.senderPrivateKey,
reciever_public_key: this.testData.recieverPublicKey, reciever_public_key: this.testData.recieverPublicKey,

View file

@ -1,7 +1,6 @@
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Request
from fastapi.responses import HTMLResponse from fastapi.responses import HTMLResponse
from lnbits.core.crud.users import get_user_from_account from lnbits.core.models import User
from lnbits.core.models.users import Account
from lnbits.decorators import check_admin from lnbits.decorators import check_admin
from lnbits.helpers import template_renderer from lnbits.helpers import template_renderer
@ -13,10 +12,7 @@ def nostr_renderer():
@nostrclient_generic_router.get("/", response_class=HTMLResponse) @nostrclient_generic_router.get("/", response_class=HTMLResponse)
async def index(request: Request, account: Account = Depends(check_admin)): async def index(request: Request, user: User = Depends(check_admin)):
user = await get_user_from_account(account)
if not user:
return HTMLResponse("No user found", status_code=404)
return nostr_renderer().TemplateResponse( return nostr_renderer().TemplateResponse(
"nostrclient/index.html", {"request": request, "user": user.json()} "nostrclient/index.html", {"request": request, "user": user.json()}
) )