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