ns-auth-sdk 1.2.6 → 1.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.d.mts CHANGED
@@ -1,214 +1,290 @@
1
- import { NostrKeyInfo, NostrEvent as NostrEvent$1 } from 'nosskey-sdk';
2
- import { EventStore } from 'applesauce-core';
3
- import * as react_jsx_runtime from 'react/jsx-runtime';
4
- import * as zustand from 'zustand';
1
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as zustand0 from "zustand";
3
+ import { EventStore } from "applesauce-core";
5
4
 
5
+ //#region src/utils/types.d.ts
6
+
7
+ /**
8
+ * Type definitions for Nosskey SDK (PRF Direct Usage Only)
9
+ * @packageDocumentation
10
+ */
11
+ /**
12
+ * Nostr event JSON
13
+ */
14
+ interface NostrEvent$1 {
15
+ id?: string;
16
+ pubkey?: string;
17
+ created_at?: number;
18
+ kind: number;
19
+ tags?: string[][];
20
+ content: string;
21
+ sig?: string;
22
+ }
23
+ /**
24
+ * Nostr key information (PRF)
25
+ * PWKBlob
26
+ */
27
+ interface NostrKeyInfo {
28
+ credentialId: string;
29
+ pubkey: string;
30
+ salt: string;
31
+ username?: string;
32
+ }
33
+ //#endregion
34
+ //#region src/types/auth.d.ts
6
35
  /**
7
36
  * Authentication state interface
8
37
  */
9
38
  interface AuthState {
10
- isAuthenticated: boolean;
11
- publicKey: string | null;
12
- keyInfo: NostrKeyInfo | null;
13
- loginError: string | null;
14
- setAuthenticated: (keyInfo: NostrKeyInfo | null) => void;
15
- setLoginError: (error: string | null) => void;
16
- logout: () => void;
39
+ isAuthenticated: boolean;
40
+ publicKey: string | null;
41
+ keyInfo: NostrKeyInfo | null;
42
+ loginError: string | null;
43
+ setAuthenticated: (keyInfo: NostrKeyInfo | null) => void;
44
+ setLoginError: (error: string | null) => void;
45
+ logout: () => void;
17
46
  }
18
47
  /**
19
48
  * Auth service configuration
20
49
  */
21
50
  interface AuthServiceConfig {
22
- rpId?: string;
23
- rpName?: string;
24
- storageKey?: string;
25
- cacheTimeoutMs?: number;
51
+ rpId?: string;
52
+ rpName?: string;
53
+ storageKey?: string;
54
+ cacheTimeoutMs?: number;
55
+ cacheOnCreation?: boolean;
26
56
  }
27
57
  /**
28
58
  * Relay service configuration
29
59
  */
30
60
  interface RelayServiceConfig {
31
- relayUrls?: string[];
61
+ relayUrls?: string[];
32
62
  }
33
-
63
+ //#endregion
64
+ //#region src/services/auth.service.d.ts
34
65
  /**
35
66
  * Service wrapper around NosskeyManager
36
67
  * Handles WebAuthn/Passkey integration with Nostr
37
68
  */
