@@ -43,33 +43,47 @@ export class Client extends NostrNode<RelayToClientMessage> {
43
43
enqueueRequest = controller . enqueue . bind ( controller ) ;
44
44
} ,
45
45
} ) ;
46
- this . ws . addEventListener ( "message" , ( ev : MessageEvent < string > ) => {
46
+ const writer = this . getWriter ( ) ;
47
+ this . ws . addEventListener ( "message" , async ( ev : MessageEvent < string > ) => {
47
48
// TODO: Validate the type of the message.
48
49
const msg = JSON . parse ( ev . data ) as ClientToRelayMessage ;
50
+
49
51
// TODO: Apply backpressure when a queue is full.
52
+
50
53
const kind = msg [ 0 ] ;
51
54
if ( kind === "EVENT" ) {
52
- return enqueueEvent ( msg [ 1 ] ) ;
55
+ const event = msg [ 1 ] ;
56
+
57
+ // TODO: Validate the event and send OkMessage<false> if necessary.
58
+
59
+ await writer . ready ;
60
+ writer . write ( [ "OK" , event . id , true , "" ] ) ;
61
+ return enqueueEvent ( event ) ;
53
62
}
54
- const id = msg [ 1 ] ;
63
+ const sid = msg [ 1 ] ;
55
64
if ( kind === "CLOSE" ) {
56
- const sub = this . subscriptions . get ( id ) ;
65
+ const sub = this . subscriptions . get ( sid ) ;
57
66
if ( ! sub ) {
67
+ this . config . logger ?. warn ?.( "Unknown subscription:" , sid ) ;
58
68
return ;
59
69
}
60
- this . subscriptions . delete ( id ) ;
70
+ this . subscriptions . delete ( sid ) ;
61
71
return sub . close ( ) ;
62
72
}
63
- // kind === "REQ"
64
- const filter = msg [ 2 ] ;
65
- const writer = this . getWriter ( ) ;
66
- const writable = new WritableStream < NostrEvent > ( {
67
- write : ( event ) => {
68
- return writer . write ( [ "EVENT" , id , event ] ) ;
69
- } ,
70
- } ) ;
71
- this . subscriptions . set ( id , writable ) ;
72
- return enqueueRequest ( [ id , filter ] ) ;
73
+ if ( kind === "REQ" ) {
74
+ const filter = msg [ 2 ] ;
75
+ this . subscriptions . set (
76
+ sid ,
77
+ new WritableStream < NostrEvent > ( {
78
+ write : async ( event ) => {
79
+ await writer . ready ;
80
+ return writer . write ( [ "EVENT" , sid , event ] ) ;
81
+ } ,
82
+ } ) ,
83
+ ) ;
84
+ return enqueueRequest ( [ sid , filter ] ) ;
85
+ }
86
+ this . config . logger ?. warn ?.( "Unknown message kind:" , kind ) ;
73
87
} ) ;
74
88
}
75
89
0 commit comments