@nostrify/nostrify 0.46.4
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.
- package/.turbo/turbo-build.log +5 -0
- package/BunkerURI.test.ts +28 -0
- package/BunkerURI.ts +58 -0
- package/CHANGELOG.md +562 -0
- package/LICENSE +21 -0
- package/NBrowserSigner.test.ts +170 -0
- package/NBrowserSigner.ts +100 -0
- package/NCache.bench.ts +81 -0
- package/NCache.test.ts +22 -0
- package/NCache.ts +73 -0
- package/NConnectSigner.test.ts +102 -0
- package/NConnectSigner.ts +189 -0
- package/NIP05.test.ts +67 -0
- package/NIP05.ts +52 -0
- package/NIP50.test.ts +58 -0
- package/NIP50.ts +24 -0
- package/NIP98.test.ts +181 -0
- package/NIP98.ts +97 -0
- package/NKinds.test.ts +42 -0
- package/NKinds.ts +26 -0
- package/NPool.test.ts +117 -0
- package/NPool.ts +224 -0
- package/NRelay1.test.ts +174 -0
- package/NRelay1.ts +440 -0
- package/NSchema.test.ts +94 -0
- package/NSchema.ts +255 -0
- package/NSecSigner.bench.ts +55 -0
- package/NSecSigner.test.ts +26 -0
- package/NSecSigner.ts +60 -0
- package/NSet.bench.ts +10 -0
- package/NSet.test.ts +92 -0
- package/NSet.ts +203 -0
- package/README.md +314 -0
- package/RelayError.test.ts +23 -0
- package/RelayError.ts +22 -0
- package/dist/BunkerURI.d.ts +23 -0
- package/dist/BunkerURI.d.ts.map +1 -0
- package/dist/BunkerURI.js +52 -0
- package/dist/BunkerURI.js.map +1 -0
- package/dist/NBrowserSigner.d.ts +27 -0
- package/dist/NBrowserSigner.d.ts.map +1 -0
- package/dist/NBrowserSigner.js +96 -0
- package/dist/NBrowserSigner.js.map +1 -0
- package/dist/NCache.d.ts +34 -0
- package/dist/NCache.d.ts.map +1 -0
- package/dist/NCache.js +63 -0
- package/dist/NCache.js.map +1 -0
- package/dist/NConnectSigner.d.ts +50 -0
- package/dist/NConnectSigner.d.ts.map +1 -0
- package/dist/NConnectSigner.js +130 -0
- package/dist/NConnectSigner.js.map +1 -0
- package/dist/NIP05.d.ts +15 -0
- package/dist/NIP05.d.ts.map +1 -0
- package/dist/NIP05.js +40 -0
- package/dist/NIP05.js.map +1 -0
- package/dist/NIP50.d.ts +10 -0
- package/dist/NIP50.d.ts.map +1 -0
- package/dist/NIP50.js +26 -0
- package/dist/NIP50.js.map +1 -0
- package/dist/NIP98.d.ts +15 -0
- package/dist/NIP98.d.ts.map +1 -0
- package/dist/NIP98.js +71 -0
- package/dist/NIP98.js.map +1 -0
- package/dist/NKinds.d.ts +13 -0
- package/dist/NKinds.d.ts.map +1 -0
- package/dist/NKinds.js +27 -0
- package/dist/NKinds.js.map +1 -0
- package/dist/NPool.d.ts +91 -0
- package/dist/NPool.d.ts.map +1 -0
- package/dist/NPool.js +185 -0
- package/dist/NPool.js.map +1 -0
- package/dist/NRelay1.d.ts +80 -0
- package/dist/NRelay1.d.ts.map +1 -0
- package/dist/NRelay1.js +336 -0
- package/dist/NRelay1.js.map +1 -0
- package/dist/NSchema.d.ts +73 -0
- package/dist/NSchema.d.ts.map +1 -0
- package/dist/NSchema.js +215 -0
- package/dist/NSchema.js.map +1 -0
- package/dist/NSecSigner.d.ts +29 -0
- package/dist/NSecSigner.d.ts.map +1 -0
- package/dist/NSecSigner.js +52 -0
- package/dist/NSecSigner.js.map +1 -0
- package/dist/NSet.d.ts +76 -0
- package/dist/NSet.d.ts.map +1 -0
- package/dist/NSet.js +174 -0
- package/dist/NSet.js.map +1 -0
- package/dist/RelayError.d.ts +10 -0
- package/dist/RelayError.d.ts.map +1 -0
- package/dist/RelayError.js +23 -0
- package/dist/RelayError.js.map +1 -0
- package/dist/ln/LNURL.d.ts +55 -0
- package/dist/ln/LNURL.d.ts.map +1 -0
- package/dist/ln/LNURL.js +105 -0
- package/dist/ln/LNURL.js.map +1 -0
- package/dist/ln/mod.d.ts +4 -0
- package/dist/ln/mod.d.ts.map +1 -0
- package/dist/ln/mod.js +6 -0
- package/dist/ln/mod.js.map +1 -0
- package/dist/ln/types/LNURLCallback.d.ts +8 -0
- package/dist/ln/types/LNURLCallback.d.ts.map +1 -0
- package/dist/ln/types/LNURLCallback.js +3 -0
- package/dist/ln/types/LNURLCallback.js.map +1 -0
- package/dist/ln/types/LNURLDetails.d.ts +20 -0
- package/dist/ln/types/LNURLDetails.d.ts.map +1 -0
- package/dist/ln/types/LNURLDetails.js +3 -0
- package/dist/ln/types/LNURLDetails.js.map +1 -0
- package/dist/mod.d.ts +16 -0
- package/dist/mod.d.ts.map +1 -0
- package/dist/mod.js +32 -0
- package/dist/mod.js.map +1 -0
- package/dist/test/ErrorRelay.d.ts +21 -0
- package/dist/test/ErrorRelay.d.ts.map +1 -0
- package/dist/test/ErrorRelay.js +26 -0
- package/dist/test/ErrorRelay.js.map +1 -0
- package/dist/test/MockRelay.d.ts +20 -0
- package/dist/test/MockRelay.d.ts.map +1 -0
- package/dist/test/MockRelay.js +66 -0
- package/dist/test/MockRelay.js.map +1 -0
- package/dist/test/TestRelayServer.d.ts +25 -0
- package/dist/test/TestRelayServer.d.ts.map +1 -0
- package/dist/test/TestRelayServer.js +134 -0
- package/dist/test/TestRelayServer.js.map +1 -0
- package/dist/test/mod.d.ts +8 -0
- package/dist/test/mod.d.ts.map +1 -0
- package/dist/test/mod.js +28 -0
- package/dist/test/mod.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/uploaders/BlossomUploader.d.ts +26 -0
- package/dist/uploaders/BlossomUploader.d.ts.map +1 -0
- package/dist/uploaders/BlossomUploader.js +71 -0
- package/dist/uploaders/BlossomUploader.js.map +1 -0
- package/dist/uploaders/NostrBuildUploader.d.ts +24 -0
- package/dist/uploaders/NostrBuildUploader.d.ts.map +1 -0
- package/dist/uploaders/NostrBuildUploader.js +67 -0
- package/dist/uploaders/NostrBuildUploader.js.map +1 -0
- package/dist/uploaders/mod.d.ts +3 -0
- package/dist/uploaders/mod.d.ts.map +1 -0
- package/dist/uploaders/mod.js +8 -0
- package/dist/uploaders/mod.js.map +1 -0
- package/dist/utils/CircularSet.d.ts +13 -0
- package/dist/utils/CircularSet.d.ts.map +1 -0
- package/dist/utils/CircularSet.js +35 -0
- package/dist/utils/CircularSet.js.map +1 -0
- package/dist/utils/Machina.d.ts +36 -0
- package/dist/utils/Machina.d.ts.map +1 -0
- package/dist/utils/Machina.js +66 -0
- package/dist/utils/Machina.js.map +1 -0
- package/dist/utils/N64.d.ts +9 -0
- package/dist/utils/N64.d.ts.map +1 -0
- package/dist/utils/N64.js +23 -0
- package/dist/utils/N64.js.map +1 -0
- package/dist/utils/mod.d.ts +3 -0
- package/dist/utils/mod.d.ts.map +1 -0
- package/dist/utils/mod.js +8 -0
- package/dist/utils/mod.js.map +1 -0
- package/ln/LNURL.test.ts +87 -0
- package/ln/LNURL.ts +146 -0
- package/ln/mod.ts +4 -0
- package/ln/types/LNURLCallback.ts +7 -0
- package/ln/types/LNURLDetails.ts +19 -0
- package/mod.ts +16 -0
- package/package.json +23 -0
- package/test/ErrorRelay.test.ts +19 -0
- package/test/ErrorRelay.ts +40 -0
- package/test/MockRelay.test.ts +20 -0
- package/test/MockRelay.ts +92 -0
- package/test/TestRelayServer.ts +156 -0
- package/test/mod.ts +28 -0
- package/tsconfig.json +14 -0
- package/uploaders/BlossomUploader.test.ts +26 -0
- package/uploaders/BlossomUploader.ts +98 -0
- package/uploaders/NostrBuildUploader.test.ts +22 -0
- package/uploaders/NostrBuildUploader.ts +89 -0
- package/uploaders/mod.ts +2 -0
- package/utils/CircularSet.test.ts +15 -0
- package/utils/CircularSet.ts +34 -0
- package/utils/Machina.test.ts +91 -0
- package/utils/Machina.ts +66 -0
- package/utils/N64.test.ts +27 -0
- package/utils/N64.ts +23 -0
- package/utils/mod.ts +2 -0
package/dist/NCache.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// deno-lint-ignore-file require-await
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.NCache = void 0;
|
|
5
|
+
const lru_cache_1 = require("lru-cache");
|
|
6
|
+
const nostr_tools_1 = require("nostr-tools");
|
|
7
|
+
const NSet_1 = require("./NSet");
|
|
8
|
+
/**
|
|
9
|
+
* Nostr LRU cache based on [`npm:lru-cache`](https://www.npmjs.com/package/lru-cache).
|
|
10
|
+
* It implements both `NStore` and `NSet` interfaces.
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* // Accepts the options of `npm:lru-cache`:
|
|
14
|
+
* const cache = new NCache({ max: 1000 });
|
|
15
|
+
*
|
|
16
|
+
* // Events can be added like a regular `Set`:
|
|
17
|
+
* cache.add(event1);
|
|
18
|
+
* cache.add(event2);
|
|
19
|
+
*
|
|
20
|
+
* // Can be queried like `NStore`:
|
|
21
|
+
* const events = await cache.query([{ kinds: [1] }]);
|
|
22
|
+
*
|
|
23
|
+
* // Can be iterated like `NSet`:
|
|
24
|
+
* for (const event of cache) {
|
|
25
|
+
* console.log(event);
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
class NCache extends NSet_1.NSet {
|
|
30
|
+
constructor(...args) {
|
|
31
|
+
super(new lru_cache_1.LRUCache(...args));
|
|
32
|
+
}
|
|
33
|
+
async event(event) {
|
|
34
|
+
this.add(event);
|
|
35
|
+
}
|
|
36
|
+
async query(filters) {
|
|
37
|
+
const events = [];
|
|
38
|
+
for (const event of this) {
|
|
39
|
+
if ((0, nostr_tools_1.matchFilters)(filters, event)) {
|
|
40
|
+
this.cache.get(event.id);
|
|
41
|
+
events.push(event);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return events;
|
|
45
|
+
}
|
|
46
|
+
async remove(filters) {
|
|
47
|
+
for (const event of this) {
|
|
48
|
+
if ((0, nostr_tools_1.matchFilters)(filters, event)) {
|
|
49
|
+
this.delete(event);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async count(filters) {
|
|
54
|
+
const events = await this.query(filters);
|
|
55
|
+
return {
|
|
56
|
+
count: events.length,
|
|
57
|
+
approximate: false,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
[Symbol.toStringTag] = 'NCache';
|
|
61
|
+
}
|
|
62
|
+
exports.NCache = NCache;
|
|
63
|
+
//# sourceMappingURL=NCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NCache.js","sourceRoot":"","sources":["../NCache.ts"],"names":[],"mappings":";AAAA,sCAAsC;;;AAGtC,yCAAqC;AACrC,6CAA2C;AAE3C,iCAA8B;AAE9B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAO,SAAQ,WAAI;IACvB,YACE,GAAG,IAAgE;QAEnE,KAAK,CAAC,IAAI,oBAAQ,CAAqB,GAAG,IAAI,CAA4B,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAiB;QAC3B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAsB;QAChC,MAAM,MAAM,GAAiB,EAAE,CAAC;QAEhC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,IAAA,0BAAY,EAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAsB;QACjC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,IAAA,0BAAY,EAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAsB;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM;YACpB,WAAW,EAAE,KAAK;SACnB,CAAC;IACJ,CAAC;IAEQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC;CAC1C;AAEQ,wBAAM"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { NostrEvent, NostrSigner, NRelay } from '@nostrify/types';
|
|
2
|
+
/** Options for `NConnectSigner`. */
|
|
3
|
+
export interface NConnectSignerOpts {
|
|
4
|
+
/** Relay to facilitate connection. */
|
|
5
|
+
relay: NRelay;
|
|
6
|
+
/** Remote pubkey to sign as. */
|
|
7
|
+
pubkey: string;
|
|
8
|
+
/** Local signer to sign the request events. */
|
|
9
|
+
signer: NostrSigner;
|
|
10
|
+
/** Timeout for requests. */
|
|
11
|
+
timeout?: number;
|
|
12
|
+
/** Encryption to use when encrypting local messages. Decryption is automatic. */
|
|
13
|
+
encryption?: 'nip04' | 'nip44';
|
|
14
|
+
}
|
|
15
|
+
/** [NIP-46](https://github.com/nostr-protocol/nips/blob/master/46.md) remote signer through a relay. */
|
|
16
|
+
export declare class NConnectSigner implements NostrSigner {
|
|
17
|
+
private relay;
|
|
18
|
+
private pubkey;
|
|
19
|
+
private signer;
|
|
20
|
+
private timeout?;
|
|
21
|
+
private encryption;
|
|
22
|
+
constructor({ relay, pubkey, signer, timeout, encryption }: NConnectSignerOpts);
|
|
23
|
+
getPublicKey(): Promise<string>;
|
|
24
|
+
signEvent(event: Omit<NostrEvent, 'id' | 'pubkey' | 'sig'>): Promise<NostrEvent>;
|
|
25
|
+
getRelays(): Promise<Record<string, {
|
|
26
|
+
read: boolean;
|
|
27
|
+
write: boolean;
|
|
28
|
+
}>>;
|
|
29
|
+
readonly nip04: {
|
|
30
|
+
encrypt: (pubkey: string, plaintext: string) => Promise<string>;
|
|
31
|
+
decrypt: (pubkey: string, ciphertext: string) => Promise<string>;
|
|
32
|
+
};
|
|
33
|
+
readonly nip44: {
|
|
34
|
+
encrypt: (pubkey: string, plaintext: string) => Promise<string>;
|
|
35
|
+
decrypt: (pubkey: string, ciphertext: string) => Promise<string>;
|
|
36
|
+
};
|
|
37
|
+
/** Send a `connect` command to the relay. It should respond with `ack`. */
|
|
38
|
+
connect(secret?: string): Promise<string>;
|
|
39
|
+
/** Send a `ping` command to the signer. It should respond with `pong`. */
|
|
40
|
+
ping(): Promise<string>;
|
|
41
|
+
/** High-level RPC method. Returns the string result, or throws on error. */
|
|
42
|
+
private cmd;
|
|
43
|
+
/** Low-level send method. Deals directly with connect request/response. */
|
|
44
|
+
private send;
|
|
45
|
+
/** Local encrypt depending on settings. */
|
|
46
|
+
private encrypt;
|
|
47
|
+
/** Local decrypt depending on settings. */
|
|
48
|
+
private decrypt;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=NConnectSigner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NConnectSigner.d.ts","sourceRoot":"","sources":["../NConnectSigner.ts"],"names":[],"mappings":"AAIA,OAAO,EAA6C,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAI7G,oCAAoC;AACpC,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,MAAM,EAAE,WAAW,CAAC;IACpB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CAChC;AAED,wGAAwG;AACxG,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,UAAU,CAAoB;gBAGpC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAoB,EAAE,EAAE,kBAAkB;IASxE,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAI/B,SAAS,CACb,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,QAAQ,GAAG,KAAK,CAAC,GAC/C,OAAO,CAAC,UAAU,CAAC;IAKhB,SAAS,IAAI,OAAO,CACxB,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAClD;IAeD,QAAQ,CAAC,KAAK;0BACY,MAAM,aAAa,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;0BAI3C,MAAM,cAAc,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;MAGpE;IAEF,QAAQ,CAAC,KAAK;0BACY,MAAM,aAAa,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;0BAI3C,MAAM,cAAc,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;MAGpE;IAEF,2EAA2E;IACrE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAU/C,0EAA0E;IACpE,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAI7B,4EAA4E;YAC9D,GAAG;IAejB,2EAA2E;YAC7D,IAAI;IAgDlB,2CAA2C;YAC7B,OAAO;IASrB,2CAA2C;YAC7B,OAAO;CAQtB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// deno-lint-ignore-file require-await
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.NConnectSigner = void 0;
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
const NSchema_1 = require("./NSchema");
|
|
7
|
+
/** [NIP-46](https://github.com/nostr-protocol/nips/blob/master/46.md) remote signer through a relay. */
|
|
8
|
+
class NConnectSigner {
|
|
9
|
+
relay;
|
|
10
|
+
pubkey;
|
|
11
|
+
signer;
|
|
12
|
+
timeout;
|
|
13
|
+
encryption;
|
|
14
|
+
constructor({ relay, pubkey, signer, timeout, encryption = 'nip44' }) {
|
|
15
|
+
this.relay = relay;
|
|
16
|
+
this.pubkey = pubkey;
|
|
17
|
+
this.signer = signer;
|
|
18
|
+
this.timeout = timeout;
|
|
19
|
+
this.encryption = encryption;
|
|
20
|
+
}
|
|
21
|
+
async getPublicKey() {
|
|
22
|
+
return this.cmd('get_public_key', []);
|
|
23
|
+
}
|
|
24
|
+
async signEvent(event) {
|
|
25
|
+
const result = await this.cmd('sign_event', [JSON.stringify(event)]);
|
|
26
|
+
return NSchema_1.NSchema.json().pipe(NSchema_1.NSchema.event()).parse(result);
|
|
27
|
+
}
|
|
28
|
+
async getRelays() {
|
|
29
|
+
const result = await this.cmd('get_relays', []);
|
|
30
|
+
// @ts-expect-error This should be fine.
|
|
31
|
+
return NSchema_1.NSchema
|
|
32
|
+
.json()
|
|
33
|
+
.pipe(zod_1.z.record(zod_1.z.string(), zod_1.z.object({ read: zod_1.z.boolean(), write: zod_1.z.boolean() })))
|
|
34
|
+
.parse(result);
|
|
35
|
+
}
|
|
36
|
+
nip04 = {
|
|
37
|
+
encrypt: async (pubkey, plaintext) => {
|
|
38
|
+
return this.cmd('nip04_encrypt', [pubkey, plaintext]);
|
|
39
|
+
},
|
|
40
|
+
decrypt: async (pubkey, ciphertext) => {
|
|
41
|
+
return this.cmd('nip04_decrypt', [pubkey, ciphertext]);
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
nip44 = {
|
|
45
|
+
encrypt: async (pubkey, plaintext) => {
|
|
46
|
+
return this.cmd('nip44_encrypt', [pubkey, plaintext]);
|
|
47
|
+
},
|
|
48
|
+
decrypt: async (pubkey, ciphertext) => {
|
|
49
|
+
return this.cmd('nip44_decrypt', [pubkey, ciphertext]);
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
/** Send a `connect` command to the relay. It should respond with `ack`. */
|
|
53
|
+
async connect(secret) {
|
|
54
|
+
const params = [this.pubkey];
|
|
55
|
+
if (secret) {
|
|
56
|
+
params.push(secret);
|
|
57
|
+
}
|
|
58
|
+
return this.cmd('connect', params);
|
|
59
|
+
}
|
|
60
|
+
/** Send a `ping` command to the signer. It should respond with `pong`. */
|
|
61
|
+
async ping() {
|
|
62
|
+
return this.cmd('ping', []);
|
|
63
|
+
}
|
|
64
|
+
/** High-level RPC method. Returns the string result, or throws on error. */
|
|
65
|
+
async cmd(method, params) {
|
|
66
|
+
const signal = typeof this.timeout === 'number' ? AbortSignal.timeout(this.timeout) : undefined;
|
|
67
|
+
const { result, error } = await this.send({ id: crypto.randomUUID(), method, params }, { signal });
|
|
68
|
+
if (error) {
|
|
69
|
+
throw new Error(error);
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
/** Low-level send method. Deals directly with connect request/response. */
|
|
74
|
+
async send(request, opts = {}) {
|
|
75
|
+
const { signal } = opts;
|
|
76
|
+
const event = await this.signer.signEvent({
|
|
77
|
+
kind: 24133,
|
|
78
|
+
content: await this.encrypt(this.pubkey, JSON.stringify(request)),
|
|
79
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
80
|
+
tags: [['p', this.pubkey]],
|
|
81
|
+
});
|
|
82
|
+
const local = await this.signer.getPublicKey();
|
|
83
|
+
const req = this.relay.req([{ kinds: [24133], authors: [this.pubkey], '#p': [local] }], { signal });
|
|
84
|
+
// Ensure the REQ is opened before sending the EVENT
|
|
85
|
+
const promise = new Promise((resolve, reject) => {
|
|
86
|
+
(async () => {
|
|
87
|
+
try {
|
|
88
|
+
for await (const msg of req) {
|
|
89
|
+
if (msg[0] === 'CLOSED')
|
|
90
|
+
throw new Error('Subscription closed');
|
|
91
|
+
if (msg[0] === 'EVENT') {
|
|
92
|
+
const event = msg[2];
|
|
93
|
+
const decrypted = await this.decrypt(this.pubkey, event.content);
|
|
94
|
+
const response = NSchema_1.NSchema.json().pipe(NSchema_1.NSchema.connectResponse()).parse(decrypted);
|
|
95
|
+
if (response.id === request.id) {
|
|
96
|
+
resolve(response);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
reject(error);
|
|
104
|
+
}
|
|
105
|
+
})();
|
|
106
|
+
});
|
|
107
|
+
await this.relay.event(event, { signal });
|
|
108
|
+
return promise;
|
|
109
|
+
}
|
|
110
|
+
/** Local encrypt depending on settings. */
|
|
111
|
+
async encrypt(pubkey, plaintext) {
|
|
112
|
+
switch (this.encryption) {
|
|
113
|
+
case 'nip04':
|
|
114
|
+
return this.signer.nip04.encrypt(pubkey, plaintext);
|
|
115
|
+
case 'nip44':
|
|
116
|
+
return this.signer.nip44.encrypt(pubkey, plaintext);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** Local decrypt depending on settings. */
|
|
120
|
+
async decrypt(pubkey, ciphertext) {
|
|
121
|
+
switch (this.encryption) {
|
|
122
|
+
case 'nip04':
|
|
123
|
+
return this.signer.nip04.decrypt(pubkey, ciphertext);
|
|
124
|
+
case 'nip44':
|
|
125
|
+
return this.signer.nip44.decrypt(pubkey, ciphertext);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.NConnectSigner = NConnectSigner;
|
|
130
|
+
//# sourceMappingURL=NConnectSigner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NConnectSigner.js","sourceRoot":"","sources":["../NConnectSigner.ts"],"names":[],"mappings":"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"}
|
package/dist/NIP05.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { NProfilePointer } from '@nostrify/types';
|
|
2
|
+
interface LookupOpts {
|
|
3
|
+
fetch?: typeof fetch;
|
|
4
|
+
signal?: AbortSignal;
|
|
5
|
+
}
|
|
6
|
+
export declare class NIP05 {
|
|
7
|
+
/** NIP-05 value regex. */
|
|
8
|
+
static regex(): RegExp;
|
|
9
|
+
/** Nostr pubkey with relays object. */
|
|
10
|
+
private static profilePointerSchema;
|
|
11
|
+
/** Resolve NIP-05 name to a profile pointer. */
|
|
12
|
+
static lookup(nip05: string, opts?: LookupOpts): Promise<NProfilePointer>;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=NIP05.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NIP05.d.ts","sourceRoot":"","sources":["../NIP05.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIlD,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,qBAAa,KAAK;IAChB,0BAA0B;IAC1B,MAAM,CAAC,KAAK,IAAI,MAAM;IAItB,uCAAuC;IACvC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAQnC,gDAAgD;WACnC,MAAM,CACjB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC,eAAe,CAAC;CAuB5B"}
|
package/dist/NIP05.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NIP05 = void 0;
|
|
4
|
+
const NSchema_1 = require("./NSchema");
|
|
5
|
+
class NIP05 {
|
|
6
|
+
/** NIP-05 value regex. */
|
|
7
|
+
static regex() {
|
|
8
|
+
return /^(?:([\w.+-]+)@)?([\w.-]+)$/;
|
|
9
|
+
}
|
|
10
|
+
/** Nostr pubkey with relays object. */
|
|
11
|
+
static profilePointerSchema() {
|
|
12
|
+
// @ts-expect-error This should be fine.
|
|
13
|
+
return NSchema_1.z.object({
|
|
14
|
+
pubkey: NSchema_1.NSchema.id(),
|
|
15
|
+
relays: NSchema_1.NSchema.relayUrl().array().optional(),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/** Resolve NIP-05 name to a profile pointer. */
|
|
19
|
+
static async lookup(nip05, opts) {
|
|
20
|
+
const { fetch = globalThis.fetch.bind(globalThis), signal } = opts ?? {};
|
|
21
|
+
const match = nip05.match(NIP05.regex());
|
|
22
|
+
if (!match)
|
|
23
|
+
throw new Error(`NIP-05: invalid name ${nip05}`);
|
|
24
|
+
const [_, name = '_', domain] = match;
|
|
25
|
+
const url = new URL('/.well-known/nostr.json', `https://${domain}/`);
|
|
26
|
+
url.searchParams.set('name', name);
|
|
27
|
+
const response = await fetch(url, { signal });
|
|
28
|
+
const json = await response.json();
|
|
29
|
+
try {
|
|
30
|
+
const pubkey = json.names[name];
|
|
31
|
+
const relays = json.relays?.[pubkey];
|
|
32
|
+
return NIP05.profilePointerSchema().parse({ pubkey, relays });
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
throw new Error(`NIP-05: no match for ${nip05}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.NIP05 = NIP05;
|
|
40
|
+
//# sourceMappingURL=NIP05.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NIP05.js","sourceRoot":"","sources":["../NIP05.ts"],"names":[],"mappings":";;;AAEA,uCAA4C;AAO5C,MAAa,KAAK;IAChB,0BAA0B;IAC1B,MAAM,CAAC,KAAK;QACV,OAAO,6BAA6B,CAAC;IACvC,CAAC;IAED,uCAAuC;IAC/B,MAAM,CAAC,oBAAoB;QACjC,wCAAwC;QACxC,OAAO,WAAC,CAAC,MAAM,CAAC;YACd,MAAM,EAAE,iBAAC,CAAC,EAAE,EAAE;YACd,MAAM,EAAE,iBAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;SACxC,CAAC,CAAC;IACL,CAAC;IAED,gDAAgD;IAChD,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,KAAa,EACb,IAAiB;QAEjB,MAAM,EAAE,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;QAEzE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAC;QAE7D,MAAM,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;QAEtC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,yBAAyB,EAAE,WAAW,MAAM,GAAG,CAAC,CAAC;QACrE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAEnC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;YAErC,OAAO,KAAK,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;CACF;AA1CD,sBA0CC"}
|
package/dist/NIP50.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type SearchToken = string | {
|
|
2
|
+
key: string;
|
|
3
|
+
value: string;
|
|
4
|
+
};
|
|
5
|
+
/** [NIP-50](https://github.com/nostr-protocol/nips/blob/master/50.md) search functionality. */
|
|
6
|
+
export declare class NIP50 {
|
|
7
|
+
static parseInput(input: string): SearchToken[];
|
|
8
|
+
}
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=NIP50.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NIP50.d.ts","sourceRoot":"","sources":["../NIP50.ts"],"names":[],"mappings":"AAAA,KAAK,WAAW,GAAG,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,+FAA+F;AAC/F,qBAAa,KAAK;IAChB,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE;CAmBhD"}
|
package/dist/NIP50.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NIP50 = void 0;
|
|
4
|
+
/** [NIP-50](https://github.com/nostr-protocol/nips/blob/master/50.md) search functionality. */
|
|
5
|
+
class NIP50 {
|
|
6
|
+
static parseInput(input) {
|
|
7
|
+
const regex = /(\B-\w+:[^\s"]+)|(\b\w+:[^\s"]+)|(".*?")|(\S+)/g;
|
|
8
|
+
const tokens = [];
|
|
9
|
+
let match;
|
|
10
|
+
while ((match = regex.exec(input)) !== null) {
|
|
11
|
+
if (match[1] || match[2]) {
|
|
12
|
+
const [key, ...values] = (match[1] || match[2]).split(':');
|
|
13
|
+
tokens.push({ key, value: values.join(':') });
|
|
14
|
+
}
|
|
15
|
+
else if (match[3]) {
|
|
16
|
+
tokens.push(match[3].replace(/"/g, ''));
|
|
17
|
+
}
|
|
18
|
+
else if (match[4]) {
|
|
19
|
+
tokens.push(match[4]);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return tokens;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.NIP50 = NIP50;
|
|
26
|
+
//# sourceMappingURL=NIP50.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NIP50.js","sourceRoot":"","sources":["../NIP50.ts"],"names":[],"mappings":";;;AAEA,+FAA+F;AAC/F,MAAa,KAAK;IAChB,MAAM,CAAC,UAAU,CAAC,KAAa;QAC7B,MAAM,KAAK,GAAG,iDAAiD,CAAC;QAEhE,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,IAAI,KAA6B,CAAC;QAElC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC3D,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChD,CAAC;iBAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1C,CAAC;iBAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AApBD,sBAoBC"}
|
package/dist/NIP98.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { NostrEvent } from '@nostrify/types';
|
|
2
|
+
/** [NIP-98](https://github.com/nostr-protocol/nips/blob/master/98.md) HTTP auth. */
|
|
3
|
+
export declare class NIP98 {
|
|
4
|
+
/** Generate an auth event template from a Request. */
|
|
5
|
+
static template(request: Request, opts?: {
|
|
6
|
+
validatePayload?: boolean;
|
|
7
|
+
}): Promise<Omit<NostrEvent, 'id' | 'pubkey' | 'sig'>>;
|
|
8
|
+
/** Compare the auth event with the request, throwing a human-readable error if validation fails. */
|
|
9
|
+
static verify(request: Request, opts?: {
|
|
10
|
+
maxAge?: number;
|
|
11
|
+
validatePayload?: boolean;
|
|
12
|
+
verifyEvent?: (event: NostrEvent) => boolean;
|
|
13
|
+
}): Promise<NostrEvent>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=NIP98.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NIP98.d.ts","sourceRoot":"","sources":["../NIP98.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAM7C,oFAAoF;AACpF,qBAAa,KAAK;IAChB,sDAAsD;WACzC,QAAQ,CACnB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACnC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,QAAQ,GAAG,KAAK,CAAC,CAAC;IA0BrD,oGAAoG;WACvF,MAAM,CACjB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC;KAC9C,GACA,OAAO,CAAC,UAAU,CAAC;CAkDvB"}
|
package/dist/NIP98.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NIP98 = void 0;
|
|
4
|
+
const hex_1 = require("@std/encoding/hex");
|
|
5
|
+
const nostr_tools_1 = require("nostr-tools");
|
|
6
|
+
const N64_1 = require("./utils/N64");
|
|
7
|
+
/** [NIP-98](https://github.com/nostr-protocol/nips/blob/master/98.md) HTTP auth. */
|
|
8
|
+
class NIP98 {
|
|
9
|
+
/** Generate an auth event template from a Request. */
|
|
10
|
+
static async template(request, opts) {
|
|
11
|
+
const { validatePayload = ['POST', 'PUT', 'PATCH'].includes(request.method), } = opts ?? {};
|
|
12
|
+
const { method, url } = request;
|
|
13
|
+
const tags = [
|
|
14
|
+
['method', method],
|
|
15
|
+
['u', url],
|
|
16
|
+
];
|
|
17
|
+
if (validatePayload) {
|
|
18
|
+
const buffer = await request.clone().arrayBuffer();
|
|
19
|
+
const digest = await crypto.subtle.digest('SHA-256', buffer);
|
|
20
|
+
tags.push(['payload', (0, hex_1.encodeHex)(digest)]);
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
kind: 27235,
|
|
24
|
+
content: '',
|
|
25
|
+
tags,
|
|
26
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** Compare the auth event with the request, throwing a human-readable error if validation fails. */
|
|
30
|
+
static async verify(request, opts) {
|
|
31
|
+
const { maxAge = 60_000, validatePayload = ['POST', 'PUT', 'PATCH'].includes(request.method), verifyEvent = nostr_tools_1.verifyEvent, } = opts ?? {};
|
|
32
|
+
const header = request.headers.get('authorization');
|
|
33
|
+
if (!header) {
|
|
34
|
+
throw new Error('Missing Nostr authorization header');
|
|
35
|
+
}
|
|
36
|
+
const token = header.match(/^Nostr (.+)$/)?.[1];
|
|
37
|
+
if (!token) {
|
|
38
|
+
throw new Error('Missing Nostr authorization token');
|
|
39
|
+
}
|
|
40
|
+
const event = N64_1.N64.decodeEvent(token);
|
|
41
|
+
if (!verifyEvent(event)) {
|
|
42
|
+
throw new Error('Event signature is invalid');
|
|
43
|
+
}
|
|
44
|
+
const age = Date.now() - (event.created_at * 1_000);
|
|
45
|
+
const u = event.tags.find(([name]) => name === 'u')?.[1];
|
|
46
|
+
const method = event.tags.find(([name]) => name === 'method')?.[1];
|
|
47
|
+
const payload = event.tags.find(([name]) => name === 'payload')?.[1];
|
|
48
|
+
if (event.kind !== 27235) {
|
|
49
|
+
throw new Error('Event must be kind 27235');
|
|
50
|
+
}
|
|
51
|
+
if (u !== request.url) {
|
|
52
|
+
throw new Error('Event URL does not match request URL');
|
|
53
|
+
}
|
|
54
|
+
if (method !== request.method) {
|
|
55
|
+
throw new Error('Event method does not match HTTP request method');
|
|
56
|
+
}
|
|
57
|
+
if (age >= maxAge) {
|
|
58
|
+
throw new Error('Event expired');
|
|
59
|
+
}
|
|
60
|
+
if (validatePayload && payload !== undefined) {
|
|
61
|
+
const buffer = await request.clone().arrayBuffer();
|
|
62
|
+
const digest = await crypto.subtle.digest('SHA-256', buffer);
|
|
63
|
+
if ((0, hex_1.encodeHex)(digest) !== payload) {
|
|
64
|
+
throw new Error('Event payload does not match request body');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return event;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.NIP98 = NIP98;
|
|
71
|
+
//# sourceMappingURL=NIP98.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NIP98.js","sourceRoot":"","sources":["../NIP98.ts"],"names":[],"mappings":"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"}
|
package/dist/NKinds.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class NKinds {
|
|
2
|
+
/** Events are **regular**, which means they're all expected to be stored by relays. */
|
|
3
|
+
static regular(kind: number): boolean;
|
|
4
|
+
/** Events are **replaceable**, which means that, for each combination of `pubkey` and `kind`, only the latest event is expected to (SHOULD) be stored by relays, older versions are expected to be discarded. */
|
|
5
|
+
static replaceable(kind: number): boolean;
|
|
6
|
+
/** Events are **ephemeral**, which means they are not expected to be stored by relays. */
|
|
7
|
+
static ephemeral(kind: number): boolean;
|
|
8
|
+
/** Events are **addressable**, which means that, for each combination of `pubkey`, `kind` and the `d` tag, only the latest event is expected to be stored by relays, older versions are expected to be discarded. */
|
|
9
|
+
static addressable(kind: number): boolean;
|
|
10
|
+
/** @deprecated Use `NKinds.addressable()` instead. */
|
|
11
|
+
static parameterizedReplaceable(kind: number): boolean;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=NKinds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NKinds.d.ts","sourceRoot":"","sources":["../NKinds.ts"],"names":[],"mappings":"AAAA,qBAAa,MAAM;IACjB,uFAAuF;IACvF,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrC,iNAAiN;IACjN,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIzC,0FAA0F;IAC1F,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIvC,qNAAqN;IACrN,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIzC,sDAAsD;IACtD,MAAM,CAAC,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAGvD"}
|
package/dist/NKinds.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NKinds = void 0;
|
|
4
|
+
class NKinds {
|
|
5
|
+
/** Events are **regular**, which means they're all expected to be stored by relays. */
|
|
6
|
+
static regular(kind) {
|
|
7
|
+
return (1000 <= kind && kind < 10000) || [1, 2, 4, 5, 6, 7, 8, 16, 40, 41, 42, 43, 44].includes(kind);
|
|
8
|
+
}
|
|
9
|
+
/** Events are **replaceable**, which means that, for each combination of `pubkey` and `kind`, only the latest event is expected to (SHOULD) be stored by relays, older versions are expected to be discarded. */
|
|
10
|
+
static replaceable(kind) {
|
|
11
|
+
return (10000 <= kind && kind < 20000) || [0, 3].includes(kind);
|
|
12
|
+
}
|
|
13
|
+
/** Events are **ephemeral**, which means they are not expected to be stored by relays. */
|
|
14
|
+
static ephemeral(kind) {
|
|
15
|
+
return 20000 <= kind && kind < 30000;
|
|
16
|
+
}
|
|
17
|
+
/** Events are **addressable**, which means that, for each combination of `pubkey`, `kind` and the `d` tag, only the latest event is expected to be stored by relays, older versions are expected to be discarded. */
|
|
18
|
+
static addressable(kind) {
|
|
19
|
+
return 30000 <= kind && kind < 40000;
|
|
20
|
+
}
|
|
21
|
+
/** @deprecated Use `NKinds.addressable()` instead. */
|
|
22
|
+
static parameterizedReplaceable(kind) {
|
|
23
|
+
return NKinds.addressable(kind);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.NKinds = NKinds;
|
|
27
|
+
//# sourceMappingURL=NKinds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NKinds.js","sourceRoot":"","sources":["../NKinds.ts"],"names":[],"mappings":";;;AAAA,MAAa,MAAM;IACjB,uFAAuF;IACvF,MAAM,CAAC,OAAO,CAAC,IAAY;QACzB,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxG,CAAC;IAED,iNAAiN;IACjN,MAAM,CAAC,WAAW,CAAC,IAAY;QAC7B,OAAO,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,0FAA0F;IAC1F,MAAM,CAAC,SAAS,CAAC,IAAY;QAC3B,OAAO,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC;IACvC,CAAC;IAED,qNAAqN;IACrN,MAAM,CAAC,WAAW,CAAC,IAAY;QAC7B,OAAO,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC;IACvC,CAAC;IAED,sDAAsD;IACtD,MAAM,CAAC,wBAAwB,CAAC,IAAY;QAC1C,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;CACF;AAzBD,wBAyBC"}
|
package/dist/NPool.d.ts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { NostrEvent, NostrFilter, NostrRelayCLOSED, NostrRelayEOSE, NostrRelayEVENT, NRelay } from '@nostrify/types';
|
|
2
|
+
export interface NPoolOpts<T extends NRelay> {
|
|
3
|
+
/** Creates an `NRelay` instance for the given URL. */
|
|
4
|
+
open(url: string): T;
|
|
5
|
+
/** Determines the relays to use for making `REQ`s to the given filters. To support the Outbox model, it should analyze the `authors` field of the filters. */
|
|
6
|
+
reqRouter(filters: NostrFilter[]): ReadonlyMap<string, NostrFilter[]> | Promise<ReadonlyMap<string, NostrFilter[]>>;
|
|
7
|
+
/** Determines the relays to use for publishing the given event. To support the Outbox model, it should analyze the `pubkey` field of the event. */
|
|
8
|
+
eventRouter(event: NostrEvent): string[] | Promise<string[]>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* The `NPool` class is a `NRelay` implementation for connecting to multiple relays.
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* const pool = new NPool({
|
|
15
|
+
* open: (url) => new NRelay1(url),
|
|
16
|
+
* reqRouter: async (filters) => new Map([
|
|
17
|
+
* ['wss://relay1.mostr.pub', filters],
|
|
18
|
+
* ['wss://relay2.mostr.pub', filters],
|
|
19
|
+
* ]),
|
|
20
|
+
* eventRouter: async (event) => ['wss://relay1.mostr.pub', 'wss://relay2.mostr.pub'],
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* // Now you can use the pool like a regular relay.
|
|
24
|
+
* for await (const msg of pool.req([{ kinds: [1] }])) {
|
|
25
|
+
* if (msg[0] === 'EVENT') console.log(msg[2]);
|
|
26
|
+
* if (msg[0] === 'EOSE') break;
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* This class is designed with the Outbox model in mind.
|
|
31
|
+
* Instead of passing relay URLs into each method, you pass functions into the contructor that statically-analyze filters and events to determine which relays to use for requesting and publishing events.
|
|
32
|
+
* If a relay wasn't already connected, it will be opened automatically.
|
|
33
|
+
* Defining `open` will also let you use any relay implementation, such as `NRelay1`.
|
|
34
|
+
*
|
|
35
|
+
* Note that `pool.req` may stream duplicate events, while `pool.query` will correctly process replaceable events and deletions within the event set before returning them.
|
|
36
|
+
*
|
|
37
|
+
* `pool.req` will only emit an `EOSE` when all relays in its set have emitted an `EOSE`, and likewise for `CLOSED`.
|
|
38
|
+
*/
|
|
39
|
+
export declare class NPool<T extends NRelay = NRelay> implements NRelay {
|
|
40
|
+
private opts;
|
|
41
|
+
private _relays;
|
|
42
|
+
constructor(opts: NPoolOpts<T>);
|
|
43
|
+
/** Get or create a relay instance for the given URL. */
|
|
44
|
+
relay(url: string): T;
|
|
45
|
+
/** Returns a new pool instance that uses the given relays. Connections are shared with the original pool. */
|
|
46
|
+
group(urls: string[]): NPool<T>;
|
|
47
|
+
get relays(): ReadonlyMap<string, T>;
|
|
48
|
+
/**
|
|
49
|
+
* Sends a `REQ` to relays based on the configured `reqRouter`.
|
|
50
|
+
*
|
|
51
|
+
* `EVENT` messages from the selected relays are yielded.
|
|
52
|
+
* `EOSE` and `CLOSE` messages are only yielded when all relays have emitted them.
|
|
53
|
+
*
|
|
54
|
+
* Deduplication of `EVENT` messages is attempted, so that each event is only yielded once.
|
|
55
|
+
* A circular set of 1000 is used to track seen event IDs, so it's possible that very
|
|
56
|
+
* long-running subscriptions (with over 1000 results) may yield duplicate events.
|
|
57
|
+
*/
|
|
58
|
+
req(filters: NostrFilter[], opts?: {
|
|
59
|
+
signal?: AbortSignal;
|
|
60
|
+
relays?: string[];
|
|
61
|
+
}): AsyncIterable<NostrRelayEVENT | NostrRelayEOSE | NostrRelayCLOSED>;
|
|
62
|
+
/**
|
|
63
|
+
* Events are sent to relays according to the `eventRouter`.
|
|
64
|
+
* Returns a fulfilled promise if ANY relay accepted the event,
|
|
65
|
+
* or a rejected promise if ALL relays rejected or failed to publish the event.
|
|
66
|
+
*/
|
|
67
|
+
event(event: NostrEvent, opts?: {
|
|
68
|
+
signal?: AbortSignal;
|
|
69
|
+
relays?: string[];
|
|
70
|
+
}): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* This method calls `.req` internally and then post-processes the results.
|
|
73
|
+
* Please read the definition of `.req`.
|
|
74
|
+
*
|
|
75
|
+
* - The strategy is to seek regular events quickly, and to wait to find the latest versions of replaceable events.
|
|
76
|
+
* - Filters for replaceable events will wait for all relays to `EOSE` (or `CLOSE`, or for the signal to be aborted) to ensure the latest event versions are retrieved.
|
|
77
|
+
* - Filters for regular events will stop as soon as the filters are fulfilled.
|
|
78
|
+
* - Events are deduplicated, sorted, and only the latest version of replaceable events is kept.
|
|
79
|
+
* - If the signal is aborted, this method will return partial results instead of throwing.
|
|
80
|
+
*
|
|
81
|
+
* To implement a custom strategy, call `.req` directly.
|
|
82
|
+
*/
|
|
83
|
+
query(filters: NostrFilter[], opts?: {
|
|
84
|
+
signal?: AbortSignal;
|
|
85
|
+
relays?: string[];
|
|
86
|
+
}): Promise<NostrEvent[]>;
|
|
87
|
+
/** Close all the relays in the pool. */
|
|
88
|
+
close(): Promise<void>;
|
|
89
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=NPool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NPool.d.ts","sourceRoot":"","sources":["../NPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAOrH,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,MAAM;IACzC,sDAAsD;IACtD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC;IACrB,8JAA8J;IAC9J,SAAS,CACP,OAAO,EAAE,WAAW,EAAE,GAEpB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,GAClC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAChD,mJAAmJ;IACnJ,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC9D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,KAAK,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,YAAW,MAAM;IAGjD,OAAO,CAAC,IAAI;IAFxB,OAAO,CAAC,OAAO,CAAwB;gBAEnB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAEtC,wDAAwD;IACjD,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC;IAY5B,6GAA6G;IACtG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;IAQtC,IAAW,MAAM,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAE1C;IAED;;;;;;;;;OASG;IACI,GAAG,CACR,OAAO,EAAE,WAAW,EAAE,EACtB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GACjD,aAAa,CAAC,eAAe,GAAG,cAAc,GAAG,gBAAgB,CAAC;IAwDrE;;;;OAIG;IACG,KAAK,CACT,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GACjD,OAAO,CAAC,IAAI,CAAC;IAahB;;;;;;;;;;;OAWG;IACG,KAAK,CACT,OAAO,EAAE,WAAW,EAAE,EACtB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GACjD,OAAO,CAAC,UAAU,EAAE,CAAC;IA4BxB,wCAAwC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7C"}
|