38
69
  declare class AuthService {
39
- private manager;
40
- private config;
41
- constructor(config?: AuthServiceConfig);
42
- private getDefaultRpName;
43
- /**
44
- * Initialize the NosskeyManager instance
45
- */
46
- private getManager;
47
- /**
48
- * Create a new passkey
49
- * Uses platform authenticator only (Touch ID, Face ID, Windows Hello)
50
- */
51
- createPasskey(username?: string): Promise<Uint8Array>;
52
- /**
53
- * Create a new Nostr key from a credential ID
54
- */
55
- createNostrKey(credentialId?: Uint8Array): Promise<NostrKeyInfo>;
56
- /**
57
- * Get the current public key
58
- */
59
- getPublicKey(): Promise<string>;
60
- /**
61
- * Sign a Nostr event
62
- */
63
- signEvent(event: NostrEvent$1): Promise<NostrEvent$1>;
64
- /**
65
- * Get current key info
66
- */
67
- getCurrentKeyInfo(): NostrKeyInfo | null;
68
- /**
69
- * Set current key info
70
- */
71
- setCurrentKeyInfo(keyInfo: NostrKeyInfo): void;
72
- /**
73
- * Check if key info exists
74
- */
75
- hasKeyInfo(): boolean;
76
- /**
77
- * Clear stored key info
78
- */
79
- clearStoredKeyInfo(): void;
80
- /**
81
- * Check if PRF is supported
82
- */
83
- isPrfSupported(): Promise<boolean>;
70
+ private manager;
71
+ private config;
72
+ constructor(config?: AuthServiceConfig);
73
+ private getDefaultRpName;
74
+ /**
75
+ * Initialize the NosskeyManager instance
76
+ */
77
+ private getManager;
78
+ /**
79
+ * Create a new passkey
80
+ * Uses platform authenticator only (Touch ID, Face ID, Windows Hello)
81
+ */
82
+ createPasskey(username?: string): Promise<Uint8Array>;
83
+ /**
84
+ * Create a new Nostr key from a credential ID
85
+ */
86
+ createNostrKey(credentialId?: Uint8Array): Promise<NostrKeyInfo>;
87
+ /**
88
+ * Get the current public key
89
+ */
90
+ getPublicKey(): Promise<string>;
91
+ /**
92
+ * Sign a Nostr event
93
+ */
94
+ signEvent(event: NostrEvent$1): Promise<NostrEvent$1>;
95
+ /**
96
+ * Get current key info
97
+ */
98
+ getCurrentKeyInfo(): NostrKeyInfo | null;
99
+ /**
100
+ * Set current key info
101
+ */
102
+ setCurrentKeyInfo(keyInfo: NostrKeyInfo): void;
103
+ /**
104
+ * Check if key info exists
105
+ */
106
+ hasKeyInfo(): boolean;
107
+ /**
108
+ * Clear stored key info
109
+ */
110
+ clearStoredKeyInfo(): void;
111
+ /**
112
+ * Check if PRF is supported
113
+ */
114
+ isPrfSupported(): Promise<boolean>;
84
115
  }
85
-
116
+ //#endregion
117
+ //#region src/types/nostr.d.ts
86
118
  /**
87
119
  * Nostr event types
88
120
  */
89
121
  interface NostrEvent {
90
- id?: string;
91
- pubkey?: string;
92
- created_at?: number;
93
- kind: number;
94
- tags?: string[][];
95
- content: string;
96
- sig?: string;
122
+ id?: string;
123
+ pubkey?: string;
124
+ created_at?: number;
125
+ kind: number;
126
+ tags?: string[][];
127
+ content: string;
128
+ sig?: string;
97
129
  }
98
130
  /**
99
131
  * Profile metadata (Kind 0)
100
132
  */
101
133
  interface ProfileMetadata {
102
- name?: string;
103
- display_name?: string;
104
- about?: string;
105
- picture?: string;
106
- website?: string;
107
- [key: string]: unknown;
134
+ name?: string;
135
+ display_name?: string;
136
+ about?: string;
137
+ picture?: string;
138
+ website?: string;
139
+ [key: string]: unknown;
108
140
  }
109
141
  /**
110
142
  * Follow list entry (from Kind 3 tags)
111
143
  */
112
144
  interface FollowEntry {
113
- pubkey: string;
114
- relay?: string;
115
- petname?: string;
145
+ pubkey: string;
146
+ relay?: string;
147
+ petname?: string;
116
148
  }
117
-
149
+ //#endregion
150
+ //#region src/services/relay.service.d.ts
118
151
  /**
119
152
  * Service for communicating with Nostr relays using applesauce-core
120
153
  */
