paytaca-cli 0.3.2 → 0.4.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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,mCAAmC,CAAC;KAChD,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAA;AAChC,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAC3B,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAE7B,OAAO,CAAC,KAAK,EAAE,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAEzD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,mCAAmC,CAAC;KAChD,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAA;AAChC,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAC3B,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAE7B,OAAO,CAAC,KAAK,EAAE,CAAA"}
@@ -0,0 +1,42 @@
1
+ export interface UnsignedKind14 {
2
+ kind: 14;
3
+ pubkey: string;
4
+ created_at: number;
5
+ content: string;
6
+ tags: string[][];
7
+ id: string;
8
+ }
9
+ export interface Rumor {
10
+ kind: number;
11
+ pubkey: string;
12
+ created_at: number;
13
+ content: string;
14
+ tags: string[][];
15
+ id?: string;
16
+ }
17
+ export interface NostrEvent {
18
+ id: string;
19
+ pubkey: string;
20
+ created_at: number;
21
+ kind: number;
22
+ tags: string[][];
23
+ content: string;
24
+ sig: string;
25
+ }
26
+ export declare function createUnsignedKind14(opts: {
27
+ content: string;
28
+ senderPubKey: string;
29
+ members: string[];
30
+ subject?: string | null;
31
+ replyTo?: string;
32
+ editOf?: string;
33
+ }): UnsignedKind14;
34
+ export declare function tagSelfGiftWraps(giftWraps: NostrEvent[], recipientPubKeys: string[], senderPubKey: string): NostrEvent[];
35
+ export declare function createNip17GiftWraps(unsignedKind14: UnsignedKind14, senderPrivKey: string, receiverPubKeys: string[], senderPubKey?: string): Promise<NostrEvent[]>;
36
+ export declare function unwrapGiftWrap(giftWrap: NostrEvent, receiverPrivKey: string): {
37
+ rumor: Rumor;
38
+ sealPubkey: string;
39
+ };
40
+ export declare function computeRoomId(pubkeys: string[]): string;
41
+ export declare function createKind10050(relays: string[], privKey: string): NostrEvent;
42
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/nostr/chat.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,EAAE,CAAA;IACR,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;IAChB,EAAE,EAAE,MAAM,CAAA;CACX;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;IAChB,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,GAAG,cAAc,CAoBjB;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,UAAU,EAAE,EACvB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,YAAY,EAAE,MAAM,GACnB,UAAU,EAAE,CAOd;AAED,wBAAsB,oBAAoB,CACxC,cAAc,EAAE,cAAc,EAC9B,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,MAAM,EAAE,EACzB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,UAAU,EAAE,CAAC,CAOvB;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,UAAU,EACpB,eAAe,EAAE,MAAM,GACtB;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAYtC;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAIvD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAU7E"}
@@ -0,0 +1,72 @@
1
+ import { getEventHash, finalizeEvent, } from 'nostr-tools';
2
+ import { hexToBytes } from 'nostr-tools/utils';
3
+ import { nip44 } from 'nostr-tools';
4
+ import { nip59 } from 'nostr-tools';
5
+ import { sha256 } from 'js-sha256';
6
+ export function createUnsignedKind14(opts) {
7
+ const tags = [];
8
+ for (const member of opts.members) {
9
+ if (member !== opts.senderPubKey) {
10
+ tags.push(['p', member]);
11
+ }
12
+ }
13
+ if (opts.subject !== undefined && opts.subject !== null)
14
+ tags.push(['subject', opts.subject]);
15
+ if (opts.replyTo)
16
+ tags.push(['e', opts.replyTo]);
17
+ if (opts.editOf)
18
+ tags.push(['edit', opts.editOf]);
19
+ const event = {
20
+ kind: 14,
21
+ pubkey: opts.senderPubKey,
22
+ created_at: Math.floor(Date.now() / 1000),
23
+ content: opts.content,
24
+ tags,
25
+ };
26
+ event.id = getEventHash(event);
27
+ return event;
28
+ }
29
+ export function tagSelfGiftWraps(giftWraps, recipientPubKeys, senderPubKey) {
30
+ return giftWraps.map((gw, i) => {
31
+ if (i === 0 || recipientPubKeys[i - 1] === senderPubKey) {
32
+ return { ...gw, tags: [...gw.tags, ['self']] };
33
+ }
34
+ return gw;
35
+ });
36
+ }
37
+ export async function createNip17GiftWraps(unsignedKind14, senderPrivKey, receiverPubKeys, senderPubKey) {
38
+ const senderPrivKeyBytes = hexToBytes(senderPrivKey);
39
+ const giftWraps = nip59.wrapManyEvents(unsignedKind14, senderPrivKeyBytes, receiverPubKeys);
40
+ if (senderPubKey) {
41
+ return tagSelfGiftWraps(giftWraps, receiverPubKeys, senderPubKey);
42
+ }
43
+ return giftWraps;
44
+ }
45
+ export function unwrapGiftWrap(giftWrap, receiverPrivKey) {
46
+ const receiverPrivKeyBytes = hexToBytes(receiverPrivKey);
47
+ const rumor = nip59.unwrapEvent(giftWrap, receiverPrivKeyBytes);
48
+ const conversationKey = nip44.getConversationKey(receiverPrivKeyBytes, giftWrap.pubkey);
49
+ const sealJson = nip44.decrypt(giftWrap.content, conversationKey);
50
+ const seal = JSON.parse(sealJson);
51
+ if (seal.pubkey !== rumor.pubkey) {
52
+ throw new Error('Seal pubkey does not match rumor pubkey');
53
+ }
54
+ return { rumor, sealPubkey: rumor.pubkey };
55
+ }
56
+ export function computeRoomId(pubkeys) {
57
+ const sorted = pubkeys.slice().sort();
58
+ const hashInput = sorted.join(',');
59
+ return sha256(hashInput);
60
+ }
61
+ export function createKind10050(relays, privKey) {
62
+ const tags = relays.map(url => ['relay', url]);
63
+ const event = {
64
+ kind: 10050,
65
+ created_at: Math.floor(Date.now() / 1000),
66
+ tags,
67
+ content: '',
68
+ };
69
+ const privKeyBytes = hexToBytes(privKey);
70
+ return finalizeEvent(event, privKeyBytes);
71
+ }
72
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/nostr/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chat.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.test.d.ts","sourceRoot":"","sources":["../../src/nostr/chat.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,121 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { computeRoomId, createUnsignedKind14, createKind10050, tagSelfGiftWraps } from './chat.js';
3
+ const sender = 'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2';
4
+ describe('computeRoomId', () => {
5
+ it('should produce a deterministic 64-char hex string', () => {
6
+ const id = computeRoomId(['a', 'b']);
7
+ expect(id).toMatch(/^[0-9a-f]{64}$/);
8
+ });
9
+ it('should produce the same ID regardless of input order', () => {
10
+ const id1 = computeRoomId(['abc', 'def']);
11
+ const id2 = computeRoomId(['def', 'abc']);
12
+ expect(id1).toBe(id2);
13
+ });
14
+ it('should produce different IDs for different member sets', () => {
15
+ const id1 = computeRoomId(['abc', 'def']);
16
+ const id2 = computeRoomId(['abc', 'xyz']);
17
+ expect(id1).not.toBe(id2);
18
+ });
19
+ it('should handle a single member', () => {
20
+ const id = computeRoomId(['only']);
21
+ expect(id).toMatch(/^[0-9a-f]{64}$/);
22
+ });
23
+ });
24
+ describe('createUnsignedKind14', () => {
25
+ it('should create a kind 14 event with correct fields', () => {
26
+ const event = createUnsignedKind14({
27
+ content: 'hello',
28
+ senderPubKey: sender,
29
+ members: ['alice', 'bob', sender],
30
+ });
31
+ expect(event.kind).toBe(14);
32
+ expect(event.content).toBe('hello');
33
+ expect(event.pubkey).toBe(sender);
34
+ expect(event.id).toMatch(/^[0-9a-f]{64}$/);
35
+ });
36
+ it('should include p tags for non-self members only', () => {
37
+ const event = createUnsignedKind14({
38
+ content: 'test',
39
+ senderPubKey: sender,
40
+ members: ['alice', 'bob', sender],
41
+ });
42
+ const pTags = event.tags.filter(t => t[0] === 'p');
43
+ expect(pTags).toHaveLength(2);
44
+ expect(pTags[0][1]).toBe('alice');
45
+ expect(pTags[1][1]).toBe('bob');
46
+ });
47
+ it('should include subject tag when provided', () => {
48
+ const event = createUnsignedKind14({
49
+ content: 'hi',
50
+ senderPubKey: sender,
51
+ members: [sender, 'alice'],
52
+ subject: 'greeting',
53
+ });
54
+ const subject = event.tags.find(t => t[0] === 'subject');
55
+ expect(subject?.[1]).toBe('greeting');
56
+ });
57
+ it('should include e tag for replyTo', () => {
58
+ const event = createUnsignedKind14({
59
+ content: 'reply',
60
+ senderPubKey: sender,
61
+ members: [sender, 'alice'],
62
+ replyTo: 'abc123',
63
+ });
64
+ const eTag = event.tags.find(t => t[0] === 'e');
65
+ expect(eTag?.[1]).toBe('abc123');
66
+ });
67
+ it('should include edit tag for editOf', () => {
68
+ const event = createUnsignedKind14({
69
+ content: 'edit',
70
+ senderPubKey: sender,
71
+ members: [sender, 'alice'],
72
+ editOf: 'orig123',
73
+ });
74
+ const edit = event.tags.find(t => t[0] === 'edit');
75
+ expect(edit?.[1]).toBe('orig123');
76
+ });
77
+ });
78
+ describe('tagSelfGiftWraps', () => {
79
+ const makeGw = (overrides = {}) => ({
80
+ id: 'abc',
81
+ pubkey: 'sender',
82
+ created_at: 1000,
83
+ kind: 1059,
84
+ tags: [],
85
+ content: 'encrypted',
86
+ sig: 'sig',
87
+ ...overrides,
88
+ });
89
+ it('should add self tag to the first gift-wrap', () => {
90
+ const wraps = [makeGw()];
91
+ const result = tagSelfGiftWraps(wraps, ['bob'], 'sender');
92
+ expect(result[0].tags).toContainEqual(['self']);
93
+ });
94
+ it('should add self tag when previous recipient is the sender', () => {
95
+ const wraps = [makeGw(), makeGw({ id: 'def' })];
96
+ const result = tagSelfGiftWraps(wraps, ['sender', 'bob'], 'sender');
97
+ expect(result[0].tags).toContainEqual(['self']);
98
+ expect(result[1].tags).toContainEqual(['self']);
99
+ });
100
+ it('should not modify other gift-wraps', () => {
101
+ const wraps = [makeGw({ id: '1' }), makeGw({ id: '2' })];
102
+ const result = tagSelfGiftWraps(wraps, ['alice', 'bob'], 'sender');
103
+ expect(result[0].tags).toContainEqual(['self']);
104
+ expect(result[1].tags).toHaveLength(0);
105
+ });
106
+ });
107
+ describe('createKind10050', () => {
108
+ const testRelays = ['wss://relay1.com', 'wss://relay2.com'];
109
+ const privKeyHex = '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f';
110
+ it('should create a kind 10050 event with relay tags', () => {
111
+ const event = createKind10050(testRelays, privKeyHex);
112
+ expect(event.kind).toBe(10050);
113
+ expect(event.id).toMatch(/^[0-9a-f]{64}$/);
114
+ expect(event.sig).toMatch(/^[0-9a-f]{128}$/);
115
+ const relayTags = event.tags.filter(t => t[0] === 'relay');
116
+ expect(relayTags).toHaveLength(2);
117
+ expect(relayTags[0][1]).toBe('wss://relay1.com');
118
+ expect(relayTags[1][1]).toBe('wss://relay2.com');
119
+ });
120
+ });
121
+ //# sourceMappingURL=chat.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.test.js","sourceRoot":"","sources":["../../src/nostr/chat.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface NostrKeys {
2
+ privKeyHex: string;
3
+ pubKeyHex: string;
4
+ nsec: string;
5
+ npub: string;
6
+ }
7
+ export declare function deriveNostrKeys(mnemonic: string): NostrKeys;
8
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/nostr/keys.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAgB3D"}
@@ -0,0 +1,22 @@
1
+ import { mnemonicToSeedSync } from 'bip39';
2
+ import { binToHex, deriveHdPath, deriveHdPrivateNodeFromSeed, } from '@bitauth/libauth';
3
+ import { getPublicKey } from 'nostr-tools';
4
+ import { nsecEncode, npubEncode } from 'nostr-tools/nip19';
5
+ const NOSTR_DERIVATION_PATH = "m/44'/1237'/0'/0/0";
6
+ export function deriveNostrKeys(mnemonic) {
7
+ const seed = new Uint8Array(mnemonicToSeedSync(mnemonic));
8
+ const masterNode = deriveHdPrivateNodeFromSeed(seed);
9
+ if (!('valid' in masterNode) || !masterNode.valid) {
10
+ throw new Error('Failed to derive valid HD node from seed');
11
+ }
12
+ const nostrNode = deriveHdPath(masterNode, NOSTR_DERIVATION_PATH);
13
+ if (typeof nostrNode === 'string')
14
+ throw new Error(nostrNode);
15
+ const privKeyBytes = nostrNode.privateKey;
16
+ const privKeyHex = binToHex(privKeyBytes);
17
+ const pubKeyHex = getPublicKey(privKeyBytes);
18
+ const nsec = nsecEncode(privKeyBytes);
19
+ const npub = npubEncode(pubKeyHex);
20
+ return { privKeyHex, pubKeyHex, nsec, npub };
21
+ }
22
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/nostr/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,2BAA2B,GAE5B,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE1D,MAAM,qBAAqB,GAAG,oBAAoB,CAAA;AASlD,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAA;IACzD,MAAM,UAAU,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAA;IACpD,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAE,UAAkB,CAAC,KAAK,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IAC7D,CAAC;IACD,MAAM,SAAS,GAAG,YAAY,CAAC,UAAgC,EAAE,qBAAqB,CAAC,CAAA;IACvF,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAA;IAE7D,MAAM,YAAY,GAAI,SAAgC,CAAC,UAAU,CAAA;IACjE,MAAM,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAA;IACzC,MAAM,SAAS,GAAG,YAAY,CAAC,YAAY,CAAC,CAAA;IAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,CAAA;IACrC,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;IAElC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AAC9C,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { NostrEvent } from './chat.js';
2
+ export declare class RelayService {
3
+ private pool;
4
+ private subs;
5
+ private authSigner;
6
+ private pollInterval;
7
+ private keepaliveInterval;
8
+ private seenEventIds;
9
+ private resubscribeTimer;
10
+ private subscriptionCallbacks;
11
+ private _isSubscribed;
12
+ private subscribedRelays;
13
+ private subscribedPubKey;
14
+ private subscribing;
15
+ private activeSubRelays;
16
+ private static readonly KEEPALIVE_INTERVAL_MS;
17
+ private static readonly MAX_SEEN_EVENT_IDS;
18
+ private trimSeenEventIds;
19
+ private getPool;
20
+ setAuthKey(privKeyHex: string): void;
21
+ disconnect(): void;
22
+ isSubscribed(): boolean;
23
+ private scheduleResubscribe;
24
+ subscribeGiftWraps(relays: string[], myPubKey: string, callbacks?: {
25
+ onEvent?: (event: NostrEvent) => void;
26
+ }, options?: {
27
+ force?: boolean;
28
+ }): {
29
+ close(): void;
30
+ };
31
+ publish(relays: string[], eventOrEvents: NostrEvent | NostrEvent[]): Promise<{
32
+ accepted: string[];
33
+ errors: {
34
+ relay: string;
35
+ reason: string;
36
+ }[];
37
+ }>;
38
+ fetchKind10050(relays: string[], pubKey: string): Promise<NostrEvent | null>;
39
+ cleanup(): void;
40
+ fetchDisplayName(relays: string[], pubKey: string): Promise<string | null>;
41
+ fetchBchAddress(relays: string[], pubKey: string): Promise<string | null>;
42
+ fetchHistoricalGiftWraps(relays: string[], myPubKey: string, callbacks?: {
43
+ onEvent?: (event: NostrEvent) => void;
44
+ }): Promise<void>;
45
+ }
46
+ export declare const relayService: RelayService;
47
+ //# sourceMappingURL=relay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/nostr/relay.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAE3C,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,gBAAgB,CAA6C;IACrE,OAAO,CAAC,qBAAqB,CAAyD;IACtF,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,gBAAgB,CAAe;IACvC,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,eAAe,CAAoB;IAE3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAQ;IACrD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAO;IAEjD,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,OAAO;IAef,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAKpC,UAAU,IAAI,IAAI;IA4BlB,YAAY,IAAI,OAAO;IAIvB,OAAO,CAAC,mBAAmB;IAgB3B,kBAAkB,CAChB,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE;QAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;KAAO,EACzD,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAChC;QAAE,KAAK,IAAI,IAAI,CAAA;KAAE;IAiId,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;IA0CjJ,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAWlF,OAAO,IAAI,IAAI;IA8BT,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiB1E,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiBzE,wBAAwB,CAC5B,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE;QAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;KAAO,GACxD,OAAO,CAAC,IAAI,CAAC;CAYjB;AAWD,eAAO,MAAM,YAAY,cAAqB,CAAA"}