1
1
import type {
2
2
ClientToRelayMessage ,
3
- ClientToRelayMessageType ,
4
3
NostrEvent ,
5
4
RelayToClientMessage ,
6
- SubscriptionFilter ,
7
5
SubscriptionId ,
8
6
} from "./protocol.d.ts" ;
9
7
import {
@@ -12,21 +10,35 @@ import {
12
10
NostrNodeEvent ,
13
11
NostrNodeModule ,
14
12
} from "./nodes.ts" ;
15
- import { NIPs } from "./nips.ts" ;
13
+ import { importNips } from "./nips.ts" ;
16
14
17
15
// ----------------------
18
16
// NIPs
19
17
// ----------------------
20
18
21
- const nips = await NIPs . import < ClientModule > ( import . meta. url , "../nips" ) ;
19
+ const NIPs = await importNips <
20
+ RelayToClientMessage ,
21
+ ClientEventTypeRecord ,
22
+ Client
23
+ > ( import . meta. url , "../nips" ) ;
24
+
25
+ // ----------------------
26
+ // Interfaces
27
+ // ----------------------
28
+
29
+ export type ClientConfig = NostrNodeConfig <
30
+ RelayToClientMessage ,
31
+ ClientEventTypeRecord
32
+ > ;
33
+
34
+ export type ClientOptions = Partial < ClientConfig > ;
22
35
23
36
/**
24
37
* A class that represents a remote Nostr client.
25
38
*/
26
39
export class Client extends NostrNode <
27
40
RelayToClientMessage ,
28
- EventDataTypeRecord ,
29
- ClientFunctionParameterTypeRecord
41
+ ClientEventTypeRecord
30
42
> {
31
43
declare ws : WebSocket ;
32
44
@@ -41,77 +53,36 @@ export class Client extends NostrNode<
41
53
constructor ( ws : WebSocket , opts ?: ClientOptions ) {
42
54
super ( ws , {
43
55
...opts ,
44
- modules : nips . concat ( opts ?. modules ?? [ ] ) ,
56
+ modules : NIPs . concat ( opts ?. modules ?? [ ] ) ,
45
57
} ) ;
46
58
this . ws . addEventListener ( "message" , ( ev : MessageEvent < string > ) => {
47
- // TODO: Validate the type of the message.
48
59
const message = JSON . parse ( ev . data ) as ClientToRelayMessage ;
49
- this . callFunction ( "handleClientToRelayMessage" , {
50
- message,
51
- client : this ,
52
- } ) ;
60
+ // TODO: Validate the message.
61
+ this . dispatchEvent ( new ClientEvent ( "message" , message ) ) ;
53
62
} ) ;
54
63
}
55
64
}
56
65
57
- type ClientConfig = NostrNodeConfig < ClientFunctionParameterTypeRecord > ;
58
- export type ClientOptions = Partial < ClientConfig > ;
59
-
60
66
// ------------------------------
61
- // Functions
67
+ // Events
62
68
// ------------------------------
63
69
64
- export type ClientModule = NostrNodeModule < ClientFunctionParameterTypeRecord > ;
65
-
66
- type ClientFunctionParameterTypeRecord = {
67
- [ K in keyof _FunctionParameterTypeRecord ] :
68
- & _FunctionParameterTypeRecord [ K ]
69
- & ClientFunctionContext ;
70
- } ;
71
-
72
- type _FunctionParameterTypeRecord = {
73
- "handleClientToRelayMessage" : {
74
- message : ClientToRelayMessage ;
75
- } ;
76
- "handleSubscriptionMessage" : {
77
- message : SubscriptionMessage ;
78
- controller : ReadableStreamDefaultController < NostrEvent > ;
79
- } & SubscriptionContext ;
80
- "acceptEvent" : {
81
- event : NostrEvent ;
82
- } ;
83
- } ;
84
-
85
- interface ClientFunctionContext {
86
- client : Client ;
70
+ export interface ClientEventTypeRecord {
71
+ "message" : ClientToRelayMessage ;
87
72
}
88
73
89
- interface SubscriptionContext {
90
- id : SubscriptionId ;
91
- filters : SubscriptionFilter [ ] ;
92
- }
74
+ export type ClientEventType = keyof ClientEventTypeRecord ;
75
+
76
+ export class ClientEvent <
77
+ T extends ClientEventType = ClientEventType ,
78
+ > extends NostrNodeEvent < ClientEventTypeRecord , T > { }
93
79
94
80
// ------------------------------
95
- // Events
81
+ // Modules
96
82
// ------------------------------
97
83
98
- type EventDataTypeRecord = {
99
- [ T in SubscriptionId ] : SubscriptionMessage ;
100
- } ;
101
-
102
- type SubscriptionMessage = {
103
- [ T in ClientToRelayMessageType ] : ClientToRelayMessage < T > [ 1 ] extends
104
- SubscriptionId ? ClientToRelayMessage < T > : never ;
105
- } [ ClientToRelayMessageType ] ;
106
-
107
- export class ClientSubscriptionEvent extends NostrNodeEvent <
108
- EventDataTypeRecord ,
109
- SubscriptionId
110
- > {
111
- constructor (
112
- type : SubscriptionId ,
113
- init : MessageEventInit < SubscriptionMessage > ,
114
- ) {
115
- super ( type , init ) ;
116
- }
117
- }
84
+ export type ClientModule = NostrNodeModule <
85
+ RelayToClientMessage ,
86
+ ClientEventTypeRecord ,
87
+ Client
88
+ > ;
0 commit comments