121
154
  declare class RelayService {
122
- private eventStore;
123
- private relayUrls;
124
- private defaultRelays;
125
- constructor(config?: RelayServiceConfig);
126
- /**
127
- * Initialize with applesauce EventStore
128
- */
129
- initialize(eventStore: EventStore): void;
130
- /**
131
- * Set relay URLs
132
- */
133
- setRelays(urls: string[]): void;
134
- /**
135
- * Publish an event to relays
136
- */
137
- publishEvent(event: NostrEvent, timeoutMs?: number): Promise<boolean>;
138
- /**
139
- * Fetch a profile (Kind 0 event)
140
- */
141
- fetchProfile(pubkey: string): Promise<ProfileMetadata | null>;
142
- /**
143
- * Fetch role tag from profile event (Kind 0)
144
- */
145
- fetchProfileRoleTag(pubkey: string): Promise<string | null>;
146
- /**
147
- * Fetch a follow list (Kind 3 event)
148
- */
149
- fetchFollowList(pubkey: string): Promise<FollowEntry[]>;
150
- /**
151
- * Fetch multiple profiles in batch
152
- */
153
- fetchMultipleProfiles(pubkeys: string[]): Promise<Map<string, ProfileMetadata>>;
154
- /**
155
- * Query kind 0 events (profiles) by pubkey
156
- * If pubkeys array is empty, fetches recent kind 0 events
157
- */
158
- queryProfiles(pubkeys?: string[], limit?: number): Promise<Map<string, ProfileMetadata>>;
159
- /**
160
- * Publish or update a kind 3 event (follow list/contacts)
161
- */
162
- publishFollowList(pubkey: string, followList: FollowEntry[], signEvent: (event: NostrEvent) => Promise<NostrEvent>): Promise<boolean>;
155
+ private eventStore;
156
+ private relayUrls;
157
+ private defaultRelays;
158
+ private readonly maxProfileContentSize;
159
+ private readonly minProfileQueryIntervalMs;
160
+ private readonly minPublishIntervalMs;
161
+ private readonly lastActionAt;
162
+ constructor(config?: RelayServiceConfig);
163
+ /**
164
+ * Initialize with applesauce EventStore
165
+ */
166
+ initialize(eventStore: EventStore): void;
167
+ /**
168
+ * Set relay URLs
169
+ */
170
+ setRelays(urls: string[]): void;
171
+ /**
172
+ * Get current relay URLs
173
+ */
174
+ getRelays(): string[];
175
+ /**
176
+ * Publish an event to relays
177
+ */
178
+ publishEvent(event: NostrEvent, timeoutMs?: number): Promise<boolean>;
179
+ /**
180
+ * Fetch a profile (Kind 0 event)
181
+ */
182
+ fetchProfile(pubkey: string): Promise<ProfileMetadata | null>;
183
+ /**
184
+ * Fetch role tag from profile event (Kind 0)
185
+ */
186
+ fetchProfileRoleTag(pubkey: string): Promise<string | null>;
187
+ /**
188
+ * Fetch a follow list (Kind 3 event)
189
+ */
190
+ fetchFollowList(pubkey: string): Promise<FollowEntry[]>;
191
+ /**
192
+ * Fetch multiple profiles in batch
193
+ */
194
+ fetchMultipleProfiles(pubkeys: string[]): Promise<Map<string, ProfileMetadata>>;
195
+ /**
196
+ * Query kind 0 events (profiles) by pubkey
197
+ * If pubkeys array is empty, fetches recent kind 0 events
198
+ */
199
+ queryProfiles(pubkeys?: string[], limit?: number): Promise<Map<string, ProfileMetadata>>;
200
+ /**
201
+ * Publish or update a kind 3 event (follow list/contacts)
202
+ */
203
+ publishFollowList(pubkey: string, followList: FollowEntry[], signEvent: (event: NostrEvent) => Promise<NostrEvent>): Promise<boolean>;
204
+ private validateRelayUrls;
205
+ private parseProfileMetadata;
206
+ private enforceRateLimit;
163
207
  }
164
-
208
+ //#endregion
209
+ //#region src/components/auth/LoginButton.d.ts
165
210
  interface LoginButtonProps {
166
- authService: AuthService;
167
- setAuthenticated: AuthState['setAuthenticated'];
168
- setLoginError: AuthState['setLoginError'];
169
- onSuccess?: () => void;
211
+ authService: AuthService;
212
+ setAuthenticated: AuthState['setAuthenticated'];
213
+ setLoginError: AuthState['setLoginError'];
214
+ onSuccess?: () => void;
170
215
  }
171
- declare function LoginButton({ authService, setAuthenticated, setLoginError, onSuccess, }: LoginButtonProps): react_jsx_runtime.JSX.Element;
172
-
216
+ declare function LoginButton({
217
+ authService,
218
+ setAuthenticated,
219
+ setLoginError,
220
+ onSuccess
221
+ }: LoginButtonProps): react_jsx_runtime0.JSX.Element;
222
+ //#endregion
223
+ //#region src/components/auth/RegistrationFlow.d.ts
173
224
  interface RegistrationFlowProps {
174
- authService: AuthService;
175
- setAuthenticated: AuthState['setAuthenticated'];
176
- onSuccess?: () => void;
225
+ authService: AuthService;
226
+ setAuthenticated: AuthState['setAuthenticated'];
227
+ onSuccess?: () => void;
177
228
  }
178
- declare function RegistrationFlow({ authService, setAuthenticated, onSuccess, }: RegistrationFlowProps): react_jsx_runtime.JSX.Element;
179
-
229
+ declare function RegistrationFlow({
230
+ authService,
231
+ setAuthenticated,
232
+ onSuccess
233
+ }: RegistrationFlowProps): react_jsx_runtime0.JSX.Element;
234
+ //#endregion
235
+ //#region src/components/membership/MembershipPage.d.ts
180
236
  interface MembershipPageProps {
181
- authService: AuthService;
182
- relayService: RelayService;
183
- publicKey: string | null;
184
- onUnauthenticated?: () => void;
237
+ authService: AuthService;
238
+ relayService: RelayService;
239
+ publicKey: string | null;
240
+ onUnauthenticated?: () => void;
185
241
  }
