@nostrify/nostrify 0.46.7 → 0.46.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/.turbo/turbo-build.log +28 -5
  2. package/.turbo/turbo-setup.log +13 -0
  3. package/.turbo/turbo-test.log +123 -0
  4. package/BunkerURI.test.ts +19 -14
  5. package/CHANGELOG.md +8 -0
  6. package/NBrowserSigner.test.ts +49 -34
  7. package/NCache.test.ts +14 -7
  8. package/NCache.ts +2 -2
  9. package/NConnectSigner.test.ts +48 -31
  10. package/NConnectSigner.ts +3 -3
  11. package/NIP05.test.ts +36 -44
  12. package/NIP05.ts +2 -2
  13. package/NIP50.test.ts +35 -34
  14. package/NIP98.test.ts +89 -76
  15. package/NIP98.ts +2 -2
  16. package/NKinds.test.ts +37 -36
  17. package/NPool.test.ts +35 -24
  18. package/NPool.ts +42 -23
  19. package/NRelay1.test.ts +100 -68
  20. package/NRelay1.ts +13 -6
  21. package/NSchema.test.ts +98 -56
  22. package/NSchema.ts +10 -14
  23. package/NSecSigner.test.ts +19 -10
  24. package/NSecSigner.ts +4 -3
  25. package/NSet.test.ts +123 -50
  26. package/NSet.ts +13 -6
  27. package/RelayError.test.ts +11 -10
  28. package/RelayError.ts +1 -1
  29. package/dist/BunkerURI.js +44 -44
  30. package/dist/NBrowserSigner.js +73 -83
  31. package/dist/NCache.d.ts +2 -2
  32. package/dist/NCache.d.ts.map +1 -1
  33. package/dist/NCache.js +35 -56
  34. package/dist/NConnectSigner.d.ts +1 -1
  35. package/dist/NConnectSigner.d.ts.map +1 -1
  36. package/dist/NConnectSigner.js +124 -117
  37. package/dist/NIP05.d.ts +1 -1
  38. package/dist/NIP05.d.ts.map +1 -1
  39. package/dist/NIP05.js +33 -33
  40. package/dist/NIP50.js +19 -20
  41. package/dist/NIP98.d.ts +1 -1
  42. package/dist/NIP98.d.ts.map +1 -1
  43. package/dist/NIP98.js +71 -64
  44. package/dist/NKinds.js +24 -22
  45. package/dist/NPool.d.ts +2 -2
  46. package/dist/NPool.d.ts.map +1 -1
  47. package/dist/NPool.js +143 -170
  48. package/dist/NRelay1.d.ts +5 -4
  49. package/dist/NRelay1.d.ts.map +1 -1
  50. package/dist/NRelay1.js +301 -315
  51. package/dist/NSchema.d.ts +1 -1
  52. package/dist/NSchema.d.ts.map +1 -1
  53. package/dist/NSchema.js +185 -208
  54. package/dist/NSecSigner.d.ts +1 -2
  55. package/dist/NSecSigner.d.ts.map +1 -1
  56. package/dist/NSecSigner.js +35 -46
  57. package/dist/NSet.d.ts +1 -1
  58. package/dist/NSet.d.ts.map +1 -1
  59. package/dist/NSet.js +138 -166
  60. package/dist/RelayError.d.ts +1 -1
  61. package/dist/RelayError.d.ts.map +1 -1
  62. package/dist/RelayError.js +18 -17
  63. package/dist/ln/LNURL.d.ts +4 -4
  64. package/dist/ln/LNURL.d.ts.map +1 -1
  65. package/dist/ln/LNURL.js +93 -93
  66. package/dist/ln/mod.d.ts +3 -3
  67. package/dist/ln/mod.js +4 -2
  68. package/dist/ln/mod.js.map +7 -1
  69. package/dist/ln/types/LNURLCallback.js +0 -2
  70. package/dist/ln/types/LNURLDetails.js +0 -2
  71. package/dist/mod.d.ts +14 -14
  72. package/dist/mod.js +30 -15
  73. package/dist/mod.js.map +7 -1
  74. package/dist/test/ErrorRelay.d.ts +1 -1
  75. package/dist/test/ErrorRelay.d.ts.map +1 -1
  76. package/dist/test/ErrorRelay.js +22 -21
  77. package/dist/test/MockRelay.d.ts +3 -3
  78. package/dist/test/MockRelay.d.ts.map +1 -1
  79. package/dist/test/MockRelay.js +56 -57
  80. package/dist/test/TestRelayServer.d.ts +6 -3
  81. package/dist/test/TestRelayServer.d.ts.map +1 -1
  82. package/dist/test/TestRelayServer.js +141 -122
  83. package/dist/test/mod.d.ts +3 -3
  84. package/dist/test/mod.d.ts.map +1 -1
  85. package/dist/test/mod.js +22 -19
  86. package/dist/test/mod.js.map +7 -1
  87. package/dist/tsconfig.tsbuildinfo +1 -1
  88. package/dist/uploaders/BlossomUploader.d.ts +1 -1
  89. package/dist/uploaders/BlossomUploader.d.ts.map +1 -1
  90. package/dist/uploaders/BlossomUploader.js +69 -66
  91. package/dist/uploaders/NostrBuildUploader.d.ts +1 -2
  92. package/dist/uploaders/NostrBuildUploader.d.ts.map +1 -1
  93. package/dist/uploaders/NostrBuildUploader.js +61 -59
  94. package/dist/uploaders/mod.d.ts +2 -2
  95. package/dist/uploaders/mod.js +6 -3
  96. package/dist/uploaders/mod.js.map +7 -1
  97. package/dist/utils/CircularSet.d.ts +1 -1
  98. package/dist/utils/CircularSet.d.ts.map +1 -1
  99. package/dist/utils/CircularSet.js +26 -28
  100. package/dist/utils/Machina.js +35 -59
  101. package/dist/utils/N64.d.ts +1 -1
  102. package/dist/utils/N64.d.ts.map +1 -1
  103. package/dist/utils/N64.js +16 -18
  104. package/dist/utils/mod.d.ts +2 -2
  105. package/dist/utils/mod.js +6 -3
  106. package/dist/utils/mod.js.map +7 -1
  107. package/ln/LNURL.test.ts +70 -52
  108. package/ln/LNURL.ts +15 -15
  109. package/ln/mod.ts +3 -3
  110. package/mod.ts +14 -14
  111. package/package.json +5 -3
  112. package/test/ErrorRelay.test.ts +11 -10
  113. package/test/ErrorRelay.ts +17 -5
  114. package/test/MockRelay.test.ts +15 -8
  115. package/test/MockRelay.ts +3 -3
  116. package/test/TestRelayServer.ts +46 -17
  117. package/test/mod.ts +4 -4
  118. package/tsconfig.json +5 -2
  119. package/uploaders/BlossomUploader.test.ts +39 -22
  120. package/uploaders/BlossomUploader.ts +2 -2
  121. package/uploaders/NostrBuildUploader.test.ts +36 -18
  122. package/uploaders/NostrBuildUploader.ts +4 -4
  123. package/uploaders/mod.ts +2 -2
  124. package/utils/CircularSet.test.ts +5 -4
  125. package/utils/CircularSet.ts +3 -1
  126. package/utils/Machina.test.ts +30 -19
  127. package/utils/N64.test.ts +12 -11
  128. package/utils/N64.ts +2 -2
  129. package/utils/mod.ts +2 -2
  130. package/dist/BunkerURI.js.map +0 -1
  131. package/dist/NBrowserSigner.js.map +0 -1
  132. package/dist/NCache.js.map +0 -1
  133. package/dist/NConnectSigner.js.map +0 -1
  134. package/dist/NIP05.js.map +0 -1
  135. package/dist/NIP50.js.map +0 -1
  136. package/dist/NIP98.js.map +0 -1
  137. package/dist/NKinds.js.map +0 -1
  138. package/dist/NPool.js.map +0 -1
  139. package/dist/NRelay1.js.map +0 -1
  140. package/dist/NSchema.js.map +0 -1
  141. package/dist/NSecSigner.js.map +0 -1
  142. package/dist/NSet.js.map +0 -1
  143. package/dist/RelayError.js.map +0 -1
  144. package/dist/ln/LNURL.js.map +0 -1
  145. package/dist/ln/types/LNURLCallback.js.map +0 -1
  146. package/dist/ln/types/LNURLDetails.js.map +0 -1
  147. package/dist/test/ErrorRelay.js.map +0 -1
  148. package/dist/test/MockRelay.js.map +0 -1
  149. package/dist/test/TestRelayServer.js.map +0 -1
  150. package/dist/uploaders/BlossomUploader.js.map +0 -1
  151. package/dist/uploaders/NostrBuildUploader.js.map +0 -1
  152. package/dist/utils/CircularSet.js.map +0 -1
  153. package/dist/utils/Machina.js.map +0 -1
  154. package/dist/utils/N64.js.map +0 -1
