# Module @welshman/signer

# @welshman/signer

Implementations of signer utilities and classes.

## Nips supported

- NIP 01 (private key login)
- NIP 07
- NIP 46
- NIP 55
- NIP 59 (gift wrapping, works with any signer that supports encryption)

## Examples

### NIP 01

    import {makeSecret, Nip01Signer} from '@welshman/signer'

    const signer = Nip01Signer.fromSecret(makeSecret())

### NIP 07

    import {getNip07, Nip07Signer} from '@welshman/signer'

    if (getNip07()) {
      const signer = new Nip07Signer()
    }

### NIP 55

    import {getNip07, Nip07Signer} from '@welshman/signer'

    if (getNip07()) {
      const signer = new Nip07Signer()
    }

### NIP 46

    import {createEvent, NOTE} from '@welshman/util'
    import {makeSecret, Nip46Broker, Nip46Signer} from '@welshman/signer'

    const clientSecret = makeSecret()
    const relays = ['wss://relay.signer.example/']
    const broker = Nip46Broker.get({relays, clientSecret})
    const signer = new Nip46Signer(broker)
    const ncUrl = broker.makeNostrconnectUrl({name: "My app"})
    const abortController = new AbortController()

    let response
    try {
      response = await broker.waitForNostrconnect(url, abortController)
    } catch (e: any) {
      if (e?.error) {
        showWarning(`Received error from signer: ${e.error}`)
      } else if (e) {
        console.error(e)
      }
    }

    if (response) {
      // Now we know the bunker's pubkey and can do stuff with the signer
      const signerPubkey = response.event.pubkey

      // Next time we want to use our signer, we can instantiate it like so:
      const newBroker = Nip46Broker.get({relays, clientSecret, signerPubkey})
      const newSigner = new Nip46Signer(newBroker)
    }

### Using signers

    import {createEvent, NOTE, DIRECT_MESSAGE} from '@welshman/util'

    const signer = // Create your signer...
    const nip59 = Nip59.fromSigner(signer)

    // Sign an event
    const event = await signer.sign(createEvent(NOTE, {content: "hi"}))

    // Wrap a NIP 17 DM
    const rumor = await nip59.wrap(recipientPubkey, createEvent(DIRECT_MESSAGE, {content: "hi"}))

    // Note that it returns a rumor; be sure to publish the `wrap`
    const wrap = rumor.wrap

##
Enumerations

Nip46Event

##
Classes

Nip01Signer
Nip07Signer
Nip46Broker
Nip46Receiver
Nip46Request
Nip46Sender
Nip46Signer
Nip55Signer
Nip59

##
Interfaces

ISigner

##
Type Aliases

Decrypt
Encrypt
EncryptionImplementation
Nip07
Nip46Algorithm
Nip46BrokerParams
Nip46Response
Nip46ResponseWithError
Nip46ResponseWithResult
Sign

##
Variables

nip04
nip44
seen

##
Functions

decrypt
getHash
getNip07
getNip55
getPubkey
getRumor
getSeal
getSig
getWrap
hash
makeSecret
now
own
sign
stamp
unwrap
wrap