@nostrify/nostrify 0.46.7 → 0.46.9

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 +121 -2
  2. package/.turbo/turbo-setup.log +13 -0
  3. package/.turbo/turbo-test.log +91 -0
  4. package/BunkerURI.test.ts +19 -14
  5. package/CHANGELOG.md +16 -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 +6 -6
  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 +74 -37
  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/NCache.d.ts +2 -2
  30. package/dist/NCache.d.ts.map +1 -1
  31. package/dist/NConnectSigner.d.ts +1 -1
  32. package/dist/NConnectSigner.d.ts.map +1 -1
  33. package/dist/NIP05.d.ts +1 -1
  34. package/dist/NIP05.d.ts.map +1 -1
  35. package/dist/NIP98.d.ts +1 -1
  36. package/dist/NIP98.d.ts.map +1 -1
  37. package/dist/NPool.d.ts +2 -2
  38. package/dist/NPool.d.ts.map +1 -1
  39. package/dist/NRelay1.d.ts +5 -4
  40. package/dist/NRelay1.d.ts.map +1 -1
  41. package/dist/NSchema.d.ts +1 -1
  42. package/dist/NSchema.d.ts.map +1 -1
  43. package/dist/NSecSigner.d.ts +1 -2
  44. package/dist/NSecSigner.d.ts.map +1 -1
  45. package/dist/NSet.d.ts +1 -1
  46. package/dist/NSet.d.ts.map +1 -1
  47. package/dist/RelayError.d.ts +1 -1
  48. package/dist/RelayError.d.ts.map +1 -1
  49. package/dist/ln/LNURL.d.ts +4 -4
  50. package/dist/ln/LNURL.d.ts.map +1 -1
  51. package/dist/ln/mod.d.ts +3 -3
  52. package/dist/mod.d.ts +14 -14
  53. package/dist/test/ErrorRelay.d.ts +1 -1
  54. package/dist/test/ErrorRelay.d.ts.map +1 -1
  55. package/dist/test/MockRelay.d.ts +3 -3
  56. package/dist/test/MockRelay.d.ts.map +1 -1
  57. package/dist/test/TestRelayServer.d.ts +6 -3
  58. package/dist/test/TestRelayServer.d.ts.map +1 -1
  59. package/dist/test/mod.d.ts +3 -3
  60. package/dist/test/mod.d.ts.map +1 -1
  61. package/dist/tsconfig.tsbuildinfo +1 -1
  62. package/dist/uploaders/BlossomUploader.d.ts +1 -1
  63. package/dist/uploaders/BlossomUploader.d.ts.map +1 -1
  64. package/dist/uploaders/NostrBuildUploader.d.ts +1 -2
  65. package/dist/uploaders/NostrBuildUploader.d.ts.map +1 -1
  66. package/dist/uploaders/mod.d.ts +2 -2
  67. package/dist/utils/CircularSet.d.ts +1 -1
  68. package/dist/utils/CircularSet.d.ts.map +1 -1
  69. package/dist/utils/N64.d.ts +1 -1
  70. package/dist/utils/N64.d.ts.map +1 -1
  71. package/dist/utils/mod.d.ts +2 -2
  72. package/ln/LNURL.test.ts +70 -52
  73. package/ln/LNURL.ts +15 -15
  74. package/ln/mod.ts +3 -3
  75. package/mod.ts +14 -14
  76. package/package.json +5 -3
  77. package/test/ErrorRelay.test.ts +11 -10
  78. package/test/ErrorRelay.ts +17 -5
  79. package/test/MockRelay.test.ts +15 -8
  80. package/test/MockRelay.ts +3 -3
  81. package/test/TestRelayServer.ts +46 -17
  82. package/test/mod.ts +4 -4
  83. package/tsconfig.json +5 -3
  84. package/uploaders/BlossomUploader.test.ts +39 -22
  85. package/uploaders/BlossomUploader.ts +2 -2
  86. package/uploaders/NostrBuildUploader.test.ts +36 -18
  87. package/uploaders/NostrBuildUploader.ts +4 -4
  88. package/uploaders/mod.ts +2 -2
  89. package/utils/CircularSet.test.ts +5 -4
  90. package/utils/CircularSet.ts +3 -1
  91. package/utils/Machina.test.ts +30 -19
  92. package/utils/N64.test.ts +12 -11
  93. package/utils/N64.ts +2 -2
  94. package/utils/mod.ts +2 -2
  95. package/dist/BunkerURI.js +0 -48
  96. package/dist/BunkerURI.js.map +0 -1
  97. package/dist/NBrowserSigner.js +0 -92
  98. package/dist/NBrowserSigner.js.map +0 -1
  99. package/dist/NCache.js +0 -60
  100. package/dist/NCache.js.map +0 -1
  101. package/dist/NConnectSigner.js +0 -125
  102. package/dist/NConnectSigner.js.map +0 -1
  103. package/dist/NIP05.js +0 -35
  104. package/dist/NIP05.js.map +0 -1
  105. package/dist/NIP50.js +0 -22
  106. package/dist/NIP50.js.map +0 -1
  107. package/dist/NIP98.js +0 -67
  108. package/dist/NIP98.js.map +0 -1
  109. package/dist/NKinds.js +0 -23
  110. package/dist/NKinds.js.map +0 -1
  111. package/dist/NPool.js +0 -181
  112. package/dist/NPool.js.map +0 -1
  113. package/dist/NRelay1.js +0 -332
  114. package/dist/NRelay1.js.map +0 -1
  115. package/dist/NSchema.js +0 -210
  116. package/dist/NSchema.js.map +0 -1
  117. package/dist/NSecSigner.js +0 -49
  118. package/dist/NSecSigner.js.map +0 -1
  119. package/dist/NSet.js +0 -171
  120. package/dist/NSet.js.map +0 -1
  121. package/dist/RelayError.js +0 -19
  122. package/dist/RelayError.js.map +0 -1
  123. package/dist/ln/LNURL.js +0 -101
  124. package/dist/ln/LNURL.js.map +0 -1
  125. package/dist/ln/mod.js +0 -2
  126. package/dist/ln/mod.js.map +0 -1
  127. package/dist/ln/types/LNURLCallback.js +0 -2
  128. package/dist/ln/types/LNURLCallback.js.map +0 -1
  129. package/dist/ln/types/LNURLDetails.js +0 -2
  130. package/dist/ln/types/LNURLDetails.js.map +0 -1
  131. package/dist/mod.js +0 -15
  132. package/dist/mod.js.map +0 -1
  133. package/dist/test/ErrorRelay.js +0 -22
  134. package/dist/test/ErrorRelay.js.map +0 -1
  135. package/dist/test/MockRelay.js +0 -62
  136. package/dist/test/MockRelay.js.map +0 -1
  137. package/dist/test/TestRelayServer.js +0 -130
  138. package/dist/test/TestRelayServer.js.map +0 -1
  139. package/dist/test/mod.js +0 -21
  140. package/dist/test/mod.js.map +0 -1
  141. package/dist/uploaders/BlossomUploader.js +0 -67
  142. package/dist/uploaders/BlossomUploader.js.map +0 -1
  143. package/dist/uploaders/NostrBuildUploader.js +0 -63
  144. package/dist/uploaders/NostrBuildUploader.js.map +0 -1
  145. package/dist/uploaders/mod.js +0 -3
  146. package/dist/uploaders/mod.js.map +0 -1
  147. package/dist/utils/CircularSet.js +0 -31
  148. package/dist/utils/CircularSet.js.map +0 -1
  149. package/dist/utils/Machina.js +0 -62
  150. package/dist/utils/Machina.js.map +0 -1
  151. package/dist/utils/N64.js +0 -19
  152. package/dist/utils/N64.js.map +0 -1
  153. package/dist/utils/mod.js +0 -3
  154. package/dist/utils/mod.js.map +0 -1
