@@ -10,7 +10,7 @@ use std::sync::Arc;
10
10
use std:: time:: Duration ;
11
11
12
12
use async_utility:: time;
13
- use nostr:: nips:: nip46:: { Message , Request , ResponseResult } ;
13
+ use nostr:: nips:: nip46:: ResponseResult ;
14
14
use nostr_relay_pool:: prelude:: * ;
15
15
use tokio:: sync:: broadcast:: Receiver ;
16
16
use tokio:: sync:: OnceCell ;
@@ -224,7 +224,7 @@ impl NostrConnect {
224
224
}
225
225
226
226
#[ inline]
227
- async fn send_request ( & self , req : Request ) -> Result < ResponseResult , Error > {
227
+ async fn send_request ( & self , req : NostrConnectRequest ) -> Result < ResponseResult , Error > {
228
228
// Get remote signer public key
229
229
let remote_signer_public_key: PublicKey = * self . remote_signer_public_key ( ) . await ?;
230
230
@@ -235,13 +235,13 @@ impl NostrConnect {
235
235
236
236
async fn send_request_with_pk (
237
237
& self ,
238
- req : Request ,
238
+ req : NostrConnectRequest ,
239
239
remote_signer_public_key : PublicKey ,
240
240
) -> Result < ResponseResult , Error > {
241
241
let secret_key: & SecretKey = self . app_keys . secret_key ( ) ;
242
242
243
243
// Convert request to event
244
- let msg = Message :: request ( req) ;
244
+ let msg = NostrConnectMessage :: request ( & req) ;
245
245
tracing:: debug!( "Sending '{msg}' NIP46 message" ) ;
246
246
247
247
let req_id = msg. id ( ) . to_string ( ) ;
@@ -260,40 +260,40 @@ impl NostrConnect {
260
260
if event. kind == Kind :: NostrConnect {
261
261
let msg: String =
262
262
nip44:: decrypt ( secret_key, & event. pubkey , event. content . as_str ( ) ) ?;
263
- let msg: Message = Message :: from_json ( msg) ?;
263
+ let msg: NostrConnectMessage = NostrConnectMessage :: from_json ( msg) ?;
264
264
265
265
tracing:: debug!( "Received NIP46 message: '{msg}'" ) ;
266
266
267
- if let Message :: Response { id, result, error } = & msg {
268
- if & req_id == id {
269
- if msg. is_auth_url ( ) {
270
- if let ( Some ( auth_url) , Some ( handler) ) =
271
- ( error, & self . auth_url_handler )
272
- {
273
- match Url :: parse ( auth_url) {
274
- Ok ( url) => {
275
- if let Err ( e) = handler. on_auth_url ( url) . await {
276
- tracing:: error!(
277
- "Impossible to handle `auth_url`: {e}"
278
- ) ;
279
- }
280
- }
281
- Err ( e) => {
282
- tracing:: error!( "Can't parse `auth_url`: {e}" )
267
+ if req_id == msg. id ( ) && msg. is_response ( ) {
268
+ let response: NostrConnectResponse = msg. to_response ( req. method ( ) ) ?;
269
+
270
+ if response. is_auth_url ( ) {
271
+ if let ( Some ( auth_url) , Some ( handler) ) =
272
+ ( response. error , & self . auth_url_handler )
273
+ {
274
+ match Url :: parse ( & auth_url) {
275
+ Ok ( url) => {
276
+ if let Err ( e) = handler. on_auth_url ( url) . await {
277
+ tracing:: error!(
278
+ "Impossible to handle `auth_url`: {e}"
279
+ ) ;
283
280
}
284
281
}
282
+ Err ( e) => {
283
+ tracing:: error!( "Can't parse `auth_url`: {e}" )
284
+ }
285
285
}
286
- } else {
287
- if let Some ( result) = result {
288
- return Ok ( result. clone ( ) ) ;
289
- }
290
-
291
- if let Some ( error) = error {
292
- return Err ( Error :: Response ( error. to_owned ( ) ) ) ;
293
- }
286
+ }
287
+ } else {
288
+ if let Some ( error) = response. error {
289
+ return Err ( Error :: Response ( error) ) ;
290
+ }
294
291
295
- break ;
292
+ if let Some ( result) = response. result {
293
+ return Ok ( result) ;
296
294
}
295
+
296
+ break ;
297
297
}
298
298
}
299
299
}
@@ -308,35 +308,35 @@ impl NostrConnect {
308
308
309
309
/// Connect msg
310
310
async fn connect ( & self , remote_signer_public_key : PublicKey ) -> Result < ( ) , Error > {
311
- let req = Request :: Connect {
311
+ let req = NostrConnectRequest :: Connect {
312
312
public_key : remote_signer_public_key,
313
313
secret : self . secret . clone ( ) ,
314
314
} ;
315
315
let res = self
316
316
. send_request_with_pk ( req, remote_signer_public_key)
317
317
. await ?;
318
- Ok ( res. to_connect ( ) ?)
318
+ Ok ( res. to_ack ( ) ?)
319
319
}
320
320
321
321
/// Sign an [UnsignedEvent]
322
322
pub async fn get_relays ( & self ) -> Result < HashMap < RelayUrl , RelayPermissions > , Error > {
323
- let req = Request :: GetRelays ;
323
+ let req = NostrConnectRequest :: GetRelays ;
324
324
let res = self . send_request ( req) . await ?;
325
325
Ok ( res. to_get_relays ( ) ?)
326
326
}
327
327
328
328
async fn _get_public_key ( & self ) -> Result < & PublicKey , Error > {
329
329
self . user_public_key
330
330
. get_or_try_init ( || async {
331
- let res = self . send_request ( Request :: GetPublicKey ) . await ?;
331
+ let res = self . send_request ( NostrConnectRequest :: GetPublicKey ) . await ?;
332
332
Ok ( res. to_get_public_key ( ) ?)
333
333
} )
334
334
. await
335
335
}
336
336
337
337
/// Sign an [UnsignedEvent]
338
338
async fn _sign_event ( & self , unsigned : UnsignedEvent ) -> Result < Event , Error > {
339
- let req = Request :: SignEvent ( unsigned) ;
339
+ let req = NostrConnectRequest :: SignEvent ( unsigned) ;
340
340
let res = self . send_request ( req) . await ?;
341
341
Ok ( res. to_sign_event ( ) ?)
342
342
}
@@ -346,51 +346,51 @@ impl NostrConnect {
346
346
public_key : PublicKey ,
347
347
content : String ,
348
348
) -> Result < String , Error > {
349
- let req = Request :: Nip04Encrypt {
349
+ let req = NostrConnectRequest :: Nip04Encrypt {
350
350
public_key,
351
351
text : content,
352
352
} ;
353
353
let res = self . send_request ( req) . await ?;
354
- Ok ( res. to_encrypt_decrypt ( ) ?)
354
+ Ok ( res. to_nip04_encrypt ( ) ?)
355
355
}
356
356
357
357
async fn _nip04_decrypt (
358
358
& self ,
359
359
public_key : PublicKey ,
360
360
ciphertext : String ,
361
361
) -> Result < String , Error > {
362
- let req = Request :: Nip04Decrypt {
362
+ let req = NostrConnectRequest :: Nip04Decrypt {
363
363
public_key,
364
364
ciphertext,
365
365
} ;
366
366
let res = self . send_request ( req) . await ?;
367
- Ok ( res. to_encrypt_decrypt ( ) ?)
367
+ Ok ( res. to_nip04_decrypt ( ) ?)
368
368
}
369
369
370
370
async fn _nip44_encrypt (
371
371
& self ,
372
372
public_key : PublicKey ,
373
373
content : String ,
374
374
) -> Result < String , Error > {
375
- let req = Request :: Nip44Encrypt {
375
+ let req = NostrConnectRequest :: Nip44Encrypt {
376
376
public_key,
377
377
text : content,
378
378
} ;
379
379
let res = self . send_request ( req) . await ?;
380
- Ok ( res. to_encrypt_decrypt ( ) ?)
380
+ Ok ( res. to_nip44_encrypt ( ) ?)
381
381
}
382
382
383
383
async fn _nip44_decrypt (
384
384
& self ,
385
385
public_key : PublicKey ,
386
386
payload : String ,
387
387
) -> Result < String , Error > {
388
- let req = Request :: Nip44Decrypt {
388
+ let req = NostrConnectRequest :: Nip44Decrypt {
389
389
public_key,
390
390
ciphertext : payload,
391
391
} ;
392
392
let res = self . send_request ( req) . await ?;
393
- Ok ( res. to_encrypt_decrypt ( ) ?)
393
+ Ok ( res. to_nip44_decrypt ( ) ?)
394
394
}
395
395
396
396
/// Completely shutdown
@@ -423,25 +423,29 @@ async fn get_remote_signer_public_key(
423
423
tracing:: debug!( "Received Nostr Connect message: '{msg}'" ) ;
424
424
425
425
// Parse message
426
- let msg: Message = Message :: from_json ( msg) ?;
426
+ let msg: NostrConnectMessage = NostrConnectMessage :: from_json ( msg) ?;
427
427
428
428
// Match message
429
- match msg {
430
- Message :: Request {
431
- req : Request :: Connect { public_key, .. } ,
432
- ..
433
- } => {
434
- return Ok ( GetRemoteSignerPublicKey :: WithUserPublicKey {
435
- remote : event. pubkey ,
436
- user : public_key,
437
- } ) ;
429
+ match & msg {
430
+ NostrConnectMessage :: Request { .. } => {
431
+ if let Ok ( NostrConnectRequest :: Connect { public_key, .. } ) =
432
+ msg. to_request ( )
433
+ {
434
+ return Ok ( GetRemoteSignerPublicKey :: WithUserPublicKey {
435
+ remote : event. pubkey ,
436
+ user : public_key,
437
+ } ) ;
438
+ }
439
+ }
440
+ NostrConnectMessage :: Response { .. } => {
441
+ if let Ok ( NostrConnectResponse {
442
+ result : Some ( ResponseResult :: Ack ) ,
443
+ error : None ,
444
+ } ) = msg. to_response ( NostrConnectMethod :: Connect )
445
+ {
446
+ return Ok ( GetRemoteSignerPublicKey :: RemoteOnly ( event. pubkey ) ) ;
447
+ }
438
448
}
439
- Message :: Response {
440
- result : Some ( ResponseResult :: Connect ) ,
441
- error : None ,
442
- ..
443
- } => return Ok ( GetRemoteSignerPublicKey :: RemoteOnly ( event. pubkey ) ) ,
444
- _ => { }
445
449
}
446
450
}
447
451
}
0 commit comments