nostr-core 0.3.0 → 0.6.0
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/dist/index.d.ts +88 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +93 -3
- package/dist/index.js.map +1 -1
- package/dist/lnurl.d.ts +161 -0
- package/dist/lnurl.d.ts.map +1 -0
- package/dist/lnurl.js +343 -0
- package/dist/lnurl.js.map +1 -0
- package/dist/nip02.d.ts +27 -0
- package/dist/nip02.d.ts.map +1 -0
- package/dist/nip02.js +55 -0
- package/dist/nip02.js.map +1 -0
- package/dist/nip05.d.ts +24 -0
- package/dist/nip05.d.ts.map +1 -0
- package/dist/nip05.js +57 -0
- package/dist/nip05.js.map +1 -0
- package/dist/nip06.d.ts +26 -0
- package/dist/nip06.d.ts.map +1 -0
- package/dist/nip06.js +49 -0
- package/dist/nip06.js.map +1 -0
- package/dist/nip07.d.ts +8 -0
- package/dist/nip07.d.ts.map +1 -1
- package/dist/nip07.js +24 -0
- package/dist/nip07.js.map +1 -1
- package/dist/nip09.d.ts +34 -0
- package/dist/nip09.d.ts.map +1 -0
- package/dist/nip09.js +66 -0
- package/dist/nip09.js.map +1 -0
- package/dist/nip10.d.ts +40 -0
- package/dist/nip10.d.ts.map +1 -0
- package/dist/nip10.js +69 -0
- package/dist/nip10.js.map +1 -0
- package/dist/nip11.d.ts +41 -0
- package/dist/nip11.d.ts.map +1 -0
- package/dist/nip11.js +38 -0
- package/dist/nip11.js.map +1 -0
- package/dist/nip13.d.ts +26 -0
- package/dist/nip13.d.ts.map +1 -0
- package/dist/nip13.js +75 -0
- package/dist/nip13.js.map +1 -0
- package/dist/nip18.d.ts +28 -0
- package/dist/nip18.d.ts.map +1 -0
- package/dist/nip18.js +66 -0
- package/dist/nip18.js.map +1 -0
- package/dist/nip21.d.ts +14 -0
- package/dist/nip21.d.ts.map +1 -0
- package/dist/nip21.js +24 -0
- package/dist/nip21.js.map +1 -0
- package/dist/nip22.d.ts +26 -0
- package/dist/nip22.d.ts.map +1 -0
- package/dist/nip22.js +109 -0
- package/dist/nip22.js.map +1 -0
- package/dist/nip23.d.ts +24 -0
- package/dist/nip23.d.ts.map +1 -0
- package/dist/nip23.js +70 -0
- package/dist/nip23.js.map +1 -0
- package/dist/nip24.d.ts +31 -0
- package/dist/nip24.d.ts.map +1 -0
- package/dist/nip24.js +75 -0
- package/dist/nip24.js.map +1 -0
- package/dist/nip25.d.ts +32 -0
- package/dist/nip25.d.ts.map +1 -0
- package/dist/nip25.js +54 -0
- package/dist/nip25.js.map +1 -0
- package/dist/nip27.d.ts +16 -0
- package/dist/nip27.d.ts.map +1 -0
- package/dist/nip27.js +44 -0
- package/dist/nip27.js.map +1 -0
- package/dist/nip28.d.ts +52 -0
- package/dist/nip28.d.ts.map +1 -0
- package/dist/nip28.js +118 -0
- package/dist/nip28.js.map +1 -0
- package/dist/nip29.d.ts +60 -0
- package/dist/nip29.d.ts.map +1 -0
- package/dist/nip29.js +122 -0
- package/dist/nip29.js.map +1 -0
- package/dist/nip30.d.ts +18 -0
- package/dist/nip30.d.ts.map +1 -0
- package/dist/nip30.js +24 -0
- package/dist/nip30.js.map +1 -0
- package/dist/nip31.d.ts +11 -0
- package/dist/nip31.d.ts.map +1 -0
- package/dist/nip31.js +15 -0
- package/dist/nip31.js.map +1 -0
- package/dist/nip36.d.ts +14 -0
- package/dist/nip36.d.ts.map +1 -0
- package/dist/nip36.js +24 -0
- package/dist/nip36.js.map +1 -0
- package/dist/nip40.d.ts +14 -0
- package/dist/nip40.d.ts.map +1 -0
- package/dist/nip40.js +26 -0
- package/dist/nip40.js.map +1 -0
- package/dist/nip42.d.ts +20 -0
- package/dist/nip42.d.ts.map +1 -0
- package/dist/nip42.js +38 -0
- package/dist/nip42.js.map +1 -0
- package/dist/nip46.d.ts +17 -4
- package/dist/nip46.d.ts.map +1 -1
- package/dist/nip46.js +78 -38
- package/dist/nip46.js.map +1 -1
- package/dist/nip48.d.ts +23 -0
- package/dist/nip48.d.ts.map +1 -0
- package/dist/nip48.js +30 -0
- package/dist/nip48.js.map +1 -0
- package/dist/nip50.d.ts +23 -0
- package/dist/nip50.d.ts.map +1 -0
- package/dist/nip50.js +47 -0
- package/dist/nip50.js.map +1 -0
- package/dist/nip51.d.ts +57 -0
- package/dist/nip51.d.ts.map +1 -0
- package/dist/nip51.js +118 -0
- package/dist/nip51.js.map +1 -0
- package/dist/nip56.d.ts +28 -0
- package/dist/nip56.d.ts.map +1 -0
- package/dist/nip56.js +60 -0
- package/dist/nip56.js.map +1 -0
- package/dist/nip57.d.ts +48 -0
- package/dist/nip57.d.ts.map +1 -0
- package/dist/nip57.js +140 -0
- package/dist/nip57.js.map +1 -0
- package/dist/nip58.d.ts +82 -0
- package/dist/nip58.d.ts.map +1 -0
- package/dist/nip58.js +195 -0
- package/dist/nip58.js.map +1 -0
- package/dist/nip59.js +1 -1
- package/dist/nip65.d.ts +28 -0
- package/dist/nip65.d.ts.map +1 -0
- package/dist/nip65.js +83 -0
- package/dist/nip65.js.map +1 -0
- package/dist/nip98.d.ts +24 -0
- package/dist/nip98.d.ts.map +1 -0
- package/dist/nip98.js +68 -0
- package/dist/nip98.js.map +1 -0
- package/dist/relay.d.ts +2 -0
- package/dist/relay.d.ts.map +1 -1
- package/dist/relay.js +20 -0
- package/dist/relay.js.map +1 -1
- package/dist/signer.d.ts +4 -0
- package/dist/signer.d.ts.map +1 -1
- package/dist/signer.js +11 -0
- package/dist/signer.js.map +1 -1
- package/package.json +33 -4
package/dist/nip07.js
CHANGED
|
@@ -66,6 +66,30 @@ export class Nip07Signer {
|
|
|
66
66
|
}
|
|
67
67
|
},
|
|
68
68
|
};
|
|
69
|
+
nip44 = {
|
|
70
|
+
encrypt: async (pubkey, plaintext) => {
|
|
71
|
+
const nip44 = this.ext.nip44;
|
|
72
|
+
if (!nip44)
|
|
73
|
+
throw new Nip07Error('Extension does not support NIP-44', 'NIP07_NIP44_UNSUPPORTED');
|
|
74
|
+
try {
|
|
75
|
+
return await nip44.encrypt(pubkey, plaintext);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
throw new Nip07Error(`nip44.encrypt failed: ${err.message}`);
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
decrypt: async (pubkey, ciphertext) => {
|
|
82
|
+
const nip44 = this.ext.nip44;
|
|
83
|
+
if (!nip44)
|
|
84
|
+
throw new Nip07Error('Extension does not support NIP-44', 'NIP07_NIP44_UNSUPPORTED');
|
|
85
|
+
try {
|
|
86
|
+
return await nip44.decrypt(pubkey, ciphertext);
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
throw new Nip07Error(`nip44.decrypt failed: ${err.message}`);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
};
|
|
69
93
|
async getRelays() {
|
|
70
94
|
if (!this.ext.getRelays) {
|
|
71
95
|
throw new Nip07Error('Extension does not support getRelays', 'NIP07_RELAYS_UNSUPPORTED');
|
package/dist/nip07.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nip07.js","sourceRoot":"","sources":["../src/nip07.ts"],"names":[],"mappings":"AAGA,gBAAgB;AAEhB,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,IAAI,CAAQ;IACZ,YAAY,OAAe,EAAE,IAAI,GAAG,aAAa;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,YAAY,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,UAAU;IACpD,YAAY,OAAO,GAAG,4DAA4D;QAChF,KAAK,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAA;QACrC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAA;IACtC,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"nip07.js","sourceRoot":"","sources":["../src/nip07.ts"],"names":[],"mappings":"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"}
|
package/dist/nip09.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type NostrEvent, type EventTemplate } from './event.js';
|
|
2
|
+
export type DeletionTarget = {
|
|
3
|
+
type: 'event';
|
|
4
|
+
id: string;
|
|
5
|
+
} | {
|
|
6
|
+
type: 'address';
|
|
7
|
+
address: string;
|
|
8
|
+
};
|
|
9
|
+
export type DeletionRequest = {
|
|
10
|
+
targets: DeletionTarget[];
|
|
11
|
+
reason?: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Create a kind 5 deletion event template (unsigned).
|
|
15
|
+
*/
|
|
16
|
+
export declare function createDeletionEventTemplate(request: DeletionRequest): EventTemplate;
|
|
17
|
+
/**
|
|
18
|
+
* Create and sign a kind 5 deletion event.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createDeletionEvent(request: DeletionRequest, secretKey: Uint8Array): NostrEvent;
|
|
21
|
+
/**
|
|
22
|
+
* Parse a kind 5 deletion event.
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseDeletion(event: NostrEvent): {
|
|
25
|
+
eventIds: string[];
|
|
26
|
+
addresses: string[];
|
|
27
|
+
kinds: number[];
|
|
28
|
+
reason: string;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Check if a deletion event targets a specific event.
|
|
32
|
+
*/
|
|
33
|
+
export declare function isDeletionOf(deletion: NostrEvent, target: NostrEvent): boolean;
|
|
34
|
+
//# sourceMappingURL=nip09.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip09.d.ts","sourceRoot":"","sources":["../src/nip09.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/E,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAExC,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAwBnF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAE/F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG;IAChD,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf,CAYA;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAS9E"}
|
package/dist/nip09.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { finalizeEvent } from './event.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a kind 5 deletion event template (unsigned).
|
|
4
|
+
*/
|
|
5
|
+
export function createDeletionEventTemplate(request) {
|
|
6
|
+
const tags = [];
|
|
7
|
+
const kinds = new Set();
|
|
8
|
+
for (const target of request.targets) {
|
|
9
|
+
if (target.type === 'event') {
|
|
10
|
+
tags.push(['e', target.id]);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
tags.push(['a', target.address]);
|
|
14
|
+
const kindStr = target.address.split(':')[0];
|
|
15
|
+
if (kindStr)
|
|
16
|
+
kinds.add(parseInt(kindStr, 10));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
for (const kind of kinds) {
|
|
20
|
+
tags.push(['k', String(kind)]);
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
kind: 5,
|
|
24
|
+
tags,
|
|
25
|
+
content: request.reason ?? '',
|
|
26
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create and sign a kind 5 deletion event.
|
|
31
|
+
*/
|
|
32
|
+
export function createDeletionEvent(request, secretKey) {
|
|
33
|
+
return finalizeEvent(createDeletionEventTemplate(request), secretKey);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parse a kind 5 deletion event.
|
|
37
|
+
*/
|
|
38
|
+
export function parseDeletion(event) {
|
|
39
|
+
const eventIds = [];
|
|
40
|
+
const addresses = [];
|
|
41
|
+
const kinds = [];
|
|
42
|
+
for (const tag of event.tags) {
|
|
43
|
+
if (tag[0] === 'e')
|
|
44
|
+
eventIds.push(tag[1]);
|
|
45
|
+
else if (tag[0] === 'a')
|
|
46
|
+
addresses.push(tag[1]);
|
|
47
|
+
else if (tag[0] === 'k')
|
|
48
|
+
kinds.push(parseInt(tag[1], 10));
|
|
49
|
+
}
|
|
50
|
+
return { eventIds, addresses, kinds, reason: event.content };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if a deletion event targets a specific event.
|
|
54
|
+
*/
|
|
55
|
+
export function isDeletionOf(deletion, target) {
|
|
56
|
+
if (deletion.kind !== 5)
|
|
57
|
+
return false;
|
|
58
|
+
if (deletion.pubkey !== target.pubkey)
|
|
59
|
+
return false;
|
|
60
|
+
for (const tag of deletion.tags) {
|
|
61
|
+
if (tag[0] === 'e' && tag[1] === target.id)
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=nip09.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip09.js","sourceRoot":"","sources":["../src/nip09.ts"],"names":[],"mappings":"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"}
|
package/dist/nip10.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { NostrEvent } from './event.js';
|
|
2
|
+
export type ThreadReference = {
|
|
3
|
+
root?: {
|
|
4
|
+
id: string;
|
|
5
|
+
relay?: string;
|
|
6
|
+
};
|
|
7
|
+
reply?: {
|
|
8
|
+
id: string;
|
|
9
|
+
relay?: string;
|
|
10
|
+
};
|
|
11
|
+
mentions: {
|
|
12
|
+
id: string;
|
|
13
|
+
relay?: string;
|
|
14
|
+
}[];
|
|
15
|
+
profiles: string[];
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Parse thread references from a kind 1 event using both
|
|
19
|
+
* the preferred (NIP-10 markers) and deprecated (positional) formats.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseThread(event: NostrEvent): ThreadReference;
|
|
22
|
+
/**
|
|
23
|
+
* Build thread tags for a reply event using the preferred marker format.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildThreadTags(opts: {
|
|
26
|
+
root?: {
|
|
27
|
+
id: string;
|
|
28
|
+
relay?: string;
|
|
29
|
+
};
|
|
30
|
+
reply?: {
|
|
31
|
+
id: string;
|
|
32
|
+
relay?: string;
|
|
33
|
+
};
|
|
34
|
+
mentions?: {
|
|
35
|
+
id: string;
|
|
36
|
+
relay?: string;
|
|
37
|
+
}[];
|
|
38
|
+
profiles?: string[];
|
|
39
|
+
}): string[][];
|
|
40
|
+
//# sourceMappingURL=nip10.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip10.d.ts","sourceRoot":"","sources":["../src/nip10.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACrC,KAAK,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACtC,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC1C,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,CA2C9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACrC,KAAK,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACtC,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC3C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB,GAAG,MAAM,EAAE,EAAE,CAwBb"}
|
package/dist/nip10.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse thread references from a kind 1 event using both
|
|
3
|
+
* the preferred (NIP-10 markers) and deprecated (positional) formats.
|
|
4
|
+
*/
|
|
5
|
+
export function parseThread(event) {
|
|
6
|
+
const result = { mentions: [], profiles: [] };
|
|
7
|
+
const eTags = event.tags.filter(t => t[0] === 'e');
|
|
8
|
+
const pTags = event.tags.filter(t => t[0] === 'p');
|
|
9
|
+
result.profiles = pTags.map(t => t[1]);
|
|
10
|
+
// Check if markers are present (preferred format)
|
|
11
|
+
const hasMarkers = eTags.some(t => t[3] === 'root' || t[3] === 'reply' || t[3] === 'mention');
|
|
12
|
+
if (hasMarkers) {
|
|
13
|
+
for (const tag of eTags) {
|
|
14
|
+
const ref = { id: tag[1], relay: tag[2] || undefined };
|
|
15
|
+
switch (tag[3]) {
|
|
16
|
+
case 'root':
|
|
17
|
+
result.root = ref;
|
|
18
|
+
break;
|
|
19
|
+
case 'reply':
|
|
20
|
+
result.reply = ref;
|
|
21
|
+
break;
|
|
22
|
+
case 'mention':
|
|
23
|
+
result.mentions.push(ref);
|
|
24
|
+
break;
|
|
25
|
+
default:
|
|
26
|
+
result.mentions.push(ref);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
// Deprecated positional format
|
|
33
|
+
if (eTags.length === 1) {
|
|
34
|
+
result.root = { id: eTags[0][1], relay: eTags[0][2] || undefined };
|
|
35
|
+
}
|
|
36
|
+
else if (eTags.length >= 2) {
|
|
37
|
+
result.root = { id: eTags[0][1], relay: eTags[0][2] || undefined };
|
|
38
|
+
result.reply = { id: eTags[eTags.length - 1][1], relay: eTags[eTags.length - 1][2] || undefined };
|
|
39
|
+
for (let i = 1; i < eTags.length - 1; i++) {
|
|
40
|
+
result.mentions.push({ id: eTags[i][1], relay: eTags[i][2] || undefined });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Build thread tags for a reply event using the preferred marker format.
|
|
48
|
+
*/
|
|
49
|
+
export function buildThreadTags(opts) {
|
|
50
|
+
const tags = [];
|
|
51
|
+
if (opts.root) {
|
|
52
|
+
tags.push(['e', opts.root.id, opts.root.relay ?? '', 'root']);
|
|
53
|
+
}
|
|
54
|
+
if (opts.reply) {
|
|
55
|
+
tags.push(['e', opts.reply.id, opts.reply.relay ?? '', 'reply']);
|
|
56
|
+
}
|
|
57
|
+
if (opts.mentions) {
|
|
58
|
+
for (const m of opts.mentions) {
|
|
59
|
+
tags.push(['e', m.id, m.relay ?? '', 'mention']);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (opts.profiles) {
|
|
63
|
+
for (const p of opts.profiles) {
|
|
64
|
+
tags.push(['p', p]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return tags;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=nip10.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip10.js","sourceRoot":"","sources":["../src/nip10.ts"],"names":[],"mappings":"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"}
|
package/dist/nip11.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type RelayInfo = {
|
|
2
|
+
name?: string;
|
|
3
|
+
description?: string;
|
|
4
|
+
pubkey?: string;
|
|
5
|
+
contact?: string;
|
|
6
|
+
supported_nips?: number[];
|
|
7
|
+
software?: string;
|
|
8
|
+
version?: string;
|
|
9
|
+
limitation?: {
|
|
10
|
+
max_message_length?: number;
|
|
11
|
+
max_subscriptions?: number;
|
|
12
|
+
max_filters?: number;
|
|
13
|
+
max_limit?: number;
|
|
14
|
+
max_subid_length?: number;
|
|
15
|
+
max_event_tags?: number;
|
|
16
|
+
max_content_length?: number;
|
|
17
|
+
min_pow_difficulty?: number;
|
|
18
|
+
auth_required?: boolean;
|
|
19
|
+
payment_required?: boolean;
|
|
20
|
+
[key: string]: unknown;
|
|
21
|
+
};
|
|
22
|
+
relay_countries?: string[];
|
|
23
|
+
language_tags?: string[];
|
|
24
|
+
tags?: string[];
|
|
25
|
+
posting_policy?: string;
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
};
|
|
28
|
+
export declare class Nip11Error extends Error {
|
|
29
|
+
code: string;
|
|
30
|
+
constructor(message: string, code?: string);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Fetch relay information document (NIP-11).
|
|
34
|
+
* Converts wss:// to https:// and fetches with Accept: application/nostr+json.
|
|
35
|
+
*/
|
|
36
|
+
export declare function fetchRelayInfo(relayUrl: string): Promise<RelayInfo>;
|
|
37
|
+
/**
|
|
38
|
+
* Check if a relay supports a specific NIP number.
|
|
39
|
+
*/
|
|
40
|
+
export declare function supportsNip(info: RelayInfo, nip: number): boolean;
|
|
41
|
+
//# sourceMappingURL=nip11.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip11.d.ts","sourceRoot":"","sources":["../src/nip11.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE;QACX,kBAAkB,CAAC,EAAE,MAAM,CAAA;QAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAA;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,kBAAkB,CAAC,EAAE,MAAM,CAAA;QAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAA;QAC3B,aAAa,CAAC,EAAE,OAAO,CAAA;QACvB,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;IACD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,qBAAa,UAAW,SAAQ,KAAK;IACnC,IAAI,EAAE,MAAM,CAAA;gBACA,OAAO,EAAE,MAAM,EAAE,IAAI,SAAgB;CAKlD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAgBzE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAEjE"}
|
package/dist/nip11.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export class Nip11Error extends Error {
|
|
2
|
+
code;
|
|
3
|
+
constructor(message, code = 'NIP11_ERROR') {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'Nip11Error';
|
|
6
|
+
this.code = code;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Fetch relay information document (NIP-11).
|
|
11
|
+
* Converts wss:// to https:// and fetches with Accept: application/nostr+json.
|
|
12
|
+
*/
|
|
13
|
+
export async function fetchRelayInfo(relayUrl) {
|
|
14
|
+
let httpUrl = relayUrl.replace(/^wss:\/\//, 'https://').replace(/^ws:\/\//, 'http://');
|
|
15
|
+
if (!httpUrl.startsWith('http')) {
|
|
16
|
+
httpUrl = `https://${httpUrl}`;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const res = await fetch(httpUrl, {
|
|
20
|
+
headers: { Accept: 'application/nostr+json' },
|
|
21
|
+
});
|
|
22
|
+
if (!res.ok)
|
|
23
|
+
throw new Nip11Error(`HTTP ${res.status} from ${relayUrl}`, 'FETCH_ERROR');
|
|
24
|
+
return (await res.json());
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
if (err instanceof Nip11Error)
|
|
28
|
+
throw err;
|
|
29
|
+
throw new Nip11Error(`Failed to fetch relay info from ${relayUrl}: ${err.message}`, 'FETCH_ERROR');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if a relay supports a specific NIP number.
|
|
34
|
+
*/
|
|
35
|
+
export function supportsNip(info, nip) {
|
|
36
|
+
return info.supported_nips?.includes(nip) ?? false;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=nip11.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip11.js","sourceRoot":"","sources":["../src/nip11.ts"],"names":[],"mappings":"AA4BA,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,IAAI,CAAQ;IACZ,YAAY,OAAe,EAAE,IAAI,GAAG,aAAa;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,YAAY,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,IAAI,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;IACtF,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,GAAG,WAAW,OAAO,EAAE,CAAA;IAChC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;YAC/B,OAAO,EAAE,EAAE,MAAM,EAAE,wBAAwB,EAAE;SAC9C,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,UAAU,CAAC,QAAQ,GAAG,CAAC,MAAM,SAAS,QAAQ,EAAE,EAAE,aAAa,CAAC,CAAA;QACvF,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAc,CAAA;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU;YAAE,MAAM,GAAG,CAAA;QACxC,MAAM,IAAI,UAAU,CAAC,mCAAmC,QAAQ,KAAM,GAAa,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAA;IAC/G,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAe,EAAE,GAAW;IACtD,OAAO,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAA;AACpD,CAAC"}
|
package/dist/nip13.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type NostrEvent, type EventTemplate } from './event.js';
|
|
2
|
+
/**
|
|
3
|
+
* Count the number of leading zero bits in an event ID (hex string).
|
|
4
|
+
*/
|
|
5
|
+
export declare function countLeadingZeroBits(hex: string): number;
|
|
6
|
+
/**
|
|
7
|
+
* Get the proof-of-work difficulty of an event (leading zero bits of the event ID).
|
|
8
|
+
*/
|
|
9
|
+
export declare function getPowDifficulty(event: NostrEvent): number;
|
|
10
|
+
/**
|
|
11
|
+
* Get the target difficulty committed to by the nonce tag.
|
|
12
|
+
* Returns 0 if no nonce tag with target is present.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getTargetDifficulty(event: NostrEvent | EventTemplate): number;
|
|
15
|
+
/**
|
|
16
|
+
* Check if an event satisfies a given proof-of-work difficulty.
|
|
17
|
+
* Verifies both the actual difficulty and the committed target difficulty.
|
|
18
|
+
*/
|
|
19
|
+
export declare function verifyPow(event: NostrEvent, minDifficulty: number): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Mine proof-of-work for an event template.
|
|
22
|
+
* Returns the template with a nonce tag achieving the target difficulty.
|
|
23
|
+
* WARNING: This is CPU-intensive and may take a long time for high difficulties.
|
|
24
|
+
*/
|
|
25
|
+
export declare function minePow(template: EventTemplate, targetDifficulty: number): EventTemplate;
|
|
26
|
+
//# sourceMappingURL=nip13.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip13.d.ts","sourceRoot":"","sources":["../src/nip13.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAE9E;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAaxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAE1D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,GAAG,MAAM,CAI7E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAM3E;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,GAAG,aAAa,CA0BxF"}
|
package/dist/nip13.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { getEventHash } from './event.js';
|
|
2
|
+
/**
|
|
3
|
+
* Count the number of leading zero bits in an event ID (hex string).
|
|
4
|
+
*/
|
|
5
|
+
export function countLeadingZeroBits(hex) {
|
|
6
|
+
let count = 0;
|
|
7
|
+
for (let i = 0; i < hex.length; i++) {
|
|
8
|
+
const nibble = parseInt(hex[i], 16);
|
|
9
|
+
if (nibble === 0) {
|
|
10
|
+
count += 4;
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
// Count leading zero bits of this nibble
|
|
14
|
+
count += Math.clz32(nibble) - 28;
|
|
15
|
+
break;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return count;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get the proof-of-work difficulty of an event (leading zero bits of the event ID).
|
|
22
|
+
*/
|
|
23
|
+
export function getPowDifficulty(event) {
|
|
24
|
+
return countLeadingZeroBits(event.id);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get the target difficulty committed to by the nonce tag.
|
|
28
|
+
* Returns 0 if no nonce tag with target is present.
|
|
29
|
+
*/
|
|
30
|
+
export function getTargetDifficulty(event) {
|
|
31
|
+
const nonceTag = event.tags.find(t => t[0] === 'nonce');
|
|
32
|
+
if (!nonceTag || !nonceTag[2])
|
|
33
|
+
return 0;
|
|
34
|
+
return parseInt(nonceTag[2], 10) || 0;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if an event satisfies a given proof-of-work difficulty.
|
|
38
|
+
* Verifies both the actual difficulty and the committed target difficulty.
|
|
39
|
+
*/
|
|
40
|
+
export function verifyPow(event, minDifficulty) {
|
|
41
|
+
const actual = getPowDifficulty(event);
|
|
42
|
+
if (actual < minDifficulty)
|
|
43
|
+
return false;
|
|
44
|
+
const target = getTargetDifficulty(event);
|
|
45
|
+
return target >= minDifficulty;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Mine proof-of-work for an event template.
|
|
49
|
+
* Returns the template with a nonce tag achieving the target difficulty.
|
|
50
|
+
* WARNING: This is CPU-intensive and may take a long time for high difficulties.
|
|
51
|
+
*/
|
|
52
|
+
export function minePow(template, targetDifficulty) {
|
|
53
|
+
// Remove any existing nonce tag
|
|
54
|
+
const tags = template.tags.filter(t => t[0] !== 'nonce');
|
|
55
|
+
let nonce = 0;
|
|
56
|
+
while (true) {
|
|
57
|
+
const attempt = {
|
|
58
|
+
...template,
|
|
59
|
+
tags: [...tags, ['nonce', String(nonce), String(targetDifficulty)]],
|
|
60
|
+
};
|
|
61
|
+
// We need to compute the hash to check difficulty
|
|
62
|
+
// getEventHash requires a full unsigned event shape, so we build one
|
|
63
|
+
const testEvent = {
|
|
64
|
+
...attempt,
|
|
65
|
+
pubkey: '0'.repeat(64), // placeholder - actual pubkey set at signing
|
|
66
|
+
};
|
|
67
|
+
const hash = getEventHash(testEvent);
|
|
68
|
+
const bits = countLeadingZeroBits(hash);
|
|
69
|
+
if (bits >= targetDifficulty) {
|
|
70
|
+
return attempt;
|
|
71
|
+
}
|
|
72
|
+
nonce++;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=nip13.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip13.js","sourceRoot":"","sources":["../src/nip13.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuC,MAAM,YAAY,CAAA;AAE9E;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACnC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC,CAAA;QACZ,CAAC;aAAM,CAAC;YACN,yCAAyC;YACzC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA;YAChC,MAAK;QACP,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAiB;IAChD,OAAO,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAiC;IACnE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAA;IACvD,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IACvC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAiB,EAAE,aAAqB;IAChE,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;IACtC,IAAI,MAAM,GAAG,aAAa;QAAE,OAAO,KAAK,CAAA;IAExC,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAA;IACzC,OAAO,MAAM,IAAI,aAAa,CAAA;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,QAAuB,EAAE,gBAAwB;IACvE,gCAAgC;IAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAA;IAExD,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,OAAO,GAAkB;YAC7B,GAAG,QAAQ;YACX,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;SACpE,CAAA;QAED,kDAAkD;QAClD,qEAAqE;QACrE,MAAM,SAAS,GAAG;YAChB,GAAG,OAAO;YACV,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,6CAA6C;SACtE,CAAA;QACD,MAAM,IAAI,GAAG,YAAY,CAAC,SAAgB,CAAC,CAAA;QAC3C,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAA;QAEvC,IAAI,IAAI,IAAI,gBAAgB,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,KAAK,EAAE,CAAA;IACT,CAAC;AACH,CAAC"}
|
package/dist/nip18.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type NostrEvent, type EventTemplate } from './event.js';
|
|
2
|
+
export type RepostTarget = {
|
|
3
|
+
id: string;
|
|
4
|
+
pubkey: string;
|
|
5
|
+
relay?: string;
|
|
6
|
+
kind?: number;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Create a kind 6 repost event template (for kind 1 text notes) or
|
|
10
|
+
* kind 16 generic repost event template (for other kinds).
|
|
11
|
+
* The original event JSON is placed in content.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createRepostEventTemplate(target: RepostTarget, originalEvent?: NostrEvent): EventTemplate;
|
|
14
|
+
/**
|
|
15
|
+
* Create and sign a repost event.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createRepostEvent(target: RepostTarget, secretKey: Uint8Array, originalEvent?: NostrEvent): NostrEvent;
|
|
18
|
+
/**
|
|
19
|
+
* Parse a kind 6 or kind 16 repost event.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseRepost(event: NostrEvent): {
|
|
22
|
+
targetEventId?: string;
|
|
23
|
+
targetPubkey?: string;
|
|
24
|
+
targetRelay?: string;
|
|
25
|
+
targetKind?: number;
|
|
26
|
+
embeddedEvent?: NostrEvent;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=nip18.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip18.d.ts","sourceRoot":"","sources":["../src/nip18.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/E,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,UAAU,GAAG,aAAa,CAkBzG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,UAAU,GAAG,UAAU,CAErH;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,UAAU,CAAA;CAC3B,CAgCA"}
|
package/dist/nip18.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { finalizeEvent } from './event.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a kind 6 repost event template (for kind 1 text notes) or
|
|
4
|
+
* kind 16 generic repost event template (for other kinds).
|
|
5
|
+
* The original event JSON is placed in content.
|
|
6
|
+
*/
|
|
7
|
+
export function createRepostEventTemplate(target, originalEvent) {
|
|
8
|
+
const isGeneric = target.kind !== undefined && target.kind !== 1;
|
|
9
|
+
const kind = isGeneric ? 16 : 6;
|
|
10
|
+
const tags = [
|
|
11
|
+
['e', target.id, target.relay ?? ''],
|
|
12
|
+
['p', target.pubkey],
|
|
13
|
+
];
|
|
14
|
+
if (isGeneric && target.kind !== undefined) {
|
|
15
|
+
tags.push(['k', String(target.kind)]);
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
kind,
|
|
19
|
+
tags,
|
|
20
|
+
content: originalEvent ? JSON.stringify(originalEvent) : '',
|
|
21
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create and sign a repost event.
|
|
26
|
+
*/
|
|
27
|
+
export function createRepostEvent(target, secretKey, originalEvent) {
|
|
28
|
+
return finalizeEvent(createRepostEventTemplate(target, originalEvent), secretKey);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Parse a kind 6 or kind 16 repost event.
|
|
32
|
+
*/
|
|
33
|
+
export function parseRepost(event) {
|
|
34
|
+
let targetEventId;
|
|
35
|
+
let targetPubkey;
|
|
36
|
+
let targetRelay;
|
|
37
|
+
let targetKind;
|
|
38
|
+
for (const tag of event.tags) {
|
|
39
|
+
if (tag[0] === 'e') {
|
|
40
|
+
targetEventId = tag[1];
|
|
41
|
+
if (tag[2])
|
|
42
|
+
targetRelay = tag[2];
|
|
43
|
+
}
|
|
44
|
+
else if (tag[0] === 'p') {
|
|
45
|
+
targetPubkey = tag[1];
|
|
46
|
+
}
|
|
47
|
+
else if (tag[0] === 'k') {
|
|
48
|
+
targetKind = parseInt(tag[1], 10);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// For kind 6 reposts, the target kind is implicitly 1
|
|
52
|
+
if (event.kind === 6 && targetKind === undefined) {
|
|
53
|
+
targetKind = 1;
|
|
54
|
+
}
|
|
55
|
+
let embeddedEvent;
|
|
56
|
+
if (event.content) {
|
|
57
|
+
try {
|
|
58
|
+
embeddedEvent = JSON.parse(event.content);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// content may be empty or not valid JSON
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return { targetEventId, targetPubkey, targetRelay, targetKind, embeddedEvent };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=nip18.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip18.js","sourceRoot":"","sources":["../src/nip18.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAuC,MAAM,YAAY,CAAA;AAS/E;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAoB,EAAE,aAA0B;IACxF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,CAAA;IAChE,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/B,MAAM,IAAI,GAAe;QACvB,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QACpC,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC;KACrB,CAAA;IAED,IAAI,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC;IAED,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE;QAC3D,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;KAC1C,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAoB,EAAE,SAAqB,EAAE,aAA0B;IACvG,OAAO,aAAa,CAAC,yBAAyB,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAA;AACnF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAiB;IAO3C,IAAI,aAAiC,CAAA;IACrC,IAAI,YAAgC,CAAA;IACpC,IAAI,WAA+B,CAAA;IACnC,IAAI,UAA8B,CAAA;IAElC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACnB,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YACtB,IAAI,GAAG,CAAC,CAAC,CAAC;gBAAE,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QAClC,CAAC;aAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC1B,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QACvB,CAAC;aAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC1B,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACnC,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACjD,UAAU,GAAG,CAAC,CAAA;IAChB,CAAC;IAED,IAAI,aAAqC,CAAA;IACzC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAe,CAAA;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,CAAA;AAChF,CAAC"}
|
package/dist/nip21.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type DecodedResult } from './nip19.js';
|
|
2
|
+
/**
|
|
3
|
+
* Encode a NIP-19 bech32 entity as a nostr: URI.
|
|
4
|
+
*/
|
|
5
|
+
export declare function encodeNostrURI(nip19Entity: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Decode a nostr: URI into a NIP-19 decoded result.
|
|
8
|
+
*/
|
|
9
|
+
export declare function decodeNostrURI(uri: string): DecodedResult;
|
|
10
|
+
/**
|
|
11
|
+
* Check if a string is a valid nostr: URI.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isNostrURI(str: string): boolean;
|
|
14
|
+
//# sourceMappingURL=nip21.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip21.d.ts","sourceRoot":"","sources":["../src/nip21.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAIvD;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAKzD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE/C"}
|
package/dist/nip21.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { decode } from './nip19.js';
|
|
2
|
+
const NOSTR_URI_REGEX = /^nostr:(npub|nprofile|note|nevent|naddr|nsec)1[qpzry9x8gf2tvdw0s3jn54khce6mua7l]+$/;
|
|
3
|
+
/**
|
|
4
|
+
* Encode a NIP-19 bech32 entity as a nostr: URI.
|
|
5
|
+
*/
|
|
6
|
+
export function encodeNostrURI(nip19Entity) {
|
|
7
|
+
return `nostr:${nip19Entity}`;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Decode a nostr: URI into a NIP-19 decoded result.
|
|
11
|
+
*/
|
|
12
|
+
export function decodeNostrURI(uri) {
|
|
13
|
+
if (!uri.startsWith('nostr:')) {
|
|
14
|
+
throw new Error('Invalid nostr URI: must start with "nostr:"');
|
|
15
|
+
}
|
|
16
|
+
return decode(uri.slice(6));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if a string is a valid nostr: URI.
|
|
20
|
+
*/
|
|
21
|
+
export function isNostrURI(str) {
|
|
22
|
+
return NOSTR_URI_REGEX.test(str);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=nip21.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip21.js","sourceRoot":"","sources":["../src/nip21.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAsB,MAAM,YAAY,CAAA;AAEvD,MAAM,eAAe,GAAG,oFAAoF,CAAA;AAE5G;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,OAAO,SAAS,WAAW,EAAE,CAAA;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChE,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAClC,CAAC"}
|