package/dist/NRelay1.js DELETED
@@ -1,332 +0,0 @@
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 });
21
- }
22
- constructor(url, opts = {}) {
23
- this.url = url;
24
- this.opts = opts;
25
- this.socket = this.createSocket();
26
- this.maybeStartIdleTimer();
27
- }
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();
103
- }
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(() => { });
133
- }
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]);
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
- }
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')
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
- }
180
- }
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];
198
- }
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
- }
212
- }
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
- }
232
- }
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
- }
249
- }
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');
256
- }
257
- abortError() {
258
- return new DOMException('The signal has been aborted', 'AbortError');
259
- }
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,
280
- });
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();
330
- }
331
- }
332
- //# sourceMappingURL=NRelay1.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NRelay1.js","sourceRoot":"","sources":["../NRelay1.ts"],"names":[],"mappings":"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"}
package/dist/NSchema.js DELETED
@@ -1,210 +0,0 @@
1
- import { z } from 'zod';
2
- /**
3
- * A suite of [zod](https://github.com/colinhacks/zod) schemas for Nostr.
4
- *
5
- * ```ts
6
- * import { NSchema as n } from '@nostrify/nostrify';
7
- *
8
- * const event: NostrEvent = n.event().parse(eventData);
9
- * const metadata: NostrMetadata = n.json().pipe(n.metadata()).parse(event.content);
10
- * const msg: NostrRelayMsg = n.relayMsg().parse(e.data);
11
- * const nsec: `nsec1${string}` = n.bech32('nsec').parse(token);
12
- * ```
13
- */
14
- class NSchema {
15
- /** Schema to validate Nostr hex IDs such as event IDs and pubkeys. */
16
- static id() {
17
- return z.string().regex(/^[0-9a-f]{64}$/);
18
- }
19
- /** Nostr event schema. */
20
- static event() {
21
- return z.object({
22
- id: NSchema.id(),
23
- kind: z.number().int().nonnegative(),
24
- pubkey: NSchema.id(),
25
- tags: z.string().array().array(),
26
- content: z.string(),
27
- created_at: z.number().int().nonnegative(),
28
- sig: z.string(),
29
- });
30
- }
31
- /** Nostr filter schema. */
32
- static filter() {
33
- return z.object({
34
- kinds: z.number().int().nonnegative().array().optional(),
35
- ids: NSchema.id().array().optional(),
36
- authors: NSchema.id().array().optional(),
37
- since: z.number().int().nonnegative().optional(),
38
- until: z.number().int().nonnegative().optional(),
39
- limit: z.number().int().nonnegative().optional(),
40
- search: z.string().optional(),
41
- })
42
- .passthrough()
43
- .transform((value) => {
44
- const keys = ['kinds', 'ids', 'authors', 'since', 'until', 'limit', 'search'];
45
- return Object.entries(value).reduce((acc, [key, val]) => {
46
- if (keys.includes(key) || key.startsWith('#')) {
47
- acc[key] = val;
48
- }
49
- return acc;
50
- }, {});
51
- });
52
- }
53
- /**
54
- * Bech32 string.
55
- * @see https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#bech32
56
- */
57
- static bech32(prefix) {
58
- return z
59
- .string()
60
- .regex(/^[\x21-\x7E]{1,83}1[023456789acdefghjklmnpqrstuvwxyz]{6,}$/)
61
- .refine((value) => prefix ? value.startsWith(`${prefix}1`) : true);
62
- }
63
- /** WebSocket URL starting with `ws://` or `wss://`. */
64
- static relayUrl() {
65
- return z
66
- .string()
67
- .url()
68
- .regex(/^wss?:\/\//);
69
- }
70
- /** NIP-01 `EVENT` message from client to relay. */
71
- static clientEVENT() {
72
- // @ts-expect-error This should be fine.
73
- return z.tuple([z.literal('EVENT'), NSchema.event()]);
74
- }
75
- /** NIP-01 `REQ` message from client to relay. */
76
- static clientREQ() {
77
- // @ts-expect-error this is fine
78
- return z.tuple([z.literal('REQ'), z.string()]).rest(NSchema.filter());
79
- }
80
- /** NIP-45 `COUNT` message from client to relay. */
81
- static clientCOUNT() {
82
- // @ts-expect-error this is fine
83
- return z.tuple([z.literal('COUNT'), z.string()]).rest(NSchema.filter());
84
- }
85
- /** NIP-01 `CLOSE` message from client to relay. */
86
- static clientCLOSE() {
87
- // @ts-expect-error This should be fine.
88
- return z.tuple([z.literal('CLOSE'), z.string()]);
89
- }
90
- /** NIP-42 `AUTH` message from client to relay. */
91
- static clientAUTH() {
92
- // @ts-expect-error This should be fine.
93
- return z.tuple([z.literal('AUTH'), NSchema.event()]);
94
- }
95
- /** NIP-01 message from client to relay. */
96
- static clientMsg() {
97
- return z.union([
98
- NSchema.clientEVENT(),
99
- NSchema.clientREQ(),
100
- NSchema.clientCOUNT(),
101
- NSchema.clientCLOSE(),
102
- NSchema.clientAUTH(),
103
- ]);
104
- }
105
- /** NIP-01 `EVENT` message from relay to client. */
106
- static relayEVENT() {
107
- // @ts-expect-error This should be fine.
108
- return z.tuple([z.literal('EVENT'), z.string(), NSchema.event()]);
109
- }
110
- /** NIP-01 `OK` message from relay to client. */
111
- static relayOK() {
112
- // @ts-expect-error This should be fine.
113
- return z.tuple([z.literal('OK'), NSchema.id(), z.boolean(), z.string()]);
114
- }
115
- /** NIP-01 `EOSE` message from relay to client. */
116
- static relayEOSE() {
117
- // @ts-expect-error This should be fine.
118
- return z.tuple([z.literal('EOSE'), z.string()]);
119
- }
120
- /** NIP-01 `NOTICE` message from relay to client. */
121
- static relayNOTICE() {
122
- // @ts-expect-error This should be fine.
123
- return z.tuple([z.literal('NOTICE'), z.string()]);
124
- }
125
- /** NIP-01 `CLOSED` message from relay to client. */
126
- static relayCLOSED() {
127
- // @ts-expect-error This should be fine.
128
- return z.tuple([z.literal('CLOSED'), z.string(), z.string()]);
129
- }
130
- /** NIP-42 `AUTH` message from relay to client. */
131
- static relayAUTH() {
132
- // @ts-expect-error This should be fine.
133
- return z.tuple([z.literal('AUTH'), z.string()]);
134
- }
135
- /** NIP-45 `COUNT` message from relay to client. */
136
- static relayCOUNT() {
137
- // @ts-expect-error This should be fine.
138
- return z.tuple([
139
- z.literal('COUNT'),
140
- z.string(),
141
- z.object({
142
- count: z.number().int().nonnegative(),
143
- approximate: z.boolean().optional(),
144
- }),
145
- ]);
146
- }
147
- /** NIP-01 message from relay to client. */
148
- static relayMsg() {
149
- return z.union([
150
- NSchema.relayEVENT(),
151
- NSchema.relayOK(),
152
- NSchema.relayEOSE(),
153
- NSchema.relayNOTICE(),
154
- NSchema.relayCLOSED(),
155
- NSchema.relayAUTH(),
156
- NSchema.relayCOUNT(),
157
- ]);
158
- }
159
- /** Kind 0 content schema. */
160
- static metadata() {
161
- return z.object({
162
- about: z.string().optional().catch(undefined),
163
- banner: z.string().url().optional().catch(undefined),
164
- bot: z.boolean().optional().catch(undefined),
165
- display_name: z.string().optional().catch(undefined),
166
- lud06: NSchema.bech32('lnurl').optional().catch(undefined),
167
- lud16: z.string().email().optional().catch(undefined),
168
- name: z.string().optional().catch(undefined),
169
- nip05: z.string().email().optional().catch(undefined),
170
- picture: z.string().url().optional().catch(undefined),
171
- website: z.string().url().optional().catch(undefined),
172
- }).passthrough();
173
- }
174
- /** NIP-46 request content schema. */
175
- static connectRequest() {
176
- return z.object({
177
- id: z.string(),
178
- method: z.string(),
179
- params: z.string().array(),
180
- });
181
- }
182
- /** NIP-46 response content schema. */
183
- static connectResponse() {
184
- return z.object({
185
- id: z.string(),
186
- result: z.string(),
187
- error: z.string().optional(),
188
- });
189
- }
190
- /**
191
- * Helper schema to parse a JSON string. It should then be piped into another schema. For example:
192
- *
193
- * ```ts
194
- * const event = NSchema.json().pipe(NSchema.event()).parse(data);
195
- * ```
196
- */
197
- static json() {
198
- return z.string().transform((value, ctx) => {
199
- try {
200
- return JSON.parse(value);
201
- }
202
- catch (_e) {
203
- ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'Invalid JSON' });
204
- return z.NEVER;
205
- }
206
- });
207
- }
208
- }
209
- export { NSchema, z };
210
- //# sourceMappingURL=NSchema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NSchema.js","sourceRoot":"","sources":["../NSchema.ts"],"names":[],"mappings":"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"}
@@ -1,49 +0,0 @@
1
- // deno-lint-ignore-file require-await
2
- import { finalizeEvent, getPublicKey, nip04, nip44 } from 'nostr-tools';
3
- /**
4
- * NIP-07-compatible signer with secret key. It is a drop-in replacement for `window.nostr`.
5
- *
6
- * Usage:
7
- *
8
- * ```ts
9
- * const signer = new NSecSigner(secretKey);
10
- * const pubkey = await signer.getPublicKey();
11
- * const event = await signer.signEvent({ kind: 1, content: 'Hello, world!', tags: [], created_at: 0 });
12
- * ```
13
- */
14
- export class NSecSigner {
15
- #secretKey;
16
- pubkey;
17
- constructor(secretKey) {
18
- this.#secretKey = secretKey;
19
- }
20
- async getPublicKey() {
21
- return this.pubkey ??= getPublicKey(this.#secretKey);
22
- }
23
- async signEvent(event) {
24
- // @ts-ignore this is fine
25
- return finalizeEvent(event, this.#secretKey);
26
- }
27
- nip04 = {
28
- encrypt: async (pubkey, plaintext) => {
29
- return nip04.encrypt(this.#secretKey, pubkey, plaintext);
30
- },
31
- decrypt: async (pubkey, ciphertext) => {
32
- return nip04.decrypt(this.#secretKey, pubkey, ciphertext);
33
- },
34
- };
35
- #getConversationKey(pubkey) {
36
- return nip44.v2.utils.getConversationKey(this.#secretKey, pubkey);
37
- }
38
- nip44 = {
39
- encrypt: async (pubkey, plaintext) => {
40
- const conversationKey = this.#getConversationKey(pubkey);
41
- return nip44.v2.encrypt(plaintext, conversationKey);
42
- },
43
- decrypt: async (pubkey, ciphertext) => {
44
- const conversationKey = this.#getConversationKey(pubkey);
45
- return nip44.v2.decrypt(ciphertext, conversationKey);
46
- },
47
- };
48
- }
49
- //# sourceMappingURL=NSecSigner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NSecSigner.js","sourceRoot":"","sources":["../NSecSigner.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAKxE;;;;;;;;;;GAUG;AACH,MAAM,OAAO,UAAU;IACrB,UAAU,CAAa;IACf,MAAM,CAAU;IAExB,YAAY,SAAqB;QAC/B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAgD;QAC9D,0BAA0B;QAC1B,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IAEQ,KAAK,GAAG;QACf,OAAO,EAAE,KAAK,EAAE,MAAc,EAAE,SAAiB,EAAmB,EAAE;YACpE,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,MAAc,EAAE,UAAkB,EAAmB,EAAE;YACrE,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAC5D,CAAC;KACF,CAAC;IAEF,mBAAmB,CAAC,MAAc;QAChC,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC;IAEQ,KAAK,GAAG;QACf,OAAO,EAAE,KAAK,EAAE,MAAc,EAAE,SAAiB,EAAmB,EAAE;YACpE,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACzD,OAAO,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,MAAc,EAAE,UAAkB,EAAmB,EAAE;YACrE,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACzD,OAAO,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QACvD,CAAC;KACF,CAAC;CACH"}