186
- declare function MembershipPage({ authService, relayService, publicKey, onUnauthenticated, }: MembershipPageProps): react_jsx_runtime.JSX.Element;
187
-
242
+ declare function MembershipPage({
243
+ authService,
244
+ relayService,
245
+ publicKey,
246
+ onUnauthenticated
247
+ }: MembershipPageProps): react_jsx_runtime0.JSX.Element;
248
+ //#endregion
249
+ //#region src/components/membership/BarcodeScanner.d.ts
188
250
  interface BarcodeScannerProps {
189
- /** Called when a code is successfully read */
190
- onDecode: (value: string) => void;
191
- /** Optional flag to hide the scanner */
192
- active?: boolean;
251
+ /** Called when a code is successfully read */
252
+ onDecode: (value: string) => void;
253
+ /** Optional flag to hide the scanner */
254
+ active?: boolean;
193
255
  }
194
- declare const BarcodeScanner: ({ onDecode, active }: BarcodeScannerProps) => react_jsx_runtime.JSX.Element | null;
195
-
256
+ declare const BarcodeScanner: ({
257
+ onDecode,
258
+ active
259
+ }: BarcodeScannerProps) => react_jsx_runtime0.JSX.Element | null;
260
+ //#endregion
261
+ //#region src/components/profile/ProfilePage.d.ts
196
262
  interface ProfilePageProps {
197
- authService: AuthService;
198
- relayService: RelayService;
199
- publicKey: string | null;
200
- onUnauthenticated?: () => void;
201
- onSuccess?: () => void;
202
- onRoleSuggestion?: (about: string) => Promise<string | null>;
263
+ authService: AuthService;
264
+ relayService: RelayService;
265
+ publicKey: string | null;
266
+ onUnauthenticated?: () => void;
267
+ onSuccess?: () => void;
268
+ onRoleSuggestion?: (about: string) => Promise<string | null>;
203
269
  }
204
- declare function ProfilePage({ authService, relayService, publicKey, onUnauthenticated, onSuccess, onRoleSuggestion, }: ProfilePageProps): react_jsx_runtime.JSX.Element;
205
-
270
+ declare function ProfilePage({
271
+ authService,
272
+ relayService,
273
+ publicKey,
274
+ onUnauthenticated,
275
+ onSuccess,
276
+ onRoleSuggestion
277
+ }: ProfilePageProps): react_jsx_runtime0.JSX.Element;
278
+ //#endregion
279
+ //#region src/hooks/useAuth.d.ts
206
280
  /**
207
281
  * Hook to initialize auth state on app load
208
282
  */
209
283
  declare function useAuthInit(authService: AuthService, setAuthenticated: AuthState['setAuthenticated']): void;
210
-
211
- declare const createAuthStore: () => zustand.UseBoundStore<zustand.StoreApi<AuthState>>;
212
- declare const useAuthStore: zustand.UseBoundStore<zustand.StoreApi<AuthState>>;
213
-
284
+ //#endregion
285
+ //#region src/store/authStore.d.ts
286
+ declare const createAuthStore: () => zustand0.UseBoundStore<zustand0.StoreApi<AuthState>>;
287
+ declare const useAuthStore: zustand0.UseBoundStore<zustand0.StoreApi<AuthState>>;
288
+ //#endregion
214
289
  export { AuthService, type AuthServiceConfig, type AuthState, BarcodeScanner, type FollowEntry, LoginButton, MembershipPage, type NostrEvent, type ProfileMetadata, ProfilePage, RegistrationFlow, RelayService, type RelayServiceConfig, createAuthStore, useAuthInit, useAuthStore };
290
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/utils/types.ts","../src/types/auth.ts","../src/services/auth.service.ts","../src/types/nostr.ts","../src/services/relay.service.ts","../src/components/auth/LoginButton.tsx","../src/components/auth/RegistrationFlow.tsx","../src/components/membership/MembershipPage.tsx","../src/components/membership/BarcodeScanner.tsx","../src/components/profile/ProfilePage.tsx","../src/hooks/useAuth.ts","../src/store/authStore.ts"],"sourcesContent":[],"mappings":"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"}