Compare commits

..

4 Commits

Author SHA1 Message Date
fiatjaf
b3d314643a make everything dependent on npm again. 2026-01-30 07:16:04 -03:00
fiatjaf
30ac8a02c2 readme to point only to jsr because npm is awful. 2026-01-28 17:28:27 -03:00
fiatjaf
42c9c7554d migrate to jsr dependencies for @noble and @scure. 2026-01-27 23:54:50 -03:00
fiatjaf
3588d30044 do the same for @noble/ciphers and @scure packages. 2026-01-27 22:43:54 -03:00
10 changed files with 38 additions and 41 deletions

View File

@@ -1,4 +1,4 @@
# ![](https://img.shields.io/github/actions/workflow/status/nbd-wtf/nostr-tools/test.yml) [![JSR](https://jsr.io/badges/@nostr/tools)](https://jsr.io/@nostr/tools) nostr-tools # [![JSR](https://jsr.io/badges/@nostr/tools)](https://jsr.io/@nostr/tools) @nostr/tools
Tools for developing [Nostr](https://github.com/fiatjaf/nostr) clients. Tools for developing [Nostr](https://github.com/fiatjaf/nostr) clients.
@@ -9,9 +9,6 @@ This package is only providing lower-level functionality. If you want higher-lev
## Installation ## Installation
```bash ```bash
# npm
npm install --save nostr-tools
# jsr # jsr
npx jsr add @nostr/tools npx jsr add @nostr/tools
``` ```
@@ -27,7 +24,7 @@ https://jsr.io/@nostr/tools/doc
### Generating a private key and a public key ### Generating a private key and a public key
```js ```js
import { generateSecretKey, getPublicKey } from 'nostr-tools/pure' import { generateSecretKey, getPublicKey } from '@nostr/tools/pure'
let sk = generateSecretKey() // `sk` is a Uint8Array let sk = generateSecretKey() // `sk` is a Uint8Array
let pk = getPublicKey(sk) // `pk` is a hex string let pk = getPublicKey(sk) // `pk` is a hex string
@@ -36,7 +33,7 @@ let pk = getPublicKey(sk) // `pk` is a hex string
To get the secret key in hex format, use To get the secret key in hex format, use
```js ```js
import { bytesToHex, hexToBytes } from '@noble/hashes/utils' // already an installed dependency import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js' // already an installed dependency
let skHex = bytesToHex(sk) let skHex = bytesToHex(sk)
let backToBytes = hexToBytes(skHex) let backToBytes = hexToBytes(skHex)
@@ -45,7 +42,7 @@ let backToBytes = hexToBytes(skHex)
### Creating, signing and verifying events ### Creating, signing and verifying events
```js ```js
import { finalizeEvent, verifyEvent } from 'nostr-tools/pure' import { finalizeEvent, verifyEvent } from '@nostr/tools/pure'
let event = finalizeEvent({ let event = finalizeEvent({
kind: 1, kind: 1,
@@ -62,8 +59,8 @@ let isGood = verifyEvent(event)
Doesn't matter what you do, you always should be using a `SimplePool`: Doesn't matter what you do, you always should be using a `SimplePool`:
```js ```js
import { finalizeEvent, generateSecretKey, getPublicKey } from 'nostr-tools/pure' import { finalizeEvent, generateSecretKey, getPublicKey } from '@nostr/tools/pure'
import { SimplePool } from 'nostr-tools/pool' import { SimplePool } from '@nostr/tools/pool'
const pool = new SimplePool() const pool = new SimplePool()
@@ -126,8 +123,8 @@ relay.close()
To use this on Node.js you first must install `ws` and call something like this: To use this on Node.js you first must install `ws` and call something like this:
```js ```js
import { useWebSocketImplementation } from 'nostr-tools/pool' import { useWebSocketImplementation } from '@nostr/tools/pool'
// or import { useWebSocketImplementation } from 'nostr-tools/relay' if you're using the Relay directly // or import { useWebSocketImplementation } from '@nostr/tools/relay' if you're using the Relay directly
import WebSocket from 'ws' import WebSocket from 'ws'
useWebSocketImplementation(WebSocket) useWebSocketImplementation(WebSocket)
@@ -138,7 +135,7 @@ useWebSocketImplementation(WebSocket)
You can enable regular pings of connected relays with the `enablePing` option. This will set up a heartbeat that closes the websocket if it doesn't receive a response in time. Some platforms, like Node.js, don't report websocket disconnections due to network issues, and enabling this can increase the reliability of the `onclose` event. You can enable regular pings of connected relays with the `enablePing` option. This will set up a heartbeat that closes the websocket if it doesn't receive a response in time. Some platforms, like Node.js, don't report websocket disconnections due to network issues, and enabling this can increase the reliability of the `onclose` event.
```js ```js
import { SimplePool } from 'nostr-tools/pool' import { SimplePool } from '@nostr/tools/pool'
const pool = new SimplePool({ enablePing: true }) const pool = new SimplePool({ enablePing: true })
``` ```
@@ -148,7 +145,7 @@ const pool = new SimplePool({ enablePing: true })
You can also enable automatic reconnection with the `enableReconnect` option. This will make the pool try to reconnect to relays with an exponential backoff delay if the connection is lost unexpectedly. You can also enable automatic reconnection with the `enableReconnect` option. This will make the pool try to reconnect to relays with an exponential backoff delay if the connection is lost unexpectedly.
```js ```js
import { SimplePool } from 'nostr-tools/pool' import { SimplePool } from '@nostr/tools/pool'
const pool = new SimplePool({ enableReconnect: true }) const pool = new SimplePool({ enableReconnect: true })
``` ```
@@ -331,7 +328,7 @@ for (let profile of refs.profiles) {
### Querying profile data from a NIP-05 address ### Querying profile data from a NIP-05 address
```js ```js
import { queryProfile } from 'nostr-tools/nip05' import { queryProfile } from '@nostr/tools/nip05'
let profile = await queryProfile('jb55.com') let profile = await queryProfile('jb55.com')
console.log(profile.pubkey) console.log(profile.pubkey)
@@ -343,13 +340,13 @@ console.log(profile.relays)
To use this on Node.js < v18, you first must install `node-fetch@2` and call something like this: To use this on Node.js < v18, you first must install `node-fetch@2` and call something like this:
```js ```js
import { useFetchImplementation } from 'nostr-tools/nip05' import { useFetchImplementation } from '@nostr/tools/nip05'
useFetchImplementation(require('node-fetch')) useFetchImplementation(require('node-fetch'))
``` ```
### Including NIP-07 types ### Including NIP-07 types
```js ```js
import type { WindowNostr } from 'nostr-tools/nip07' import type { WindowNostr } from '@nostr/tools/nip07'
declare global { declare global {
interface Window { interface Window {
@@ -361,8 +358,8 @@ declare global {
### Encoding and decoding NIP-19 codes ### Encoding and decoding NIP-19 codes
```js ```js
import { generateSecretKey, getPublicKey } from 'nostr-tools/pure' import { generateSecretKey, getPublicKey } from '@nostr/tools/pure'
import * as nip19 from 'nostr-tools/nip19' import * as nip19 from '@nostr/tools/nip19'
let sk = generateSecretKey() let sk = generateSecretKey()
let nsec = nip19.nsecEncode(sk) let nsec = nip19.nsecEncode(sk)
@@ -390,7 +387,7 @@ assert(data.relays.length === 2)
[`nostr-wasm`](https://github.com/fiatjaf/nostr-wasm) is a thin wrapper over [libsecp256k1](https://github.com/bitcoin-core/secp256k1) compiled to WASM just for hashing, signing and verifying Nostr events. [`nostr-wasm`](https://github.com/fiatjaf/nostr-wasm) is a thin wrapper over [libsecp256k1](https://github.com/bitcoin-core/secp256k1) compiled to WASM just for hashing, signing and verifying Nostr events.
```js ```js
import { setNostrWasm, generateSecretKey, finalizeEvent, verifyEvent } from 'nostr-tools/wasm' import { setNostrWasm, generateSecretKey, finalizeEvent, verifyEvent } from '@nostr/tools/wasm'
import { initNostrWasm } from 'nostr-wasm' import { initNostrWasm } from 'nostr-wasm'
// make sure this promise resolves before your app starts calling finalizeEvent or verifyEvent // make sure this promise resolves before your app starts calling finalizeEvent or verifyEvent
@@ -403,9 +400,9 @@ initNostrWasm().then(setNostrWasm)
If you're going to use `Relay` and `SimplePool` you must also import `nostr-tools/abstract-relay` and/or `nostr-tools/abstract-pool` instead of the defaults and then instantiate them by passing the `verifyEvent`: If you're going to use `Relay` and `SimplePool` you must also import `nostr-tools/abstract-relay` and/or `nostr-tools/abstract-pool` instead of the defaults and then instantiate them by passing the `verifyEvent`:
```js ```js
import { setNostrWasm, verifyEvent } from 'nostr-tools/wasm' import { setNostrWasm, verifyEvent } from '@nostr/tools/wasm'
import { AbstractRelay } from 'nostr-tools/abstract-relay' import { AbstractRelay } from '@nostr/tools/abstract-relay'
import { AbstractSimplePool } from 'nostr-tools/abstract-pool' import { AbstractSimplePool } from '@nostr/tools/abstract-pool'
import { initNostrWasm } from 'nostr-wasm' import { initNostrWasm } from 'nostr-wasm'
initNostrWasm().then(setNostrWasm) initNostrWasm().then(setNostrWasm)
@@ -442,7 +439,7 @@ summary for relay read message and verify event
## Plumbing ## Plumbing
To develop `nostr-tools`, install [`just`](https://just.systems/) and run `just -l` to see commands available. To develop `@nostr/tools`, install [`just`](https://just.systems/) and run `just -l` to see commands available.
## License ## License

BIN
bun.lockb

Binary file not shown.

View File

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

View File

@@ -1,6 +1,6 @@
import { bytesToHex, hexToBytes, randomBytes } from '@noble/hashes/utils.js' import { hexToBytes, randomBytes } from '@noble/hashes/utils.js'
import { secp256k1 } from '@noble/curves/secp256k1.js' import { secp256k1 } from '@noble/curves/secp256k1.js'
import { cbc } from '@noble/ciphers/aes' import { cbc } from '@noble/ciphers/aes.js'
import { base64 } from '@scure/base' import { base64 } from '@scure/base'
import { utf8Decoder, utf8Encoder } from './utils.ts' import { utf8Decoder, utf8Encoder } from './utils.ts'

View File

@@ -1,5 +1,5 @@
import { bytesToHex } from '@noble/hashes/utils.js' import { bytesToHex } from '@noble/hashes/utils.js'
import { wordlist } from '@scure/bip39/wordlists/english' import { wordlist } from '@scure/bip39/wordlists/english.js'
import { generateMnemonic, mnemonicToSeedSync, validateMnemonic } from '@scure/bip39' import { generateMnemonic, mnemonicToSeedSync, validateMnemonic } from '@scure/bip39'
import { HDKey } from '@scure/bip32' import { HDKey } from '@scure/bip32'

View File

@@ -110,7 +110,7 @@ export function decode(nip19: NPub): DecodedNpub
export function decode(nip19: Note): DecodedNote export function decode(nip19: Note): DecodedNote
export function decode(code: string): DecodedResult export function decode(code: string): DecodedResult
export function decode(code: string): DecodedResult { export function decode(code: string): DecodedResult {
let { prefix, words } = bech32.decode(code, Bech32MaxSize) let { prefix, words } = bech32.decode(code as `${string}1${string}`, Bech32MaxSize)
let data = new Uint8Array(bech32.fromWords(words)) let data = new Uint8Array(bech32.fromWords(words))
switch (prefix) { switch (prefix) {

View File

@@ -1,5 +1,5 @@
import { chacha20 } from '@noble/ciphers/chacha' import { chacha20 } from '@noble/ciphers/chacha.js'
import { equalBytes } from '@noble/ciphers/utils' import { equalBytes } from '@noble/ciphers/utils.js'
import { secp256k1 } from '@noble/curves/secp256k1.js' import { secp256k1 } from '@noble/curves/secp256k1.js'
import { extract as hkdf_extract, expand as hkdf_expand } from '@noble/hashes/hkdf.js' import { extract as hkdf_extract, expand as hkdf_expand } from '@noble/hashes/hkdf.js'
import { hmac } from '@noble/hashes/hmac.js' import { hmac } from '@noble/hashes/hmac.js'

View File

@@ -1,8 +1,8 @@
import { bech32 } from '@scure/base'
import { scrypt } from '@noble/hashes/scrypt.js' import { scrypt } from '@noble/hashes/scrypt.js'
import { xchacha20poly1305 } from '@noble/ciphers/chacha' import { xchacha20poly1305 } from '@noble/ciphers/chacha.js'
import { concatBytes, randomBytes } from '@noble/hashes/utils.js' import { concatBytes, randomBytes } from '@noble/hashes/utils.js'
import { Bech32MaxSize, Ncryptsec, encodeBytes } from './nip19.ts' import { Bech32MaxSize, Ncryptsec, encodeBytes } from './nip19.ts'
import { bech32 } from '@scure/base'
export function encrypt( export function encrypt(
sec: Uint8Array, sec: Uint8Array,
@@ -22,7 +22,7 @@ export function encrypt(
} }
export function decrypt(ncryptsec: string, password: string): Uint8Array { export function decrypt(ncryptsec: string, password: string): Uint8Array {
let { prefix, words } = bech32.decode(ncryptsec, Bech32MaxSize) let { prefix, words } = bech32.decode(ncryptsec as `${string}1${string}`, Bech32MaxSize)
if (prefix !== 'ncryptsec') { if (prefix !== 'ncryptsec') {
throw new Error(`invalid prefix ${prefix}, expected 'ncryptsec'`) throw new Error(`invalid prefix ${prefix}, expected 'ncryptsec'`)
} }

View File

@@ -1,4 +1,4 @@
import { bytesToHex, hexToBytes } from '@noble/ciphers/utils' import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'
import { Filter } from './filter.ts' import { Filter } from './filter.ts'
import { AbstractRelay, Subscription } from './relay.ts' import { AbstractRelay, Subscription } from './relay.ts'
import { sha256 } from '@noble/hashes/sha2.js' import { sha256 } from '@noble/hashes/sha2.js'

View File

@@ -1,7 +1,7 @@
{ {
"type": "module", "type": "module",
"name": "nostr-tools", "name": "nostr-tools",
"version": "2.20.0", "version": "2.22.0",
"description": "Tools for making a Nostr client.", "description": "Tools for making a Nostr client.",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -236,12 +236,12 @@
}, },
"license": "Unlicense", "license": "Unlicense",
"dependencies": { "dependencies": {
"@noble/ciphers": "^0.5.1", "@noble/ciphers": "2.1.1",
"@noble/curves": "^2.0.1", "@noble/curves": "2.0.1",
"@noble/hashes": "^2.0.1", "@noble/hashes": "2.0.1",
"@scure/base": "1.1.1", "@scure/base": "2.0.0",
"@scure/bip32": "1.3.1", "@scure/bip32": "2.0.1",
"@scure/bip39": "1.2.1", "@scure/bip39": "2.0.1",
"nostr-wasm": "0.1.0" "nostr-wasm": "0.1.0"
}, },
"peerDependencies": { "peerDependencies": {