nostr-crypto-utils 0.4.12 → 0.4.13
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/README.md +52 -2
- package/dist/browser/343.nostr-crypto-utils.min.js +1 -0
- package/dist/browser/419.nostr-crypto-utils.min.js +1 -0
- package/dist/browser/crypto.nostr-crypto-utils.min.js +1 -1
- package/dist/browser/main.nostr-crypto-utils.min.js +1 -0
- package/dist/browser/protocol.nostr-crypto-utils.min.js +1 -1
- package/dist/cjs/event/index.d.ts +7 -0
- package/dist/cjs/event/index.d.ts.map +1 -0
- package/dist/cjs/event/index.js +15 -0
- package/dist/cjs/event/index.js.map +1 -0
- package/dist/cjs/event/signing.d.ts +12 -0
- package/dist/cjs/event/signing.d.ts.map +1 -1
- package/dist/cjs/event/signing.js +29 -0
- package/dist/cjs/event/signing.js.map +1 -1
- package/dist/cjs/index.d.ts +11 -8
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +58 -56
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/nips/nip-04.d.ts +1 -1
- package/dist/cjs/nips/nip-04.d.ts.map +1 -1
- package/dist/cjs/nips/nip-04.js +1 -0
- package/dist/cjs/nips/nip-04.js.map +1 -1
- package/dist/cjs/protocol/index.d.ts +9 -9
- package/dist/cjs/protocol/index.d.ts.map +1 -1
- package/dist/cjs/protocol/index.js +8 -9
- package/dist/cjs/protocol/index.js.map +1 -1
- package/dist/cjs/types/base.d.ts +45 -121
- package/dist/cjs/types/base.d.ts.map +1 -1
- package/dist/cjs/types/base.js +10 -28
- package/dist/cjs/types/base.js.map +1 -1
- package/dist/cjs/utils/encoding.d.ts +12 -0
- package/dist/cjs/utils/encoding.d.ts.map +1 -1
- package/dist/cjs/utils/encoding.js +18 -0
- package/dist/cjs/utils/encoding.js.map +1 -1
- package/dist/cjs/utils/integration.d.ts +14 -15
- package/dist/cjs/utils/integration.d.ts.map +1 -1
- package/dist/cjs/utils/integration.js +145 -98
- package/dist/cjs/utils/integration.js.map +1 -1
- package/dist/cjs/utils/logger.d.ts +17 -2
- package/dist/cjs/utils/logger.d.ts.map +1 -1
- package/dist/cjs/utils/logger.js +40 -3
- package/dist/cjs/utils/logger.js.map +1 -1
- package/dist/cjs/utils/validation.d.ts +6 -0
- package/dist/cjs/utils/validation.d.ts.map +1 -1
- package/dist/cjs/utils/validation.js +37 -0
- package/dist/cjs/utils/validation.js.map +1 -1
- package/dist/cjs/validation/keys.d.ts +7 -0
- package/dist/cjs/validation/keys.d.ts.map +1 -0
- package/dist/cjs/validation/keys.js +23 -0
- package/dist/cjs/validation/keys.js.map +1 -0
- package/dist/esm/event/index.d.ts +7 -0
- package/dist/esm/event/index.d.ts.map +1 -0
- package/dist/esm/event/index.js +7 -0
- package/dist/esm/event/index.js.map +1 -0
- package/dist/esm/event/signing.d.ts +12 -0
- package/dist/esm/event/signing.d.ts.map +1 -1
- package/dist/esm/event/signing.js +27 -0
- package/dist/esm/event/signing.js.map +1 -1
- package/dist/esm/index.d.ts +11 -8
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +16 -14
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/nips/nip-04.d.ts +1 -1
- package/dist/esm/nips/nip-04.d.ts.map +1 -1
- package/dist/esm/nips/nip-04.js +1 -0
- package/dist/esm/nips/nip-04.js.map +1 -1
- package/dist/esm/protocol/index.d.ts +9 -9
- package/dist/esm/protocol/index.d.ts.map +1 -1
- package/dist/esm/protocol/index.js +8 -9
- package/dist/esm/protocol/index.js.map +1 -1
- package/dist/esm/types/base.d.ts +45 -121
- package/dist/esm/types/base.d.ts.map +1 -1
- package/dist/esm/types/base.js +10 -28
- package/dist/esm/types/base.js.map +1 -1
- package/dist/esm/utils/encoding.d.ts +12 -0
- package/dist/esm/utils/encoding.d.ts.map +1 -1
- package/dist/esm/utils/encoding.js +16 -0
- package/dist/esm/utils/encoding.js.map +1 -1
- package/dist/esm/utils/integration.d.ts +14 -15
- package/dist/esm/utils/integration.d.ts.map +1 -1
- package/dist/esm/utils/integration.js +136 -89
- package/dist/esm/utils/integration.js.map +1 -1
- package/dist/esm/utils/logger.d.ts +17 -2
- package/dist/esm/utils/logger.d.ts.map +1 -1
- package/dist/esm/utils/logger.js +38 -2
- package/dist/esm/utils/logger.js.map +1 -1
- package/dist/esm/utils/validation.d.ts +6 -0
- package/dist/esm/utils/validation.d.ts.map +1 -1
- package/dist/esm/utils/validation.js +36 -0
- package/dist/esm/utils/validation.js.map +1 -1
- package/dist/esm/validation/keys.d.ts +7 -0
- package/dist/esm/validation/keys.d.ts.map +1 -0
- package/dist/esm/validation/keys.js +20 -0
- package/dist/esm/validation/keys.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/integration.test.ts +1 -1
- package/src/__tests__/types.test.ts +36 -242
- package/src/event/index.ts +7 -0
- package/src/event/signing.ts +29 -0
- package/src/index.ts +39 -47
- package/src/nips/nip-04.ts +2 -0
- package/src/protocol/index.ts +23 -14
- package/src/types/base.ts +58 -122
- package/src/utils/encoding.ts +18 -0
- package/src/utils/integration.ts +159 -107
- package/src/utils/logger.ts +46 -2
- package/src/utils/validation.ts +37 -0
- package/src/validation/keys.ts +19 -0
- package/dist/browser/551.nostr-crypto-utils.min.js +0 -1
- package/dist/browser/565.nostr-crypto-utils.min.js +0 -1
- package/dist/browser/69.nostr-crypto-utils.min.js +0 -1
- package/dist/browser/main-43dd7041.nostr-crypto-utils.min.js +0 -1
- package/dist/browser/main-7bd12dde.nostr-crypto-utils.min.js +0 -1
- package/dist/browser/main-d277ceb9.nostr-crypto-utils.min.js +0 -1
package/dist/esm/types/base.d.ts
CHANGED
|
@@ -2,199 +2,123 @@
|
|
|
2
2
|
* @module types/base
|
|
3
3
|
* @description Core type definitions for Nostr protocol
|
|
4
4
|
*/
|
|
5
|
-
/**
|
|
6
|
-
* Represents a public key in hex format
|
|
7
|
-
* @see https://github.com/nostr-protocol/nips/blob/master/01.md
|
|
8
|
-
*/
|
|
9
5
|
export type PublicKeyHex = string;
|
|
10
|
-
|
|
11
|
-
* Represents a public key with additional formats
|
|
12
|
-
* @see https://github.com/nostr-protocol/nips/blob/master/01.md
|
|
13
|
-
*/
|
|
6
|
+
export type PrivateKeyHex = string;
|
|
14
7
|
export interface PublicKeyDetails {
|
|
15
8
|
/** Public key in hex format */
|
|
16
9
|
hex: string;
|
|
10
|
+
/** NIP-05 identifier */
|
|
11
|
+
nip05: string;
|
|
12
|
+
/** Public key in bytes format */
|
|
13
|
+
bytes: Uint8Array;
|
|
17
14
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Public key can be either a hex string or a detailed object
|
|
20
|
-
*/
|
|
21
15
|
export type PublicKey = PublicKeyHex | PublicKeyDetails;
|
|
22
|
-
/**
|
|
23
|
-
* Key pair used for signing and encryption
|
|
24
|
-
* @see https://github.com/nostr-protocol/nips/blob/master/01.md
|
|
25
|
-
*/
|
|
26
16
|
export interface KeyPair {
|
|
27
17
|
/** Private key in hex format */
|
|
28
|
-
privateKey:
|
|
18
|
+
privateKey: PrivateKeyHex;
|
|
29
19
|
/** Public key details */
|
|
30
20
|
publicKey: PublicKeyDetails;
|
|
31
21
|
}
|
|
32
|
-
/**
|
|
33
|
-
* Enum defining all possible Nostr event kinds as specified in various NIPs
|
|
34
|
-
* @see https://github.com/nostr-protocol/nips
|
|
35
|
-
*/
|
|
36
22
|
export declare enum NostrEventKind {
|
|
37
|
-
/** NIP-01: Set metadata about the user */
|
|
38
23
|
SET_METADATA = 0,
|
|
39
|
-
/** NIP-01: Plain text note */
|
|
40
24
|
TEXT_NOTE = 1,
|
|
41
|
-
/** NIP-01: Recommend relay to followers */
|
|
42
25
|
RECOMMEND_SERVER = 2,
|
|
43
|
-
/** NIP-02: Contact list and relay list metadata */
|
|
44
26
|
CONTACTS = 3,
|
|
45
|
-
/** NIP-04: Encrypted direct message */
|
|
46
27
|
ENCRYPTED_DIRECT_MESSAGE = 4,
|
|
47
|
-
/** NIP-09: Event deletion */
|
|
48
28
|
EVENT_DELETION = 5,
|
|
49
|
-
|
|
29
|
+
REPOST = 6,
|
|
50
30
|
REACTION = 7,
|
|
51
|
-
|
|
52
|
-
CHANNEL_CREATE = 40,
|
|
53
|
-
/** NIP-28: Channel metadata */
|
|
31
|
+
CHANNEL_CREATION = 40,
|
|
54
32
|
CHANNEL_METADATA = 41,
|
|
55
|
-
/** NIP-28: Channel message */
|
|
56
33
|
CHANNEL_MESSAGE = 42,
|
|
57
|
-
/** NIP-28: Hide message in channel */
|
|
58
34
|
CHANNEL_HIDE_MESSAGE = 43,
|
|
59
|
-
/** NIP-28: Mute user in channel */
|
|
60
35
|
CHANNEL_MUTE_USER = 44,
|
|
61
|
-
/** NIP-42: Authentication */
|
|
62
36
|
AUTH = 22242,
|
|
63
|
-
/** NIP-42: Authentication response */
|
|
64
37
|
AUTH_RESPONSE = 22243
|
|
65
38
|
}
|
|
66
|
-
/**
|
|
67
|
-
|
|
68
|
-
* @see https://github.com/nostr-protocol/nips/blob/master/01.md
|
|
69
|
-
*/
|
|
70
|
-
export interface NostrEvent {
|
|
39
|
+
/** Base interface for all Nostr events */
|
|
40
|
+
export interface BaseNostrEvent {
|
|
71
41
|
/** Event kind as defined in NIPs */
|
|
72
|
-
kind:
|
|
42
|
+
kind: number;
|
|
73
43
|
/** Content of the event */
|
|
74
44
|
content: string;
|
|
75
|
-
/** Array of tags
|
|
45
|
+
/** Array of tags */
|
|
76
46
|
tags: string[][];
|
|
77
47
|
/** Unix timestamp in seconds */
|
|
78
48
|
created_at: number;
|
|
79
|
-
/** Public key of the event creator in hex format */
|
|
80
|
-
pubkey: string;
|
|
81
49
|
}
|
|
82
|
-
/**
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
50
|
+
/** Interface for events that haven't been signed yet */
|
|
51
|
+
export interface UnsignedNostrEvent extends BaseNostrEvent {
|
|
52
|
+
/** Optional public key */
|
|
53
|
+
pubkey?: string;
|
|
54
|
+
}
|
|
55
|
+
/** Interface for signed events */
|
|
56
|
+
export interface SignedNostrEvent extends BaseNostrEvent {
|
|
57
|
+
/** Public key of the event creator */
|
|
58
|
+
pubkey: string;
|
|
59
|
+
/** Event ID (sha256 of the serialized event) */
|
|
88
60
|
id: string;
|
|
89
61
|
/** Schnorr signature of the event ID */
|
|
90
62
|
sig: string;
|
|
91
63
|
}
|
|
92
|
-
/**
|
|
93
|
-
|
|
94
|
-
*/
|
|
95
|
-
export
|
|
96
|
-
/** Whether the validation passed */
|
|
97
|
-
isValid: boolean;
|
|
98
|
-
/** Error message if validation failed */
|
|
99
|
-
error?: string;
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Filter for Nostr events
|
|
103
|
-
* @see https://github.com/nostr-protocol/nips/blob/master/01.md
|
|
104
|
-
*/
|
|
64
|
+
/** Alias for backward compatibility */
|
|
65
|
+
export type NostrEvent = SignedNostrEvent;
|
|
66
|
+
/** Type for creating new events */
|
|
67
|
+
export type UnsignedEvent = Omit<NostrEvent, 'id' | 'sig'>;
|
|
105
68
|
export interface NostrFilter {
|
|
106
|
-
/** Filter by event IDs */
|
|
107
69
|
ids?: string[];
|
|
108
|
-
/** Filter by author public keys */
|
|
109
70
|
authors?: string[];
|
|
110
|
-
/** Filter by event kinds */
|
|
111
71
|
kinds?: NostrEventKind[];
|
|
112
|
-
/** Filter by start timestamp */
|
|
113
72
|
since?: number;
|
|
114
|
-
/** Filter by end timestamp */
|
|
115
73
|
until?: number;
|
|
116
|
-
/** Limit number of results */
|
|
117
74
|
limit?: number;
|
|
118
|
-
/** Filter by event references */
|
|
119
75
|
'#e'?: string[];
|
|
120
|
-
/** Filter by pubkey references */
|
|
121
76
|
'#p'?: string[];
|
|
122
|
-
/** Filter by arbitrary tag */
|
|
123
|
-
[key: `#${string}`]: string[] | undefined;
|
|
124
|
-
/** Full-text search query */
|
|
125
77
|
search?: string;
|
|
78
|
+
/** Support for arbitrary tags (NIP-12) */
|
|
79
|
+
[key: `#${string}`]: string[] | undefined;
|
|
126
80
|
}
|
|
127
|
-
/**
|
|
128
|
-
* Subscription for Nostr events
|
|
129
|
-
* @see https://github.com/nostr-protocol/nips/blob/master/01.md
|
|
130
|
-
*/
|
|
131
81
|
export interface NostrSubscription {
|
|
132
|
-
/** Unique subscription identifier */
|
|
133
82
|
id: string;
|
|
134
|
-
/** Array of filters to apply to the subscription */
|
|
135
83
|
filters: NostrFilter[];
|
|
136
84
|
}
|
|
137
|
-
/**
|
|
138
|
-
* Nostr message types for client-relay communication
|
|
139
|
-
* @see https://github.com/nostr-protocol/nips/blob/master/01.md
|
|
140
|
-
*/
|
|
141
85
|
export declare enum NostrMessageType {
|
|
142
86
|
EVENT = "EVENT",
|
|
143
|
-
REQ = "REQ",
|
|
144
|
-
CLOSE = "CLOSE",
|
|
145
87
|
NOTICE = "NOTICE",
|
|
146
|
-
EOSE = "EOSE",
|
|
147
88
|
OK = "OK",
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
89
|
+
EOSE = "EOSE",
|
|
90
|
+
REQ = "REQ",
|
|
91
|
+
CLOSE = "CLOSE",
|
|
92
|
+
AUTH = "AUTH"
|
|
151
93
|
}
|
|
152
|
-
/**
|
|
153
|
-
* Nostr message interface
|
|
154
|
-
*/
|
|
155
94
|
export interface NostrMessage {
|
|
156
|
-
/** Type of the message */
|
|
157
95
|
type: NostrMessageType;
|
|
158
|
-
|
|
159
|
-
|
|
96
|
+
event?: SignedNostrEvent;
|
|
97
|
+
subscriptionId?: string;
|
|
98
|
+
filters?: NostrFilter[];
|
|
99
|
+
eventId?: string;
|
|
100
|
+
accepted?: boolean;
|
|
101
|
+
message?: string;
|
|
102
|
+
count?: number;
|
|
103
|
+
payload?: string | (string | boolean)[];
|
|
160
104
|
}
|
|
161
|
-
/**
|
|
162
|
-
* Nostr response interface
|
|
163
|
-
*/
|
|
164
105
|
export interface NostrResponse {
|
|
165
|
-
/** Type of the response */
|
|
166
106
|
type: NostrMessageType;
|
|
167
|
-
/** Event data if applicable */
|
|
168
107
|
event?: SignedNostrEvent;
|
|
169
|
-
/** Subscription ID if applicable */
|
|
170
108
|
subscriptionId?: string;
|
|
171
|
-
/** Filters if applicable */
|
|
172
109
|
filters?: NostrFilter[];
|
|
173
|
-
/** Event ID if applicable */
|
|
174
110
|
eventId?: string;
|
|
175
|
-
/** Whether the request was accepted */
|
|
176
111
|
accepted?: boolean;
|
|
177
|
-
/** Message if applicable */
|
|
178
112
|
message?: string;
|
|
113
|
+
count?: number;
|
|
114
|
+
}
|
|
115
|
+
export interface ValidationResult {
|
|
116
|
+
isValid: boolean;
|
|
117
|
+
error?: string;
|
|
179
118
|
}
|
|
180
|
-
/**
|
|
181
|
-
* Nostr error interface
|
|
182
|
-
*/
|
|
183
119
|
export interface NostrError {
|
|
184
|
-
/** Error code */
|
|
185
120
|
code: string;
|
|
186
|
-
/** Error message */
|
|
187
121
|
message: string;
|
|
188
|
-
/** Additional error details */
|
|
189
122
|
details?: Record<string, unknown>;
|
|
190
123
|
}
|
|
191
|
-
/**
|
|
192
|
-
* Encryption result interface
|
|
193
|
-
*/
|
|
194
|
-
export interface EncryptionResult {
|
|
195
|
-
/** Encrypted ciphertext */
|
|
196
|
-
ciphertext: string;
|
|
197
|
-
/** Initialization vector */
|
|
198
|
-
iv: string;
|
|
199
|
-
}
|
|
200
124
|
//# sourceMappingURL=base.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/types/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/types/base.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/types/base.js
CHANGED
|
@@ -2,55 +2,37 @@
|
|
|
2
2
|
* @module types/base
|
|
3
3
|
* @description Core type definitions for Nostr protocol
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
* Enum defining all possible Nostr event kinds as specified in various NIPs
|
|
7
|
-
* @see https://github.com/nostr-protocol/nips
|
|
8
|
-
*/
|
|
5
|
+
// Event Types
|
|
9
6
|
export var NostrEventKind;
|
|
10
7
|
(function (NostrEventKind) {
|
|
11
|
-
|
|
8
|
+
// NIP-01: Core Protocol
|
|
12
9
|
NostrEventKind[NostrEventKind["SET_METADATA"] = 0] = "SET_METADATA";
|
|
13
|
-
/** NIP-01: Plain text note */
|
|
14
10
|
NostrEventKind[NostrEventKind["TEXT_NOTE"] = 1] = "TEXT_NOTE";
|
|
15
|
-
/** NIP-01: Recommend relay to followers */
|
|
16
11
|
NostrEventKind[NostrEventKind["RECOMMEND_SERVER"] = 2] = "RECOMMEND_SERVER";
|
|
17
|
-
/** NIP-02: Contact list and relay list metadata */
|
|
18
12
|
NostrEventKind[NostrEventKind["CONTACTS"] = 3] = "CONTACTS";
|
|
19
|
-
/** NIP-04: Encrypted direct message */
|
|
20
13
|
NostrEventKind[NostrEventKind["ENCRYPTED_DIRECT_MESSAGE"] = 4] = "ENCRYPTED_DIRECT_MESSAGE";
|
|
21
|
-
/** NIP-09: Event deletion */
|
|
22
14
|
NostrEventKind[NostrEventKind["EVENT_DELETION"] = 5] = "EVENT_DELETION";
|
|
23
|
-
|
|
15
|
+
NostrEventKind[NostrEventKind["REPOST"] = 6] = "REPOST";
|
|
24
16
|
NostrEventKind[NostrEventKind["REACTION"] = 7] = "REACTION";
|
|
25
|
-
|
|
26
|
-
NostrEventKind[NostrEventKind["
|
|
27
|
-
/** NIP-28: Channel metadata */
|
|
17
|
+
// NIP-28: Public Chat
|
|
18
|
+
NostrEventKind[NostrEventKind["CHANNEL_CREATION"] = 40] = "CHANNEL_CREATION";
|
|
28
19
|
NostrEventKind[NostrEventKind["CHANNEL_METADATA"] = 41] = "CHANNEL_METADATA";
|
|
29
|
-
/** NIP-28: Channel message */
|
|
30
20
|
NostrEventKind[NostrEventKind["CHANNEL_MESSAGE"] = 42] = "CHANNEL_MESSAGE";
|
|
31
|
-
/** NIP-28: Hide message in channel */
|
|
32
21
|
NostrEventKind[NostrEventKind["CHANNEL_HIDE_MESSAGE"] = 43] = "CHANNEL_HIDE_MESSAGE";
|
|
33
|
-
/** NIP-28: Mute user in channel */
|
|
34
22
|
NostrEventKind[NostrEventKind["CHANNEL_MUTE_USER"] = 44] = "CHANNEL_MUTE_USER";
|
|
35
|
-
|
|
23
|
+
// NIP-42: Authentication
|
|
36
24
|
NostrEventKind[NostrEventKind["AUTH"] = 22242] = "AUTH";
|
|
37
|
-
/** NIP-42: Authentication response */
|
|
38
25
|
NostrEventKind[NostrEventKind["AUTH_RESPONSE"] = 22243] = "AUTH_RESPONSE";
|
|
39
26
|
})(NostrEventKind || (NostrEventKind = {}));
|
|
40
|
-
|
|
41
|
-
* Nostr message types for client-relay communication
|
|
42
|
-
* @see https://github.com/nostr-protocol/nips/blob/master/01.md
|
|
43
|
-
*/
|
|
27
|
+
// Message Types
|
|
44
28
|
export var NostrMessageType;
|
|
45
29
|
(function (NostrMessageType) {
|
|
46
30
|
NostrMessageType["EVENT"] = "EVENT";
|
|
47
|
-
NostrMessageType["REQ"] = "REQ";
|
|
48
|
-
NostrMessageType["CLOSE"] = "CLOSE";
|
|
49
31
|
NostrMessageType["NOTICE"] = "NOTICE";
|
|
50
|
-
NostrMessageType["EOSE"] = "EOSE";
|
|
51
32
|
NostrMessageType["OK"] = "OK";
|
|
33
|
+
NostrMessageType["EOSE"] = "EOSE";
|
|
34
|
+
NostrMessageType["REQ"] = "REQ";
|
|
35
|
+
NostrMessageType["CLOSE"] = "CLOSE";
|
|
52
36
|
NostrMessageType["AUTH"] = "AUTH";
|
|
53
|
-
NostrMessageType["ERROR"] = "ERROR";
|
|
54
|
-
NostrMessageType["COUNT"] = "COUNT";
|
|
55
37
|
})(NostrMessageType || (NostrMessageType = {}));
|
|
56
38
|
//# sourceMappingURL=base.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/types/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/types/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,cAAc;AACd,MAAM,CAAN,IAAY,cAqBX;AArBD,WAAY,cAAc;IACxB,wBAAwB;IACxB,mEAAgB,CAAA;IAChB,6DAAa,CAAA;IACb,2EAAoB,CAAA;IACpB,2DAAY,CAAA;IACZ,2FAA4B,CAAA;IAC5B,uEAAkB,CAAA;IAClB,uDAAU,CAAA;IACV,2DAAY,CAAA;IAEZ,sBAAsB;IACtB,4EAAqB,CAAA;IACrB,4EAAqB,CAAA;IACrB,0EAAoB,CAAA;IACpB,oFAAyB,CAAA;IACzB,8EAAsB,CAAA;IAEtB,yBAAyB;IACzB,uDAAY,CAAA;IACZ,yEAAqB,CAAA;AACvB,CAAC,EArBW,cAAc,KAAd,cAAc,QAqBzB;AAwDD,gBAAgB;AAChB,MAAM,CAAN,IAAY,gBAQX;AARD,WAAY,gBAAgB;IAC1B,mCAAe,CAAA;IACf,qCAAiB,CAAA;IACjB,6BAAS,CAAA;IACT,iCAAa,CAAA;IACb,+BAAW,CAAA;IACX,mCAAe,CAAA;IACf,iCAAa,CAAA;AACf,CAAC,EARW,gBAAgB,KAAhB,gBAAgB,QAQ3B"}
|
|
@@ -13,4 +13,16 @@ export declare function hexToBytes(hex: string): Uint8Array;
|
|
|
13
13
|
* @returns Hex string
|
|
14
14
|
*/
|
|
15
15
|
export declare function bytesToHex(bytes: Uint8Array): string;
|
|
16
|
+
/**
|
|
17
|
+
* Convert a UTF-8 string to Uint8Array
|
|
18
|
+
* @param str UTF-8 string to convert
|
|
19
|
+
* @returns Uint8Array of bytes
|
|
20
|
+
*/
|
|
21
|
+
export declare function utf8ToBytes(str: string): Uint8Array;
|
|
22
|
+
/**
|
|
23
|
+
* Convert Uint8Array to UTF-8 string
|
|
24
|
+
* @param bytes Uint8Array to convert
|
|
25
|
+
* @returns UTF-8 string
|
|
26
|
+
*/
|
|
27
|
+
export declare function bytesToUtf8(bytes: Uint8Array): string;
|
|
16
28
|
//# sourceMappingURL=encoding.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../../src/utils/encoding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAMlD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD"}
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../../src/utils/encoding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAMlD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAErD"}
|
|
@@ -23,4 +23,20 @@ export function bytesToHex(bytes) {
|
|
|
23
23
|
.map(b => b.toString(16).padStart(2, '0'))
|
|
24
24
|
.join('');
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Convert a UTF-8 string to Uint8Array
|
|
28
|
+
* @param str UTF-8 string to convert
|
|
29
|
+
* @returns Uint8Array of bytes
|
|
30
|
+
*/
|
|
31
|
+
export function utf8ToBytes(str) {
|
|
32
|
+
return new TextEncoder().encode(str);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Convert Uint8Array to UTF-8 string
|
|
36
|
+
* @param bytes Uint8Array to convert
|
|
37
|
+
* @returns UTF-8 string
|
|
38
|
+
*/
|
|
39
|
+
export function bytesToUtf8(bytes) {
|
|
40
|
+
return new TextDecoder().decode(bytes);
|
|
41
|
+
}
|
|
26
42
|
//# sourceMappingURL=encoding.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../../src/utils/encoding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IAClC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAiB;IACxC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SACnB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SACzC,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
1
|
+
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../../src/utils/encoding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IAClC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAiB;IACxC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SACnB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SACzC,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACnC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAAiB;IACzC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -1,24 +1,23 @@
|
|
|
1
|
-
import { NostrEvent, NostrFilter, NostrEventKind, SignedNostrEvent, NostrMessage } from '../types/base
|
|
2
|
-
import { NostrMessageTuple } from '../types/messages.js';
|
|
1
|
+
import { NostrEvent, NostrFilter, NostrEventKind, SignedNostrEvent, NostrMessage, UnsignedEvent } from '../types/base';
|
|
3
2
|
/**
|
|
4
3
|
* Format event for relay transmission
|
|
5
4
|
*/
|
|
6
|
-
export declare function formatEventForRelay(event: SignedNostrEvent):
|
|
5
|
+
export declare function formatEventForRelay(event: SignedNostrEvent): [string, SignedNostrEvent];
|
|
7
6
|
/**
|
|
8
7
|
* Format subscription for relay transmission
|
|
9
8
|
*/
|
|
10
9
|
export declare function formatSubscriptionForRelay(subscription: {
|
|
11
10
|
id: string;
|
|
12
11
|
filters: NostrFilter[];
|
|
13
|
-
}):
|
|
12
|
+
}): [string, string, ...NostrFilter[]];
|
|
14
13
|
/**
|
|
15
14
|
* Format close message for relay transmission
|
|
16
15
|
*/
|
|
17
|
-
export declare function formatCloseForRelay(subscriptionId: string):
|
|
16
|
+
export declare function formatCloseForRelay(subscriptionId: string): [string, string];
|
|
18
17
|
/**
|
|
19
18
|
* Format auth message for relay transmission
|
|
20
19
|
*/
|
|
21
|
-
export declare function formatAuthForRelay(event: SignedNostrEvent):
|
|
20
|
+
export declare function formatAuthForRelay(event: SignedNostrEvent): [string, SignedNostrEvent];
|
|
22
21
|
/**
|
|
23
22
|
* Parse a message from a relay
|
|
24
23
|
*/
|
|
@@ -26,23 +25,23 @@ export declare function parseNostrMessage(message: string | unknown[]): NostrMes
|
|
|
26
25
|
/**
|
|
27
26
|
* Create a metadata event
|
|
28
27
|
*/
|
|
29
|
-
export declare function createMetadataEvent(metadata: Record<string, string>):
|
|
28
|
+
export declare function createMetadataEvent(metadata: Record<string, string>): UnsignedEvent;
|
|
30
29
|
/**
|
|
31
30
|
* Create a text note event
|
|
32
31
|
*/
|
|
33
|
-
export declare function createTextNoteEvent(content: string, replyTo?: string, mentions?: string[]):
|
|
32
|
+
export declare function createTextNoteEvent(content: string, replyTo?: string, mentions?: string[]): UnsignedEvent;
|
|
34
33
|
/**
|
|
35
34
|
* Create a direct message event
|
|
36
35
|
*/
|
|
37
|
-
export declare function createDirectMessageEvent(recipientPubkey: string, content: string):
|
|
36
|
+
export declare function createDirectMessageEvent(recipientPubkey: string, content: string): UnsignedEvent;
|
|
38
37
|
/**
|
|
39
38
|
* Create a channel message event
|
|
40
39
|
*/
|
|
41
|
-
export declare function createChannelMessageEvent(channelId: string, content: string, replyTo?: string):
|
|
40
|
+
export declare function createChannelMessageEvent(channelId: string, content: string, replyTo?: string): UnsignedEvent;
|
|
42
41
|
/**
|
|
43
42
|
* Extract referenced events from tags
|
|
44
43
|
*/
|
|
45
|
-
export declare function extractReferencedEvents(event:
|
|
44
|
+
export declare function extractReferencedEvents(event: NostrEvent): string[];
|
|
46
45
|
/**
|
|
47
46
|
* Extract mentioned pubkeys from an event
|
|
48
47
|
*/
|
|
@@ -62,17 +61,17 @@ export declare function createReplyFilter(eventId: string, limit?: number): Nost
|
|
|
62
61
|
/**
|
|
63
62
|
* Creates a mock text note event for testing
|
|
64
63
|
*/
|
|
65
|
-
export declare function createMockTextNote(content?: string):
|
|
64
|
+
export declare function createMockTextNote(content?: string): UnsignedEvent;
|
|
66
65
|
/**
|
|
67
66
|
* Creates a mock metadata event for testing
|
|
68
67
|
*/
|
|
69
|
-
export declare function createMockMetadataEvent(metadata?: Record<string, string>):
|
|
68
|
+
export declare function createMockMetadataEvent(metadata?: Record<string, string>): UnsignedEvent;
|
|
70
69
|
/**
|
|
71
70
|
* Creates a mock direct message event for testing
|
|
72
71
|
*/
|
|
73
|
-
export declare function createMockDirectMessage(content?: string):
|
|
72
|
+
export declare function createMockDirectMessage(content?: string): UnsignedEvent;
|
|
74
73
|
/**
|
|
75
74
|
* Creates a mock channel message event for testing
|
|
76
75
|
*/
|
|
77
|
-
export declare function createMockChannelMessage(content?: string):
|
|
76
|
+
export declare function createMockChannelMessage(content?: string): UnsignedEvent;
|
|
78
77
|
//# sourceMappingURL=integration.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../src/utils/integration.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,WAAW,EACX,cAAc,EACd,gBAAgB,
|
|
1
|
+
{"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../src/utils/integration.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,WAAW,EACX,cAAc,EACd,gBAAgB,EAEhB,YAAY,EACZ,aAAa,EACd,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAEvF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,YAAY,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC,CAEnI;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAE5E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAEtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,YAAY,CAkH3E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa,CAQnF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,aAAa,CAkBzG;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAQhG;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAa7G;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE,CAInE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE,CAInE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAMlF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,cAAc,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CASxG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAS9E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,SAAkB,GAAG,aAAa,CAQ3E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,aAAa,CAQ5F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,SAAW,GAAG,aAAa,CAQzE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,SAAoB,GAAG,aAAa,CAQnF"}
|