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/nip28.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { finalizeEvent } from './event.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a kind 40 channel creation event template.
|
|
4
|
+
*/
|
|
5
|
+
export function createChannelEventTemplate(metadata) {
|
|
6
|
+
return {
|
|
7
|
+
kind: 40,
|
|
8
|
+
tags: [],
|
|
9
|
+
content: JSON.stringify(metadata),
|
|
10
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create and sign a kind 40 channel creation event.
|
|
15
|
+
*/
|
|
16
|
+
export function createChannelEvent(metadata, secretKey) {
|
|
17
|
+
return finalizeEvent(createChannelEventTemplate(metadata), secretKey);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a kind 41 channel metadata update event template.
|
|
21
|
+
*/
|
|
22
|
+
export function createChannelMetadataEventTemplate(channelId, metadata, recommendedRelay) {
|
|
23
|
+
return {
|
|
24
|
+
kind: 41,
|
|
25
|
+
tags: [['e', channelId, recommendedRelay ?? '']],
|
|
26
|
+
content: JSON.stringify(metadata),
|
|
27
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create and sign a kind 41 channel metadata update event.
|
|
32
|
+
*/
|
|
33
|
+
export function createChannelMetadataEvent(channelId, metadata, secretKey, recommendedRelay) {
|
|
34
|
+
return finalizeEvent(createChannelMetadataEventTemplate(channelId, metadata, recommendedRelay), secretKey);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a kind 42 channel message event template.
|
|
38
|
+
*/
|
|
39
|
+
export function createChannelMessageEventTemplate(channelId, content, recommendedRelay, replyTo) {
|
|
40
|
+
const tags = [['e', channelId, recommendedRelay ?? '', 'root']];
|
|
41
|
+
if (replyTo) {
|
|
42
|
+
tags.push(['e', replyTo, recommendedRelay ?? '', 'reply']);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
kind: 42,
|
|
46
|
+
tags,
|
|
47
|
+
content,
|
|
48
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create and sign a kind 42 channel message event.
|
|
53
|
+
*/
|
|
54
|
+
export function createChannelMessageEvent(channelId, content, secretKey, recommendedRelay, replyTo) {
|
|
55
|
+
return finalizeEvent(createChannelMessageEventTemplate(channelId, content, recommendedRelay, replyTo), secretKey);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Create a kind 43 channel hide message event template.
|
|
59
|
+
*/
|
|
60
|
+
export function createChannelHideMessageEventTemplate(messageId, reason) {
|
|
61
|
+
return {
|
|
62
|
+
kind: 43,
|
|
63
|
+
tags: [['e', messageId]],
|
|
64
|
+
content: reason ? JSON.stringify({ reason }) : '{}',
|
|
65
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create a kind 44 channel mute user event template.
|
|
70
|
+
*/
|
|
71
|
+
export function createChannelMuteUserEventTemplate(pubkey, reason) {
|
|
72
|
+
return {
|
|
73
|
+
kind: 44,
|
|
74
|
+
tags: [['p', pubkey]],
|
|
75
|
+
content: reason ? JSON.stringify({ reason }) : '{}',
|
|
76
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Parse channel metadata from a kind 40 or 41 event.
|
|
81
|
+
*/
|
|
82
|
+
export function parseChannelMetadata(event) {
|
|
83
|
+
try {
|
|
84
|
+
const content = JSON.parse(event.content);
|
|
85
|
+
return {
|
|
86
|
+
name: content.name ?? '',
|
|
87
|
+
about: content.about,
|
|
88
|
+
picture: content.picture,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return { name: '' };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Parse a channel message event (kind 42).
|
|
97
|
+
* Returns the channel ID, content, and optional reply reference.
|
|
98
|
+
*/
|
|
99
|
+
export function parseChannelMessage(event) {
|
|
100
|
+
let channelId;
|
|
101
|
+
let replyTo;
|
|
102
|
+
for (const tag of event.tags) {
|
|
103
|
+
if (tag[0] === 'e') {
|
|
104
|
+
if (tag[3] === 'root') {
|
|
105
|
+
channelId = tag[1];
|
|
106
|
+
}
|
|
107
|
+
else if (tag[3] === 'reply') {
|
|
108
|
+
replyTo = tag[1];
|
|
109
|
+
}
|
|
110
|
+
else if (!channelId) {
|
|
111
|
+
// Fallback: first e tag without marker is channel ID
|
|
112
|
+
channelId = tag[1];
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return { channelId, content: event.content, replyTo };
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=nip28.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip28.js","sourceRoot":"","sources":["../src/nip28.ts"],"names":[],"mappings":"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"}
|
package/dist/nip29.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type NostrEvent, type EventTemplate } from './event.js';
|
|
2
|
+
export type GroupMetadata = {
|
|
3
|
+
id: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
about?: string;
|
|
6
|
+
picture?: string;
|
|
7
|
+
isOpen?: boolean;
|
|
8
|
+
isPublic?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type GroupAdminAction = {
|
|
11
|
+
type: 'add-user';
|
|
12
|
+
pubkey: string;
|
|
13
|
+
} | {
|
|
14
|
+
type: 'remove-user';
|
|
15
|
+
pubkey: string;
|
|
16
|
+
} | {
|
|
17
|
+
type: 'edit-metadata';
|
|
18
|
+
name?: string;
|
|
19
|
+
about?: string;
|
|
20
|
+
picture?: string;
|
|
21
|
+
} | {
|
|
22
|
+
type: 'delete-event';
|
|
23
|
+
eventId: string;
|
|
24
|
+
} | {
|
|
25
|
+
type: 'add-permission';
|
|
26
|
+
pubkey: string;
|
|
27
|
+
permission: string;
|
|
28
|
+
} | {
|
|
29
|
+
type: 'remove-permission';
|
|
30
|
+
pubkey: string;
|
|
31
|
+
permission: string;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Create a kind 9 group chat message event template.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createGroupChatTemplate(groupId: string, content: string, replyTo?: string): EventTemplate;
|
|
37
|
+
/**
|
|
38
|
+
* Create and sign a group chat message event.
|
|
39
|
+
*/
|
|
40
|
+
export declare function createGroupChatEvent(groupId: string, content: string, secretKey: Uint8Array, replyTo?: string): NostrEvent;
|
|
41
|
+
/**
|
|
42
|
+
* Create a group admin action event template.
|
|
43
|
+
*/
|
|
44
|
+
export declare function createGroupAdminTemplate(groupId: string, action: GroupAdminAction): EventTemplate;
|
|
45
|
+
/**
|
|
46
|
+
* Parse a kind 39000 group metadata event.
|
|
47
|
+
*/
|
|
48
|
+
export declare function parseGroupMetadata(event: NostrEvent): GroupMetadata;
|
|
49
|
+
/**
|
|
50
|
+
* Parse a kind 39002 group members event.
|
|
51
|
+
*/
|
|
52
|
+
export declare function parseGroupMembers(event: NostrEvent): string[];
|
|
53
|
+
/**
|
|
54
|
+
* Parse a kind 39001 group admins event.
|
|
55
|
+
*/
|
|
56
|
+
export declare function parseGroupAdmins(event: NostrEvent): Array<{
|
|
57
|
+
pubkey: string;
|
|
58
|
+
permissions: string[];
|
|
59
|
+
}>;
|
|
60
|
+
//# sourceMappingURL=nip29.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip29.d.ts","sourceRoot":"","sources":["../src/nip29.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/E,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAA;AAErE;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAUzG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,UAAU,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,UAAU,CAEZ;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,aAAa,CAyCjG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,CAiCnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE,CAE7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAWpG"}
|
package/dist/nip29.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { finalizeEvent } from './event.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a kind 9 group chat message event template.
|
|
4
|
+
*/
|
|
5
|
+
export function createGroupChatTemplate(groupId, content, replyTo) {
|
|
6
|
+
const tags = [['h', groupId]];
|
|
7
|
+
if (replyTo)
|
|
8
|
+
tags.push(['e', replyTo, '', 'reply']);
|
|
9
|
+
return {
|
|
10
|
+
kind: 9,
|
|
11
|
+
tags,
|
|
12
|
+
content,
|
|
13
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create and sign a group chat message event.
|
|
18
|
+
*/
|
|
19
|
+
export function createGroupChatEvent(groupId, content, secretKey, replyTo) {
|
|
20
|
+
return finalizeEvent(createGroupChatTemplate(groupId, content, replyTo), secretKey);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a group admin action event template.
|
|
24
|
+
*/
|
|
25
|
+
export function createGroupAdminTemplate(groupId, action) {
|
|
26
|
+
const tags = [['h', groupId]];
|
|
27
|
+
let kind;
|
|
28
|
+
switch (action.type) {
|
|
29
|
+
case 'add-user':
|
|
30
|
+
kind = 9000;
|
|
31
|
+
tags.push(['p', action.pubkey]);
|
|
32
|
+
break;
|
|
33
|
+
case 'remove-user':
|
|
34
|
+
kind = 9001;
|
|
35
|
+
tags.push(['p', action.pubkey]);
|
|
36
|
+
break;
|
|
37
|
+
case 'edit-metadata':
|
|
38
|
+
kind = 9002;
|
|
39
|
+
if (action.name)
|
|
40
|
+
tags.push(['name', action.name]);
|
|
41
|
+
if (action.about)
|
|
42
|
+
tags.push(['about', action.about]);
|
|
43
|
+
if (action.picture)
|
|
44
|
+
tags.push(['picture', action.picture]);
|
|
45
|
+
break;
|
|
46
|
+
case 'delete-event':
|
|
47
|
+
kind = 9005;
|
|
48
|
+
tags.push(['e', action.eventId]);
|
|
49
|
+
break;
|
|
50
|
+
case 'add-permission':
|
|
51
|
+
kind = 9003;
|
|
52
|
+
tags.push(['p', action.pubkey]);
|
|
53
|
+
tags.push(['permission', action.permission]);
|
|
54
|
+
break;
|
|
55
|
+
case 'remove-permission':
|
|
56
|
+
kind = 9004;
|
|
57
|
+
tags.push(['p', action.pubkey]);
|
|
58
|
+
tags.push(['permission', action.permission]);
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
kind: kind,
|
|
63
|
+
tags,
|
|
64
|
+
content: '',
|
|
65
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Parse a kind 39000 group metadata event.
|
|
70
|
+
*/
|
|
71
|
+
export function parseGroupMetadata(event) {
|
|
72
|
+
const result = { id: '' };
|
|
73
|
+
for (const tag of event.tags) {
|
|
74
|
+
switch (tag[0]) {
|
|
75
|
+
case 'd':
|
|
76
|
+
result.id = tag[1] ?? '';
|
|
77
|
+
break;
|
|
78
|
+
case 'name':
|
|
79
|
+
result.name = tag[1];
|
|
80
|
+
break;
|
|
81
|
+
case 'about':
|
|
82
|
+
result.about = tag[1];
|
|
83
|
+
break;
|
|
84
|
+
case 'picture':
|
|
85
|
+
result.picture = tag[1];
|
|
86
|
+
break;
|
|
87
|
+
case 'open':
|
|
88
|
+
result.isOpen = true;
|
|
89
|
+
break;
|
|
90
|
+
case 'closed':
|
|
91
|
+
result.isOpen = false;
|
|
92
|
+
break;
|
|
93
|
+
case 'public':
|
|
94
|
+
result.isPublic = true;
|
|
95
|
+
break;
|
|
96
|
+
case 'private':
|
|
97
|
+
result.isPublic = false;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Parse a kind 39002 group members event.
|
|
105
|
+
*/
|
|
106
|
+
export function parseGroupMembers(event) {
|
|
107
|
+
return event.tags.filter(t => t[0] === 'p').map(t => t[1]);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Parse a kind 39001 group admins event.
|
|
111
|
+
*/
|
|
112
|
+
export function parseGroupAdmins(event) {
|
|
113
|
+
const admins = [];
|
|
114
|
+
for (const tag of event.tags) {
|
|
115
|
+
if (tag[0] === 'p') {
|
|
116
|
+
const permissions = tag.slice(3).filter(Boolean);
|
|
117
|
+
admins.push({ pubkey: tag[1], permissions });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return admins;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=nip29.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip29.js","sourceRoot":"","sources":["../src/nip29.ts"],"names":[],"mappings":"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"}
|
package/dist/nip30.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { NostrEvent } from './event.js';
|
|
2
|
+
export type CustomEmoji = {
|
|
3
|
+
shortcode: string;
|
|
4
|
+
url: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Parse custom emoji tags from an event.
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseCustomEmojis(event: NostrEvent): CustomEmoji[];
|
|
10
|
+
/**
|
|
11
|
+
* Build emoji tags from an array of custom emojis.
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildEmojiTags(emojis: CustomEmoji[]): string[][];
|
|
14
|
+
/**
|
|
15
|
+
* Extract emoji shortcodes (`:name:` format) from content text.
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractEmojiShortcodes(content: string): string[];
|
|
18
|
+
//# sourceMappingURL=nip30.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip30.d.ts","sourceRoot":"","sources":["../src/nip30.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,EAAE,CAIlE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,EAAE,CAEhE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAIhE"}
|
package/dist/nip30.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse custom emoji tags from an event.
|
|
3
|
+
*/
|
|
4
|
+
export function parseCustomEmojis(event) {
|
|
5
|
+
return event.tags
|
|
6
|
+
.filter(t => t[0] === 'emoji' && t[1] && t[2])
|
|
7
|
+
.map(t => ({ shortcode: t[1], url: t[2] }));
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Build emoji tags from an array of custom emojis.
|
|
11
|
+
*/
|
|
12
|
+
export function buildEmojiTags(emojis) {
|
|
13
|
+
return emojis.map(e => ['emoji', e.shortcode, e.url]);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Extract emoji shortcodes (`:name:` format) from content text.
|
|
17
|
+
*/
|
|
18
|
+
export function extractEmojiShortcodes(content) {
|
|
19
|
+
const matches = content.match(/:([a-zA-Z0-9_]+):/g);
|
|
20
|
+
if (!matches)
|
|
21
|
+
return [];
|
|
22
|
+
return [...new Set(matches.map(m => m.slice(1, -1)))];
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=nip30.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip30.js","sourceRoot":"","sources":["../src/nip30.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAiB;IACjD,OAAO,KAAK,CAAC,IAAI;SACd,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;IACnD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAA;IACvB,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACvD,CAAC"}
|
package/dist/nip31.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { NostrEvent } from './event.js';
|
|
2
|
+
/**
|
|
3
|
+
* Add an "alt" tag to a tag array, describing the event for clients
|
|
4
|
+
* that don't support the event kind.
|
|
5
|
+
*/
|
|
6
|
+
export declare function addAltTag(tags: string[][], description: string): string[][];
|
|
7
|
+
/**
|
|
8
|
+
* Extract the "alt" tag value from an event.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getAltTag(event: NostrEvent): string | undefined;
|
|
11
|
+
//# sourceMappingURL=nip31.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip31.d.ts","sourceRoot":"","sources":["../src/nip31.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAE3E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAG/D"}
|
package/dist/nip31.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Add an "alt" tag to a tag array, describing the event for clients
|
|
3
|
+
* that don't support the event kind.
|
|
4
|
+
*/
|
|
5
|
+
export function addAltTag(tags, description) {
|
|
6
|
+
return [...tags.filter(t => t[0] !== 'alt'), ['alt', description]];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Extract the "alt" tag value from an event.
|
|
10
|
+
*/
|
|
11
|
+
export function getAltTag(event) {
|
|
12
|
+
const tag = event.tags.find(t => t[0] === 'alt');
|
|
13
|
+
return tag?.[1];
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=nip31.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip31.js","sourceRoot":"","sources":["../src/nip31.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAgB,EAAE,WAAmB;IAC7D,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAA;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAiB;IACzC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAA;IAChD,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC"}
|
package/dist/nip36.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { NostrEvent, EventTemplate } from './event.js';
|
|
2
|
+
/**
|
|
3
|
+
* Add a content-warning tag to event tags.
|
|
4
|
+
*/
|
|
5
|
+
export declare function addContentWarning(tags: string[][], reason?: string): string[][];
|
|
6
|
+
/**
|
|
7
|
+
* Get the content-warning reason from an event, or undefined if none.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getContentWarning(event: NostrEvent | EventTemplate): string | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Check if an event has a content-warning tag.
|
|
12
|
+
*/
|
|
13
|
+
export declare function hasContentWarning(event: NostrEvent | EventTemplate): boolean;
|
|
14
|
+
//# sourceMappingURL=nip36.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip36.d.ts","sourceRoot":"","sources":["../src/nip36.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE3D;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAI/E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,SAAS,CAIvF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,GAAG,OAAO,CAE5E"}
|
package/dist/nip36.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Add a content-warning tag to event tags.
|
|
3
|
+
*/
|
|
4
|
+
export function addContentWarning(tags, reason) {
|
|
5
|
+
const filtered = tags.filter(t => t[0] !== 'content-warning');
|
|
6
|
+
const cwTag = reason ? ['content-warning', reason] : ['content-warning'];
|
|
7
|
+
return [...filtered, cwTag];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Get the content-warning reason from an event, or undefined if none.
|
|
11
|
+
*/
|
|
12
|
+
export function getContentWarning(event) {
|
|
13
|
+
const tag = event.tags.find(t => t[0] === 'content-warning');
|
|
14
|
+
if (!tag)
|
|
15
|
+
return undefined;
|
|
16
|
+
return tag[1] ?? '';
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if an event has a content-warning tag.
|
|
20
|
+
*/
|
|
21
|
+
export function hasContentWarning(event) {
|
|
22
|
+
return event.tags.some(t => t[0] === 'content-warning');
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=nip36.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip36.js","sourceRoot":"","sources":["../src/nip36.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAgB,EAAE,MAAe;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAA;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAA;IACxE,OAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAA;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAiC;IACjE,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAA;IAC5D,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAiC;IACjE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAA;AACzD,CAAC"}
|
package/dist/nip40.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { NostrEvent, EventTemplate } from './event.js';
|
|
2
|
+
/**
|
|
3
|
+
* Add an expiration tag to event tags.
|
|
4
|
+
*/
|
|
5
|
+
export declare function addExpiration(tags: string[][], expiration: number): string[][];
|
|
6
|
+
/**
|
|
7
|
+
* Get the expiration timestamp from an event, or undefined if none.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getExpiration(event: NostrEvent | EventTemplate): number | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Check if an event has expired (expiration timestamp is in the past).
|
|
12
|
+
*/
|
|
13
|
+
export declare function isExpired(event: NostrEvent | EventTemplate, now?: number): boolean;
|
|
14
|
+
//# sourceMappingURL=nip40.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip40.d.ts","sourceRoot":"","sources":["../src/nip40.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE3D;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAG9E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,SAAS,CAInF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAIlF"}
|
package/dist/nip40.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Add an expiration tag to event tags.
|
|
3
|
+
*/
|
|
4
|
+
export function addExpiration(tags, expiration) {
|
|
5
|
+
const filtered = tags.filter(t => t[0] !== 'expiration');
|
|
6
|
+
return [...filtered, ['expiration', String(expiration)]];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Get the expiration timestamp from an event, or undefined if none.
|
|
10
|
+
*/
|
|
11
|
+
export function getExpiration(event) {
|
|
12
|
+
const tag = event.tags.find(t => t[0] === 'expiration');
|
|
13
|
+
if (!tag || !tag[1])
|
|
14
|
+
return undefined;
|
|
15
|
+
return parseInt(tag[1], 10);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Check if an event has expired (expiration timestamp is in the past).
|
|
19
|
+
*/
|
|
20
|
+
export function isExpired(event, now) {
|
|
21
|
+
const expiration = getExpiration(event);
|
|
22
|
+
if (expiration === undefined)
|
|
23
|
+
return false;
|
|
24
|
+
return expiration < (now ?? Math.floor(Date.now() / 1000));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=nip40.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip40.js","sourceRoot":"","sources":["../src/nip40.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAgB,EAAE,UAAkB;IAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAA;IACxD,OAAO,CAAC,GAAG,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAiC;IAC7D,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAA;IACvD,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAiC,EAAE,GAAY;IACvE,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IACvC,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IAC1C,OAAO,UAAU,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;AAC5D,CAAC"}
|
package/dist/nip42.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type NostrEvent, type EventTemplate } from './event.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a kind 22242 client authentication event template (unsigned).
|
|
4
|
+
*/
|
|
5
|
+
export declare function createAuthEventTemplate(opts: {
|
|
6
|
+
relay: string;
|
|
7
|
+
challenge: string;
|
|
8
|
+
}): EventTemplate;
|
|
9
|
+
/**
|
|
10
|
+
* Create and sign a kind 22242 client authentication event.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createAuthEvent(opts: {
|
|
13
|
+
relay: string;
|
|
14
|
+
challenge: string;
|
|
15
|
+
}, secretKey: Uint8Array): NostrEvent;
|
|
16
|
+
/**
|
|
17
|
+
* Verify a kind 22242 authentication event.
|
|
18
|
+
*/
|
|
19
|
+
export declare function verifyAuthEvent(event: NostrEvent, challenge: string, relayUrl: string): boolean;
|
|
20
|
+
//# sourceMappingURL=nip42.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip42.d.ts","sourceRoot":"","sources":["../src/nip42.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAE5F;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAUjG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAE7G;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAW/F"}
|
package/dist/nip42.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { finalizeEvent, verifyEvent } from './event.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a kind 22242 client authentication event template (unsigned).
|
|
4
|
+
*/
|
|
5
|
+
export function createAuthEventTemplate(opts) {
|
|
6
|
+
return {
|
|
7
|
+
kind: 22242,
|
|
8
|
+
tags: [
|
|
9
|
+
['relay', opts.relay],
|
|
10
|
+
['challenge', opts.challenge],
|
|
11
|
+
],
|
|
12
|
+
content: '',
|
|
13
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create and sign a kind 22242 client authentication event.
|
|
18
|
+
*/
|
|
19
|
+
export function createAuthEvent(opts, secretKey) {
|
|
20
|
+
return finalizeEvent(createAuthEventTemplate(opts), secretKey);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Verify a kind 22242 authentication event.
|
|
24
|
+
*/
|
|
25
|
+
export function verifyAuthEvent(event, challenge, relayUrl) {
|
|
26
|
+
if (event.kind !== 22242)
|
|
27
|
+
return false;
|
|
28
|
+
if (!verifyEvent(event))
|
|
29
|
+
return false;
|
|
30
|
+
const relayTag = event.tags.find(t => t[0] === 'relay');
|
|
31
|
+
const challengeTag = event.tags.find(t => t[0] === 'challenge');
|
|
32
|
+
if (!relayTag || relayTag[1] !== relayUrl)
|
|
33
|
+
return false;
|
|
34
|
+
if (!challengeTag || challengeTag[1] !== challenge)
|
|
35
|
+
return false;
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=nip42.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip42.js","sourceRoot":"","sources":["../src/nip42.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAuC,MAAM,YAAY,CAAA;AAE5F;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAA0C;IAChF,OAAO;QACL,IAAI,EAAE,KAAK;QACX,IAAI,EAAE;YACJ,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;YACrB,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC;SAC9B;QACD,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;KAC1C,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAA0C,EAAE,SAAqB;IAC/F,OAAO,aAAa,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAA;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAiB,EAAE,SAAiB,EAAE,QAAgB;IACpF,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,KAAK,CAAA;IACtC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAErC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAA;IACvD,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAA;IAE/D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACvD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IAEhE,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/dist/nip46.d.ts
CHANGED
|
@@ -13,19 +13,28 @@ export declare class Nip46ConnectionError extends Nip46Error {
|
|
|
13
13
|
export declare class Nip46RemoteError extends Nip46Error {
|
|
14
14
|
constructor(message: string);
|
|
15
15
|
}
|
|
16
|
-
export type Nip46Method = 'connect' | 'disconnect' | 'describe' | 'get_public_key' | 'sign_event' | 'nip04_encrypt' | 'nip04_decrypt' | 'get_relays';
|
|
16
|
+
export type Nip46Method = 'connect' | 'disconnect' | 'describe' | 'get_public_key' | 'sign_event' | 'nip04_encrypt' | 'nip04_decrypt' | 'nip44_encrypt' | 'nip44_decrypt' | 'get_relays';
|
|
17
17
|
export type Nip46ConnectionOptions = {
|
|
18
18
|
remotePubkey: string;
|
|
19
|
-
|
|
19
|
+
relayUrls: string[];
|
|
20
20
|
secretKey?: Uint8Array;
|
|
21
|
+
secret?: string;
|
|
22
|
+
};
|
|
23
|
+
export type Nip46AppMetadata = {
|
|
24
|
+
name?: string;
|
|
25
|
+
url?: string;
|
|
26
|
+
image?: string;
|
|
27
|
+
};
|
|
28
|
+
export declare function parseConnectionURI(uri: string): Nip46ConnectionOptions & {
|
|
29
|
+
appMetadata?: Nip46AppMetadata;
|
|
21
30
|
};
|
|
22
|
-
export declare function parseConnectionURI(uri: string): Nip46ConnectionOptions;
|
|
23
31
|
export declare class NostrConnect implements Signer {
|
|
24
32
|
private remotePubkey;
|
|
25
|
-
private
|
|
33
|
+
private relayUrls;
|
|
26
34
|
private secretKey;
|
|
27
35
|
private publicKey;
|
|
28
36
|
private relay;
|
|
37
|
+
private secret?;
|
|
29
38
|
private _connected;
|
|
30
39
|
private pendingRequests;
|
|
31
40
|
private sub;
|
|
@@ -42,6 +51,10 @@ export declare class NostrConnect implements Signer {
|
|
|
42
51
|
encrypt: (pubkey: string, plaintext: string) => Promise<string>;
|
|
43
52
|
decrypt: (pubkey: string, ciphertext: string) => Promise<string>;
|
|
44
53
|
};
|
|
54
|
+
nip44: {
|
|
55
|
+
encrypt: (pubkey: string, plaintext: string) => Promise<string>;
|
|
56
|
+
decrypt: (pubkey: string, ciphertext: string) => Promise<string>;
|
|
57
|
+
};
|
|
45
58
|
getRelays(): Promise<RelayMap>;
|
|
46
59
|
private _sendRequest;
|
|
47
60
|
private _handleResponse;
|
package/dist/nip46.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nip46.d.ts","sourceRoot":"","sources":["../src/nip46.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,aAAa,EAAmB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAInG,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAOnD,qBAAa,UAAW,SAAQ,KAAK;IACnC,IAAI,EAAE,MAAM,CAAA;gBACA,OAAO,EAAE,MAAM,EAAE,IAAI,SAAgB;CAKlD;AAED,qBAAa,iBAAkB,SAAQ,UAAU;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,oBAAqB,SAAQ,UAAU;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,gBAAiB,SAAQ,UAAU;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAID,MAAM,MAAM,WAAW,GACnB,SAAS,GACT,YAAY,GACZ,UAAU,GACV,gBAAgB,GAChB,YAAY,GACZ,eAAe,GACf,eAAe,GACf,YAAY,CAAA;AAEhB,MAAM,MAAM,sBAAsB,GAAG;IACnC,YAAY,EAAE,MAAM,CAAA;IACpB,
|
|
1
|
+
{"version":3,"file":"nip46.d.ts","sourceRoot":"","sources":["../src/nip46.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,aAAa,EAAmB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAInG,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAOnD,qBAAa,UAAW,SAAQ,KAAK;IACnC,IAAI,EAAE,MAAM,CAAA;gBACA,OAAO,EAAE,MAAM,EAAE,IAAI,SAAgB;CAKlD;AAED,qBAAa,iBAAkB,SAAQ,UAAU;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,oBAAqB,SAAQ,UAAU;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,gBAAiB,SAAQ,UAAU;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAID,MAAM,MAAM,WAAW,GACnB,SAAS,GACT,YAAY,GACZ,UAAU,GACV,gBAAgB,GAChB,YAAY,GACZ,eAAe,GACf,eAAe,GACf,eAAe,GACf,eAAe,GACf,YAAY,CAAA;AAEhB,MAAM,MAAM,sBAAsB,GAAG;IACnC,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAUD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,GAAG;IAAE,WAAW,CAAC,EAAE,gBAAgB,CAAA;CAAE,CAoC3G;AAID,qBAAa,YAAa,YAAW,MAAM;IACzC,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,GAAG,CAAkD;IAEtD,OAAO,SAAQ;gBAEV,gBAAgB,EAAE,MAAM,GAAG,sBAAsB;IAY7D,IAAI,SAAS,IAAI,OAAO,CAEvB;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoDxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC,KAAK,IAAI,IAAI;IAaP,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAO7B,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAI/B,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAK7D,KAAK;0BACqB,MAAM,aAAa,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;0BAG3C,MAAM,cAAc,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;MAGrE;IAED,KAAK;0BACqB,MAAM,aAAa,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;0BAG3C,MAAM,cAAc,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;MAGrE;IAEK,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC;YAOtB,YAAY;IAoC1B,OAAO,CAAC,eAAe;CA2BxB"}
|