package/dist/NRelay1.js CHANGED
@@ -1,332 +1,318 @@
1
- import { getFilterLimit, matchFilters, verifyEvent as _verifyEvent } from 'nostr-tools';
2
- import { ArrayQueue, ExponentialBackoff, WebsocketBuilder, WebsocketEvent } from 'websocket-ts';
3
- import { Machina } from './utils/Machina.js';
4
- import { NSchema as n } from './NSchema.js';
5
- import { NSet } from './NSet.js';
6
- /** Single relay connection over WebSocket. */
7
- export class NRelay1 {
8
- url;
9
- opts;
10
- socket;
11
- subs = new Map();
12
- closedByUser = false;
13
- idleTimer;
14
- controller = new AbortController();
15
- ee = new EventTarget();
16
- get subscriptions() {
17
- return [...this.subs.values()];
18
- }
19
- log(log) {
20
- this.opts.log?.({ ...log, url: this.url });
1
+ import { getFilterLimit, matchFilters, verifyEvent as _verifyEvent } from "nostr-tools";
2
+ import { ArrayQueue, ExponentialBackoff, WebsocketBuilder, WebsocketEvent } from "websocket-ts";
3
+ import { Machina } from "./utils/Machina.js";
4
+ import { NSchema as n } from "./NSchema.js";
5
+ import { NSet } from "./NSet.js";
6
+ class NRelay1 {
7
+ socket;
8
+ subs = /* @__PURE__ */ new Map();
9
+ closedByUser = false;
10
+ idleTimer;
11
+ controller = new AbortController();
12
+ url;
13
+ opts;
14
+ ee = new EventTarget();
15
+ get subscriptions() {
16
+ return [...this.subs.values()];
17
+ }
18
+ log(log) {
19
+ this.opts.log?.({ ...log, url: this.url });
20
+ }
21
+ constructor(url, opts = {}) {
22
+ this.url = url;
23
+ this.opts = opts;
24
+ this.socket = this.createSocket();
25
+ this.maybeStartIdleTimer();
26
+ }
27
+ /** Create (and open) a WebSocket connection with automatic reconnect. */
28
+ createSocket() {
29
+ const { backoff = new ExponentialBackoff(1e3) } = this.opts;
30
+ return new WebsocketBuilder(this.url).withBuffer(new ArrayQueue()).withBackoff(backoff === false ? void 0 : backoff).onOpen((socket) => {
31
+ this.log({
32
+ level: "debug",
33
+ ns: "relay.ws.state",
34
+ state: "open",
35
+ readyState: socket.readyState
36
+ });
37
+ for (const req of this.subs.values()) {
38
+ this.send(req);
39
+ }
40
+ }).onClose((socket) => {
41
+ this.log({
42
+ level: "debug",
43
+ ns: "relay.ws.state",
44
+ state: "close",
45
+ readyState: socket.readyState
46
+ });
47
+ if (!this.subs.size) {
48
+ this.socket.close();
49
+ }
50
+ }).onReconnect((socket) => {
51
+ this.log({
52
+ level: "debug",
53
+ ns: "relay.ws.state",
54
+ state: "reconnect",
55
+ readyState: socket.readyState
56
+ });
57
+ }).onRetry((socket, e) => {
58
+ this.log({
59
+ level: "warn",
60
+ ns: "relay.ws.retry",
61
+ readyState: socket.readyState,
62
+ backoff: e.detail.backoff
63
+ });
64
+ }).onError((socket) => {
65
+ this.log({
66
+ level: "error",
67
+ ns: "relay.ws.error",
68
+ readyState: socket.readyState
69
+ });
70
+ }).onMessage((_socket, e) => {
71
+ if (typeof e.data !== "string") {
72
+ this.close();
73
+ return;
74
+ }
75
+ const result = n.json().pipe(n.relayMsg()).safeParse(e.data);
76
+ if (result.success) {
77
+ this.log({
78
+ level: "trace",
79
+ ns: "relay.ws.message",
80
+ data: result.data
81
+ });
82
+ this.receive(result.data);
83
+ } else {
84
+ this.log({
85
+ level: "warn",
86
+ ns: "relay.ws.message",
87
+ error: result.error
88
+ });
89
+ }
90
+ }).build();
91
+ }
92
+ /** Handle a NIP-01 relay message. */
93
+ receive(msg) {
94
+ const { auth, verifyEvent = _verifyEvent } = this.opts;
95
+ switch (msg[0]) {
96
+ case "EVENT":
97
+ if (!verifyEvent(msg[2])) break;
98
+ this.ee.dispatchEvent(
99
+ new CustomEvent(`sub:${msg[1]}`, { detail: msg })
100
+ );
101
+ break;
102
+ case "EOSE":
103
+ this.ee.dispatchEvent(
104
+ new CustomEvent(`sub:${msg[1]}`, { detail: msg })
105
+ );
106
+ break;
107
+ case "CLOSED":
108
+ this.subs.delete(msg[1]);
109
+ this.maybeStartIdleTimer();
110
+ this.ee.dispatchEvent(
111
+ new CustomEvent(`sub:${msg[1]}`, { detail: msg })
112
+ );
113
+ this.ee.dispatchEvent(
114
+ new CustomEvent(`count:${msg[1]}`, { detail: msg })
115
+ );
116
+ break;
117
+ case "OK":
118
+ this.ee.dispatchEvent(new CustomEvent(`ok:${msg[1]}`, { detail: msg }));
119
+ break;
120
+ case "NOTICE":
121
+ this.ee.dispatchEvent(new CustomEvent("notice", { detail: msg }));
122
+ break;
123
+ case "COUNT":
124
+ this.ee.dispatchEvent(
125
+ new CustomEvent(`count:${msg[1]}`, { detail: msg })
126
+ );
127
+ break;
128
+ case "AUTH":
129
+ auth?.(msg[1]).then((event) => this.send(["AUTH", event])).catch(
130
+ () => {
131
+ }
132
+ );
21
133
  }
22
- constructor(url, opts = {}) {
23
- this.url = url;
24
- this.opts = opts;
25
- this.socket = this.createSocket();
134
+ }
135
+ /** Send a NIP-01 client message to the relay. */
136
+ send(msg) {
137
+ this.log({ level: "trace", ns: "relay.ws.send", data: msg });
138
+ this.wake();
139
+ switch (msg[0]) {
140
+ case "REQ":
141
+ this.subs.set(msg[1], msg);
142
+ break;
143
+ case "CLOSE":
144
+ this.subs.delete(msg[1]);
26
145
  this.maybeStartIdleTimer();
146
+ break;
147
+ case "EVENT":
148
+ case "COUNT":
149
+ return this.socket.send(JSON.stringify(msg));
27
150
  }
28
- /** Create (and open) a WebSocket connection with automatic reconnect. */
29
- createSocket() {
30
- const { backoff = new ExponentialBackoff(1000) } = this.opts;
31
- return new WebsocketBuilder(this.url)
32
- .withBuffer(new ArrayQueue())
33
- .withBackoff(backoff === false ? undefined : backoff)
34
- .onOpen((socket) => {
35
- this.log({
36
- level: 'debug',
37
- ns: 'relay.ws.state',
38
- state: 'open',
39
- readyState: socket.readyState,
40
- });
41
- for (const req of this.subs.values()) {
42
- this.send(req);
43
- }
44
- })
45
- .onClose((socket) => {
46
- this.log({
47
- level: 'debug',
48
- ns: 'relay.ws.state',
49
- state: 'close',
50
- readyState: socket.readyState,
51
- });
52
- // If the connection closes on its own and there are no active subscriptions, let it stay closed.
53
- if (!this.subs.size) {
54
- this.socket.close();
55
- }
56
- })
57
- .onReconnect((socket) => {
58
- this.log({
59
- level: 'debug',
60
- ns: 'relay.ws.state',
61
- state: 'reconnect',
62
- readyState: socket.readyState,
63
- });
64
- })
65
- .onRetry((socket, e) => {
66
- this.log({
67
- level: 'warn',
68
- ns: 'relay.ws.retry',
69
- readyState: socket.readyState,
70
- backoff: e.detail.backoff,
71
- });
72
- })
73
- .onError((socket) => {
74
- this.log({
75
- level: 'error',
76
- ns: 'relay.ws.error',
77
- readyState: socket.readyState,
78
- });
79
- })
80
- .onMessage((_socket, e) => {
81
- if (typeof e.data !== 'string') {
82
- this.close();
83
- return;
84
- }
85
- const result = n.json().pipe(n.relayMsg()).safeParse(e.data);
86
- if (result.success) {
87
- this.log({
88
- level: 'trace',
89
- ns: 'relay.ws.message',
90
- data: result.data,
91
- });
92
- this.receive(result.data);
93
- }
94
- else {
95
- this.log({
96
- level: 'warn',
97
- ns: 'relay.ws.message',
98
- error: result.error,
99
- });
100
- }
101
- })
102
- .build();
151
+ if (this.socket.readyState === WebSocket.OPEN) {
152
+ this.socket.send(JSON.stringify(msg));
103
153
  }
104
- /** Handle a NIP-01 relay message. */
105
- receive(msg) {
106
- const { auth, verifyEvent = _verifyEvent } = this.opts;
107
- switch (msg[0]) {
108
- case 'EVENT':
109
- if (!verifyEvent(msg[2]))
110
- break;
111
- this.ee.dispatchEvent(new CustomEvent(`sub:${msg[1]}`, { detail: msg }));
112
- break;
113
- case 'EOSE':
114
- this.ee.dispatchEvent(new CustomEvent(`sub:${msg[1]}`, { detail: msg }));
115
- break;
116
- case 'CLOSED':
117
- this.subs.delete(msg[1]);
118
- this.maybeStartIdleTimer();
119
- this.ee.dispatchEvent(new CustomEvent(`sub:${msg[1]}`, { detail: msg }));
120
- this.ee.dispatchEvent(new CustomEvent(`count:${msg[1]}`, { detail: msg }));
121
- break;
122
- case 'OK':
123
- this.ee.dispatchEvent(new CustomEvent(`ok:${msg[1]}`, { detail: msg }));
124
- break;
125
- case 'NOTICE':
126
- this.ee.dispatchEvent(new CustomEvent('notice', { detail: msg }));
127
- break;
128
- case 'COUNT':
129
- this.ee.dispatchEvent(new CustomEvent(`count:${msg[1]}`, { detail: msg }));
130
- break;
131
- case 'AUTH':
132
- auth?.(msg[1]).then((event) => this.send(['AUTH', event])).catch(() => { });
154
+ }
155
+ async *req(filters, opts = {}) {
156
+ const { signal } = opts;
157
+ const subscriptionId = crypto.randomUUID();
158
+ const msgs = this.on(`sub:${subscriptionId}`, signal);
159
+ const req = ["REQ", subscriptionId, ...filters];
160
+ this.send(req);
161
+ try {
162
+ for await (const msg of msgs) {
163
+ if (msg[0] === "EOSE") yield msg;
164
+ if (msg[0] === "CLOSED") break;
165
+ if (msg[0] === "EVENT") {
166
+ if (matchFilters(filters, msg[2])) {
167
+ yield msg;
168
+ } else {
169
+ continue;
170
+ }
133
171
  }
172
+ }
173
+ } finally {
174
+ this.send(["CLOSE", subscriptionId]);
134
175
  }
135
- /** Send a NIP-01 client message to the relay. */
136
- send(msg) {
137
- this.log({ level: 'trace', ns: 'relay.ws.send', data: msg });
138
- this.wake();
139
- switch (msg[0]) {
140
- case 'REQ':
141
- this.subs.set(msg[1], msg);
142
- break;
143
- case 'CLOSE':
144
- this.subs.delete(msg[1]);
145
- this.maybeStartIdleTimer();
146
- break;
147
- case 'EVENT':
148
- case 'COUNT':
149
- return this.socket.send(JSON.stringify(msg));
150
- }
151
- if (this.socket.readyState === WebSocket.OPEN) {
152
- this.socket.send(JSON.stringify(msg));
153
- }
176
+ }
177
+ async query(filters, opts) {
178
+ const events = new NSet();
179
+ const limit = filters.reduce(
180
+ (result, filter) => result + getFilterLimit(filter),
181
+ 0
182
+ );
183
+ if (limit === 0) return [];
184
+ for await (const msg of this.req(filters, opts)) {
185
+ if (msg[0] === "EOSE") break;
186
+ if (msg[0] === "EVENT") events.add(msg[2]);
187
+ if (msg[0] === "CLOSED") throw new Error("Subscription closed");
188
+ if (events.size >= limit) {
189
+ break;
190
+ }
154
191
  }
155
- async *req(filters, opts = {}) {
156
- const { signal } = opts;
157
- const subscriptionId = crypto.randomUUID();
158
- const msgs = this.on(`sub:${subscriptionId}`, signal);
159
- const req = ['REQ', subscriptionId, ...filters];
160
- this.send(req);
161
- try {
162
- for await (const msg of msgs) {
163
- if (msg[0] === 'EOSE')
164
- yield msg;
165
- if (msg[0] === 'CLOSED')
166
- break;
167
- if (msg[0] === 'EVENT') {
168
- if (matchFilters(filters, msg[2])) {
169
- yield msg;
170
- }
171
- else {
172
- continue;
173
- }
174
- }
175
- }
176
- }
177
- finally {
178
- this.send(['CLOSE', subscriptionId]);
179
- }
192
+ return [...events];
193
+ }
194
+ async event(event, opts) {
195
+ const result = this.once(`ok:${event.id}`, opts?.signal);
196
+ try {
197
+ this.send(["EVENT", event]);
198
+ } catch (e) {
199
+ result.catch(() => {
200
+ });
201
+ throw e;
180
202
  }
181
- async query(filters, opts) {
182
- const events = new NSet();
183
- const limit = filters.reduce((result, filter) => result + getFilterLimit(filter), 0);
184
- if (limit === 0)
185
- return [];
186
- for await (const msg of this.req(filters, opts)) {
187
- if (msg[0] === 'EOSE')
188
- break;
189
- if (msg[0] === 'EVENT')
190
- events.add(msg[2]);
191
- if (msg[0] === 'CLOSED')
192
- throw new Error('Subscription closed');
193
- if (events.size >= limit) {
194
- break;
195
- }
196
- }
197
- return [...events];
203
+ const [, , ok, reason] = await result;
204
+ if (!ok) {
205
+ throw new Error(reason);
198
206
  }
199
- async event(event, opts) {
200
- const result = this.once(`ok:${event.id}`, opts?.signal);
201
- try {
202
- this.send(['EVENT', event]);
203
- }
204
- catch (e) {
205
- result.catch(() => { });
206
- throw e;
207
- }
208
- const [, , ok, reason] = await result;
209
- if (!ok) {
210
- throw new Error(reason);
211
- }
207
+ }
208
+ async count(filters, opts) {
209
+ const subscriptionId = crypto.randomUUID();
210
+ const result = this.once(`count:${subscriptionId}`, opts?.signal);
211
+ try {
212
+ this.send(["COUNT", subscriptionId, ...filters]);
213
+ } catch (e) {
214
+ result.catch(() => {
215
+ });
216
+ throw e;
212
217
  }
213
- async count(filters, opts) {
214
- const subscriptionId = crypto.randomUUID();
215
- const result = this.once(`count:${subscriptionId}`, opts?.signal);
216
- try {
217
- this.send(['COUNT', subscriptionId, ...filters]);
218
- }
219
- catch (e) {
220
- result.catch(() => { });
221
- throw e;
222
- }
223
- const msg = await result;
224
- switch (msg[0]) {
225
- case 'CLOSED':
226
- throw new Error('Subscription closed');
227
- case 'COUNT': {
228
- const [, , count] = msg;
229
- return count;
230
- }
231
- }
218
+ const msg = await result;
219
+ switch (msg[0]) {
220
+ case "CLOSED":
221
+ throw new Error("Subscription closed");
222
+ case "COUNT": {
223
+ const [, , count] = msg;
224
+ return count;
225
+ }
232
226
  }
233
- /** Get a stream of EE events. */
234
- async *on(key, signal) {
235
- const _signal = signal ? AbortSignal.any([this.controller.signal, signal]) : this.controller.signal;
236
- if (_signal.aborted)
237
- throw this.abortError();
238
- const machina = new Machina(_signal);
239
- const onMsg = (e) => machina.push(e.detail);
240
- this.ee.addEventListener(key, onMsg);
241
- try {
242
- for await (const msg of machina) {
243
- yield msg;
244
- }
245
- }
246
- finally {
247
- this.ee.removeEventListener(key, onMsg);
248
- }
227
+ throw new Error("Count ended -- this should never happen");
228
+ }
229
+ /** Get a stream of EE events. */
230
+ async *on(key, signal) {
231
+ const _signal = signal ? AbortSignal.any([this.controller.signal, signal]) : this.controller.signal;
232
+ if (_signal.aborted) throw this.abortError();
233
+ const machina = new Machina(_signal);
234
+ const onMsg = (e) => machina.push(e.detail);
235
+ this.ee.addEventListener(key, onMsg);
236
+ try {
237
+ for await (const msg of machina) {
238
+ yield msg;
239
+ }
240
+ } finally {
241
+ this.ee.removeEventListener(key, onMsg);
249
242
  }
250
- /** Wait for a single EE event. */
251
- async once(key, signal) {
252
- for await (const msg of this.on(key, signal)) {
253
- return msg;
254
- }
255
- throw new Error('Unreachable');
243
+ }
244
+ /** Wait for a single EE event. */
245
+ async once(key, signal) {
246
+ for await (const msg of this.on(key, signal)) {
247
+ return msg;
256
248
  }
257
- abortError() {
258
- return new DOMException('The signal has been aborted', 'AbortError');
249
+ throw new Error("Unreachable");
250
+ }
251
+ abortError() {
252
+ return new DOMException("The signal has been aborted", "AbortError");
253
+ }
254
+ /** Start the idle time if applicable. */
255
+ maybeStartIdleTimer() {
256
+ const { idleTimeout = 3e4 } = this.opts;
257
+ if (idleTimeout === false) return;
258
+ if (this.idleTimer) return;
259
+ if (this.subs.size) return;
260
+ if (this.closedByUser) return;
261
+ this.log({
262
+ level: "debug",
263
+ ns: "relay.idletimer",
264
+ state: "running",
265
+ timeout: idleTimeout
266
+ });
267
+ this.idleTimer = setTimeout(() => {
268
+ this.log({
269
+ level: "debug",
270
+ ns: "relay.idletimer",
271
+ state: "aborted",
272
+ timeout: idleTimeout
273
+ });
274
+ this.socket.close();
275
+ }, idleTimeout);
276
+ }
277
+ /** Stop the idle timer. */
278
+ stopIdleTimer() {
279
+ this.log({ level: "debug", ns: "relay.idletimer", state: "stopped" });
280
+ clearTimeout(this.idleTimer);
281
+ this.idleTimer = void 0;
282
+ }
283
+ /** Make a new WebSocket, but only if it was closed by an idle timeout. */
284
+ wake() {
285
+ this.stopIdleTimer();
286
+ if (!this.closedByUser && this.socket.closedByUser) {
287
+ this.log({ level: "debug", ns: "relay.wake", state: "awoken" });
288
+ this.socket = this.createSocket();
289
+ } else if (this.closedByUser || this.socket.closedByUser) {
290
+ this.log({ level: "debug", ns: "relay.wake", state: "closed" });
291
+ } else {
292
+ this.log({ level: "debug", ns: "relay.wake", state: "awake" });
259
293
  }
260
- /** Start the idle time if applicable. */
261
- maybeStartIdleTimer() {
262
- const { idleTimeout = 30_000 } = this.opts;
263
- // If the idle timeout is disabled, do nothing.
264
- if (idleTimeout === false)
265
- return;
266
- // If a timer is already running, let it continue without disruption.
267
- if (this.idleTimer)
268
- return;
269
- // If there are still subscriptions, the connection is not "idle".
270
- if (this.subs.size)
271
- return;
272
- // If the connection was manually closed, there's no need to start a timer.
273
- if (this.closedByUser)
274
- return;
275
- this.log({
276
- level: 'debug',
277
- ns: 'relay.idletimer',
278
- state: 'running',
279
- timeout: idleTimeout,
294
+ }
295
+ /**
296
+ * Close the relay connection and prevent it from reconnecting.
297
+ * After this you should dispose of the `NRelay1` instance and create a new one to connect again.
298
+ */
299
+ async close() {
300
+ this.closedByUser = true;
301
+ this.socket.close();
302
+ this.stopIdleTimer();
303
+ this.controller.abort();
304
+ if (this.socket.readyState !== WebSocket.CLOSED) {
305
+ await new Promise((resolve) => {
306
+ this.socket.addEventListener(WebsocketEvent.close, resolve, {
307
+ once: true
280
308
  });
281
- this.idleTimer = setTimeout(() => {
282
- this.log({
283
- level: 'debug',
284
- ns: 'relay.idletimer',
285
- state: 'aborted',
286
- timeout: idleTimeout,
287
- });
288
- this.socket.close();
289
- }, idleTimeout);
290
- }
291
- /** Stop the idle timer. */
292
- stopIdleTimer() {
293
- this.log({ level: 'debug', ns: 'relay.idletimer', state: 'stopped' });
294
- clearTimeout(this.idleTimer);
295
- this.idleTimer = undefined;
296
- }
297
- /** Make a new WebSocket, but only if it was closed by an idle timeout. */
298
- wake() {
299
- this.stopIdleTimer();
300
- if (!this.closedByUser && this.socket.closedByUser) {
301
- this.log({ level: 'debug', ns: 'relay.wake', state: 'awoken' });
302
- this.socket = this.createSocket();
303
- }
304
- else if (this.closedByUser || this.socket.closedByUser) {
305
- this.log({ level: 'debug', ns: 'relay.wake', state: 'closed' });
306
- }
307
- else {
308
- this.log({ level: 'debug', ns: 'relay.wake', state: 'awake' });
309
- }
310
- }
311
- /**
312
- * Close the relay connection and prevent it from reconnecting.
313
- * After this you should dispose of the `NRelay1` instance and create a new one to connect again.
314
- */
315
- async close() {
316
- this.closedByUser = true;
317
- this.socket.close();
318
- this.stopIdleTimer();
319
- this.controller.abort();
320
- if (this.socket.readyState !== WebSocket.CLOSED) {
321
- await new Promise((resolve) => {
322
- this.socket.addEventListener(WebsocketEvent.close, resolve, {
323
- once: true,
324
- });
325
- });
326
- }
327
- }
328
- async [Symbol.asyncDispose]() {
329
- await this.close();
309
+ });
330
310
  }
311
+ }
312
+ async [Symbol.asyncDispose]() {
313
+ await this.close();
314
+ }
331
315
  }
332
- //# sourceMappingURL=NRelay1.js.map
316
+ export {
317
+ NRelay1
318
+ };
package/dist/NSchema.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { NostrClientAUTH, NostrClientCLOSE, NostrClientCOUNT, NostrClientEVENT, NostrClientMsg, NostrClientREQ, NostrConnectRequest, NostrConnectResponse, NostrEvent, NostrFilter, NostrMetadata, NostrRelayAUTH, NostrRelayCLOSED, NostrRelayCOUNT, NostrRelayEOSE, NostrRelayEVENT, NostrRelayMsg, NostrRelayNOTICE, NostrRelayOK } from '@nostrify/types';
2
+ import type { NostrClientAUTH, NostrClientCLOSE, NostrClientCOUNT, NostrClientEVENT, NostrClientMsg, NostrClientREQ, NostrConnectRequest, NostrConnectResponse, NostrEvent, NostrFilter, NostrMetadata, NostrRelayAUTH, NostrRelayCLOSED, NostrRelayCOUNT, NostrRelayEOSE, NostrRelayEVENT, NostrRelayMsg, NostrRelayNOTICE, NostrRelayOK } from '@nostrify/types';
3
3
  /**
4
4
  * A suite of [zod](https://github.com/colinhacks/zod) schemas for Nostr.
5
5
  *
@@ -1 +1 @@
1
- {"version":3,"file":"NSchema.d.ts","sourceRoot":"","sources":["../NSchema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NSchema.d.ts","sourceRoot":"","sources":["../NSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,YAAY,EACb,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;;;;GAWG;AACH,cAAM,OAAO;IACX,sEAAsE;IACtE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,SAAS;IAIxB,0BAA0B;IAC1B,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IAYrC,2BAA2B;IAC3B,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IA8BvC;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;IAOxE,uDAAuD;IACvD,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,CAAC;IAOlE,mDAAmD;IACnD,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAIjD,iDAAiD;IACjD,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAI7C,mDAAmD;IACnD,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAIjD,mDAAmD;IACnD,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAIjD,kDAAkD;IAClD,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;IAI/C,2CAA2C;IAC3C,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAU7C,mDAAmD;IACnD,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;IAI/C,gDAAgD;IAChD,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAIzC,kDAAkD;IAClD,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAI7C,oDAAoD;IACpD,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAIjD,oDAAoD;IACpD,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAIjD,kDAAkD;IAClD,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAI7C,mDAAmD;IACnD,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;IAW/C,2CAA2C;IAC3C,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;IAY3C,6BAA6B;IAC7B,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;IAe3C,qCAAqC;IACrC,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;IAQvD,sCAAsC;IACtC,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC;IAQzD;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;CAUlC;AAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC"}