Compare commits

...

4 Commits

Author SHA1 Message Date
zhan 46fea9519b
Merge 7580f476d1 into 0e6e7af934 2025-08-26 21:47:50 +03:00
tajava2006 0e6e7af934 chore: Bump version and document NIP-46 usage 2025-08-25 11:00:06 -03:00
codytseng 8866042edf relay: ensure onclose callback is triggered 2025-08-24 22:22:38 -03:00
zhan 7580f476d1
Update index.ts
export useWebSocketImplementation for nodejs
2024-07-15 11:16:05 +08:00
6 changed files with 19 additions and 23 deletions

View File

@ -191,7 +191,7 @@ const localSecretKey = generateSecretKey()
### Method 1: Using a Bunker URI (`bunker://`)
This is the bunker-initiated flow. Your client receives a `bunker://` string or a NIP-05 identifier from the user. You use `BunkerSigner.fromBunker()` to create an instance, which returns immediately. You must then explicitly call `await bunker.connect()` to establish the connection with the bunker.
This is the bunker-initiated flow. Your client receives a `bunker://` string or a NIP-05 identifier from the user. You use `BunkerSigner.fromBunker()` to create an instance, which returns immediately. For the **initial connection** with a new bunker, you must explicitly call `await bunker.connect()` to establish the connection and receive authorization.
```js
import { BunkerSigner, parseBunkerInput } from '@nostr/tools/nip46'
@ -221,6 +221,7 @@ const event = await bunker.signEvent({
await signer.close()
pool.close([])
```
> **Note on Reconnecting:** Once a connection has been successfully established and the `BunkerPointer` is stored, you do **not** need to call `await bunker.connect()` on subsequent sessions.
### Method 2: Using a Client-generated URI (`nostrconnect://`)
@ -260,6 +261,7 @@ const event = await signer.signEvent({
await signer.close()
pool.close([])
```
> **Note on Persistence:** This method is ideal for the initial sign-in. To allow users to stay logged in across sessions, you should store the connection details and use `Method 1` for subsequent reconnections.
### Parsing thread from any note based on NIP-10

View File

@ -121,23 +121,19 @@ export class AbstractRelay {
this.ws.onerror = ev => {
clearTimeout(this.connectionTimeoutHandle)
reject((ev as any).message || 'websocket error')
if (this._connected) {
this._connected = false
this.connectionPromise = undefined
this.onclose?.()
this.closeAllSubscriptions('relay connection errored')
}
this._connected = false
this.connectionPromise = undefined
this.onclose?.()
this.closeAllSubscriptions('relay connection errored')
}
this.ws.onclose = ev => {
clearTimeout(this.connectionTimeoutHandle)
reject((ev as any).message || 'websocket closed')
if (this._connected) {
this._connected = false
this.connectionPromise = undefined
this.onclose?.()
this.closeAllSubscriptions('relay connection closed')
}
this._connected = false
this.connectionPromise = undefined
this.onclose?.()
this.closeAllSubscriptions('relay connection closed')
}
this.ws.onmessage = this._onmessage.bind(this)
@ -187,8 +183,8 @@ export class AbstractRelay {
// pingpong closing socket
this.closeAllSubscriptions('pingpong timed out')
this._connected = false
this.ws?.close()
this.onclose?.()
this.ws?.close()
}
}
}
@ -378,8 +374,8 @@ export class AbstractRelay {
public close() {
this.closeAllSubscriptions('relay connection closed by us')
this._connected = false
this.ws?.close()
this.onclose?.()
this.ws?.close()
}
// this is the function assigned to this.ws.onmessage

View File

@ -1,5 +1,5 @@
export * from './pure.ts'
export { Relay } from './relay.ts'
export { Relay, useWebSocketImplementation } from './relay.ts'
export * from './filter.ts'
export { SimplePool } from './pool.ts'
export * from './references.ts'

View File

@ -1,6 +1,6 @@
{
"name": "@nostr/tools",
"version": "2.16.2",
"version": "2.17.0",
"exports": {
".": "./index.ts",
"./core": "./core.ts",

View File

@ -97,7 +97,7 @@ export type ParsedNostrConnectURI = {
name?: string
url?: string
image?: string
};
}
originalString: string
}
@ -185,7 +185,6 @@ export function parseNostrConnectURI(uri: string): ParsedNostrConnectURI {
}
}
export type BunkerSignerParams = {
pool?: AbstractSimplePool
onauth?: (url: string) => void
@ -236,7 +235,7 @@ export class BunkerSigner implements Signer {
public static fromBunker(
clientSecretKey: Uint8Array,
bp: BunkerPointer,
params: BunkerSignerParams = {}
params: BunkerSignerParams = {},
): BunkerSigner {
if (bp.relays.length === 0) {
throw new Error('No relays specified for this bunker')
@ -304,12 +303,11 @@ export class BunkerSigner implements Signer {
reject(new Error('Subscription closed before connection was established.'))
},
maxWait,
}
},
)
})
}
private setupSubscription(params: BunkerSignerParams) {
const listeners = this.listeners
const waitingForAuth = this.waitingForAuth

View File

@ -1,7 +1,7 @@
{
"type": "module",
"name": "nostr-tools",
"version": "2.16.2",
"version": "2.17.0",
"description": "Tools for making a Nostr client.",
"repository": {
"type": "git",