1
- import type { NostrMessage } from "./protocol.ts" ;
2
- import { WebSocketLike } from "./websockets.ts" ;
3
-
4
- export interface NostrNodeConfig <
5
- W extends NostrMessage = NostrMessage ,
6
- R extends EventTypeRecord = EventTypeRecord ,
7
- > {
8
- modules : NostrNodeModule < W , R > [ ] ;
1
+ import type { WebSocketLike } from "@lophus/lib/websockets" ;
2
+ import type { InterNodeMessage } from "./protocol.ts" ;
3
+
4
+ export interface NodeConfig {
9
5
nbuffer : number ;
10
6
}
11
7
12
- export type NostrNodeOptions <
13
- W extends NostrMessage = NostrMessage ,
14
- R extends EventTypeRecord = EventTypeRecord ,
15
- > = Partial < NostrNodeConfig < W , R > > ;
16
-
17
- /**
18
- * Common interface for relays and clients, which extends `EventTarget`.
19
- */
20
- export interface NostrNode <
21
- W extends NostrMessage = NostrMessage ,
22
- R extends EventTypeRecord = EventTypeRecord ,
23
- > {
24
- readonly config : Readonly < NostrNodeConfig < W , R > > ;
25
- readonly ws : WebSocketLike ;
26
- readonly writable : WritableStream < W > ;
27
-
28
- status : WebSocketLike [ "readyState" ] ;
29
- send ( msg : W ) : void | Promise < void > ;
30
- close ( ) : Promise < void > ;
31
-
32
- install ( mod : NostrNodeModule < W , R > ) : void ;
33
-
34
- addEventListener < T extends EventType < R > > (
35
- type : T ,
36
- listener :
37
- | NostrNodeEventListenerOrEventListenerObject < W , R , T >
38
- | null ,
39
- options ?: AddEventListenerOptions ,
40
- ) : void ;
41
-
42
- removeEventListener < T extends EventType < R > > (
43
- type : T ,
44
- listener :
45
- | NostrNodeEventListenerOrEventListenerObject < W , R , T >
46
- | null ,
47
- options ?: boolean | EventListenerOptions ,
48
- ) : void ;
49
-
50
- dispatchEvent < T extends EventType < R > > ( event : NostrNodeEvent < R , T > ) : boolean ;
51
-
52
- /**
53
- * A convenience method to dispatch a `NostrNodeEvent` with the given `type`
54
- * and `data`.
55
- */
56
- dispatch < T extends EventType < R > > ( type : T , data : R [ T ] ) : void ;
57
-
58
- /**
59
- * A convenience method to add an event listener for the given `type` that
60
- * calls the given `listener` when the event is dispatched.
61
- */
62
- on < T extends EventType < R > > (
63
- type : T ,
64
- // deno-lint-ignore no-explicit-any
65
- listener : ( data : R [ T ] ) => any ,
66
- ) : void ;
67
- }
8
+ export type NodeOptions = Partial < NodeConfig > ;
68
9
69
10
/**
70
11
* Common base class for relays and clients.
71
12
*/
72
- export class NostrNodeBase <
73
- W extends NostrMessage = NostrMessage ,
74
- R extends EventTypeRecord = EventTypeRecord ,
75
- > extends EventTarget implements NostrNode < W , R > {
76
- readonly writable : WritableStream < W > ;
77
- readonly config : Readonly < NostrNodeConfig < W , R > > ;
13
+ export class Node <
14
+ M extends InterNodeMessage = InterNodeMessage ,
15
+ R = AnyEventTypeRecord ,
16
+ > extends EventTarget {
17
+ readonly writable : WritableStream < M > ;
18
+ readonly config : Readonly < NodeConfig > ;
78
19
79
20
constructor (
80
21
readonly ws : WebSocketLike ,
81
- opts : NostrNodeOptions = { } ,
22
+ options : NodeOptions = { } ,
82
23
) {
83
24
super ( ) ;
84
25
this . writable = new WritableStream ( {
85
26
write : ( msg ) => this . ws . send ( JSON . stringify ( msg ) ) ,
86
27
close : ( ) => this . ws . close ( ) ,
87
28
} ) ;
88
- this . config = { modules : [ ] , nbuffer : 10 , ...opts } ;
89
- this . config . modules . forEach ( ( m ) => this . install ( m ) ) ;
29
+ this . config = { nbuffer : 10 , ...options } ;
90
30
}
91
31
92
- send ( msg : W ) : void | Promise < void > {
32
+ send ( msg : M ) : void | Promise < void > {
93
33
return this . ws . send ( JSON . stringify ( msg ) ) ;
94
34
}
95
35
@@ -107,19 +47,31 @@ export class NostrNodeBase<
107
47
}
108
48
}
109
49
110
- install ( mod : NostrNodeModule < W , R > ) : void {
111
- mod . install ( this ) ;
112
- }
50
+ declare addEventListener : < T extends EventType < R > > (
51
+ type : T ,
52
+ listener :
53
+ | NodeEventListenerOrEventListenerObject < M , R , T >
54
+ | null ,
55
+ options ?: AddEventListenerOptions ,
56
+ ) => void ;
57
+
58
+ declare removeEventListener : < T extends EventType < R > > (
59
+ type : T ,
60
+ listener :
61
+ | NodeEventListenerOrEventListenerObject < M , R , T >
62
+ | null ,
63
+ options ?: boolean | EventListenerOptions ,
64
+ ) => void ;
113
65
114
- declare addEventListener : NostrNode < W , R > [ "addEventListener" ] ;
115
- declare removeEventListener : NostrNode < W , R > [ "removeEventListener" ] ;
116
- declare dispatchEvent : NostrNode < W , R > [ "dispatchEvent" ] ;
66
+ declare dispatchEvent : < T extends EventType < R > > (
67
+ event : NodeEvent < R , T > ,
68
+ ) => boolean ;
117
69
118
70
dispatch < T extends EventType < R > > (
119
71
type : T ,
120
72
data : R [ T ] ,
121
73
) {
122
- this . dispatchEvent ( new NostrNodeEvent < R , T > ( type , data ) ) ;
74
+ this . dispatchEvent ( new NodeEvent < R , T > ( type , data ) ) ;
123
75
}
124
76
125
77
on < T extends EventType < R > > (
@@ -131,56 +83,45 @@ export class NostrNodeBase<
131
83
}
132
84
}
133
85
134
- // ------------------------------
135
- // Extensions
136
- // ------------------------------
137
-
138
- export interface NostrNodeModule <
139
- W extends NostrMessage = NostrMessage ,
140
- R extends EventTypeRecord = EventTypeRecord ,
141
- N extends NostrNode < W , R > = NostrNode < W , R > ,
142
- > {
143
- // deno-lint-ignore no-explicit-any
144
- install ( node : N ) : any ;
145
- }
146
-
147
86
// ------------------------------
148
87
// Events
149
88
// ------------------------------
150
89
151
- // deno-lint-ignore no-empty-interface
152
- export interface EventTypeRecord { }
90
+ // deno-lint-ignore no-explicit-any
91
+ type AnyEventTypeRecord = any ;
153
92
154
- type EventType < R extends EventTypeRecord > = keyof R & string ;
93
+ type EventType < R = AnyEventTypeRecord > = keyof R & string ;
155
94
156
- export class NostrNodeEvent <
157
- R extends EventTypeRecord ,
158
- T extends EventType < R > ,
95
+ export class NodeEvent <
96
+ R = AnyEventTypeRecord ,
97
+ T extends EventType < R > = EventType < R > ,
159
98
> extends MessageEvent < R [ T ] > {
160
99
declare type : T ;
161
100
constructor ( type : T , data : R [ T ] ) {
162
101
super ( type , { data } ) ;
163
102
}
164
103
}
165
104
166
- type NostrNodeEventListenerOrEventListenerObject <
167
- W extends NostrMessage ,
168
- R extends EventTypeRecord ,
169
- T extends EventType < R > ,
170
- > = NostrNodeEventListener < W , R , T > | NostrNodeEventListenerObject < W , R , T > ;
171
-
172
- type NostrNodeEventListener <
173
- W extends NostrMessage ,
174
- R extends EventTypeRecord ,
175
- T extends EventType < R > ,
105
+ type NodeEventListenerOrEventListenerObject <
106
+ M extends InterNodeMessage ,
107
+ R = AnyEventTypeRecord ,
108
+ T extends EventType < R > = EventType < R > ,
109
+ > =
110
+ | NodeEventListener < M , R , T >
111
+ | NodeEventListenerObject < M , R , T > ;
112
+
113
+ type NodeEventListener <
114
+ W extends InterNodeMessage ,
115
+ R = AnyEventTypeRecord ,
116
+ T extends EventType < R > = EventType < R > ,
176
117
> // deno-lint-ignore no-explicit-any
177
- = ( this : NostrNode < W , R > , ev : MessageEvent < R [ T ] > ) => any ;
118
+ = ( this : Node < W , R > , ev : MessageEvent < R [ T ] > ) => any ;
178
119
179
- type NostrNodeEventListenerObject <
180
- W extends NostrMessage ,
181
- R extends EventTypeRecord ,
182
- T extends EventType < R > ,
120
+ type NodeEventListenerObject <
121
+ W extends InterNodeMessage ,
122
+ R = AnyEventTypeRecord ,
123
+ T extends EventType < R > = EventType < R > ,
183
124
> = {
184
125
// deno-lint-ignore no-explicit-any
185
- handleEvent ( this : NostrNode < W , R > , ev : MessageEvent < R [ T ] > ) : any ;
126
+ handleEvent ( this : Node < W , R > , ev : MessageEvent < R [ T ] > ) : any ;
186
127
} ;
0 commit comments