@reifydb/auth 0.5.5

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.
@@ -0,0 +1,84 @@
1
+ import { LoginChallengeResult, HttpClient, JsonHttpClient, JsonWsClient, WsClient } from '@reifydb/client';
2
+ export * from '@reifydb/client';
3
+ export { LoginChallengeResult } from '@reifydb/client';
4
+ import React, { ReactNode, ReactElement } from 'react';
5
+ export * from '@reifydb/core';
6
+
7
+ type AuthStatus = "disconnected" | "verifying" | "signing" | "authenticated" | "error";
8
+ interface AuthSession {
9
+ readonly token: string;
10
+ readonly identity: string;
11
+ readonly wallet_address: string;
12
+ readonly expires_at: number;
13
+ }
14
+ interface AuthState {
15
+ readonly status: AuthStatus;
16
+ readonly session: AuthSession | null;
17
+ readonly clientReady: boolean;
18
+ readonly error: string | null;
19
+ }
20
+ interface WalletConnector {
21
+ readonly connected: boolean;
22
+ readonly connecting: boolean;
23
+ readonly publicKey: string | null;
24
+ readonly hasSelectedWallet: boolean;
25
+ signMessage(message: Uint8Array): Promise<Uint8Array>;
26
+ encodeSignature(bytes: Uint8Array): string;
27
+ }
28
+ interface AuthCapableClient {
29
+ login_challenge(method: string, credentials: Record<string, string>): Promise<LoginChallengeResult>;
30
+ logout(): Promise<void>;
31
+ }
32
+
33
+ interface AuthTransport<TClient extends AuthCapableClient = AuthCapableClient> {
34
+ readonly kind: "ws" | "http";
35
+ connect(url: string, token?: string): Promise<TClient>;
36
+ release(client: TClient): void;
37
+ }
38
+ declare const ws_transport: AuthTransport<WsClient>;
39
+ declare const http_transport: AuthTransport<HttpClient>;
40
+ declare const json_ws_transport: AuthTransport<JsonWsClient>;
41
+ declare const json_http_transport: AuthTransport<JsonHttpClient>;
42
+
43
+ interface AuthContextValue extends AuthState {
44
+ signIn(): Promise<void>;
45
+ signOut(): Promise<void>;
46
+ }
47
+ declare const AuthContext: React.Context<AuthContextValue | null>;
48
+ interface AuthProviderProps<TClient extends AuthCapableClient = AuthCapableClient> {
49
+ url: string;
50
+ transport: AuthTransport<TClient>;
51
+ storageNamespace: string;
52
+ method: string;
53
+ domain: string;
54
+ statement: string;
55
+ sessionTtlSeconds?: number;
56
+ wallet: WalletConnector;
57
+ children: ReactNode;
58
+ }
59
+ declare function AuthProvider<TClient extends AuthCapableClient>(props: AuthProviderProps<TClient>): ReactElement;
60
+
61
+ declare function useAuth(): AuthContextValue;
62
+ declare function useAuthClient<TClient extends AuthCapableClient = AuthCapableClient>(): TClient;
63
+
64
+ interface SignInArgs<TClient extends AuthCapableClient = AuthCapableClient> {
65
+ url: string;
66
+ transport: AuthTransport<TClient>;
67
+ method: string;
68
+ wallet: Pick<WalletConnector, "publicKey" | "signMessage" | "encodeSignature">;
69
+ domain: string;
70
+ statement: string;
71
+ sessionTtlSeconds: number;
72
+ }
73
+ declare function performSignIn<TClient extends AuthCapableClient>(args: SignInArgs<TClient>): Promise<AuthSession>;
74
+
75
+ declare function readStoredSession(namespace: string): AuthSession | null;
76
+ declare function writeStoredSession(namespace: string, session: AuthSession): void;
77
+ declare function clearStoredSession(namespace: string): void;
78
+ declare function storageKeyFor(namespace: string): string;
79
+
80
+ declare function ensureClient<T extends AuthCapableClient>(transport: AuthTransport<T>, url: string, token: string): Promise<T>;
81
+ declare function clearClient(): void;
82
+ declare function currentClient<T extends AuthCapableClient = AuthCapableClient>(): T;
83
+
84
+ export { type AuthCapableClient, AuthContext, type AuthContextValue, AuthProvider, type AuthProviderProps, type AuthSession, type AuthState, type AuthStatus, type AuthTransport, type SignInArgs, type WalletConnector, clearClient, clearStoredSession, currentClient, ensureClient, http_transport, json_http_transport, json_ws_transport, performSignIn, readStoredSession, storageKeyFor, useAuth, useAuthClient, writeStoredSession, ws_transport };
package/dist/index.js ADDED
@@ -0,0 +1,437 @@
1
+ // src/transport.ts
2
+ import {
3
+ Client
4
+ } from "@reifydb/client";
5
+ function release_with_disconnect(client) {
6
+ if (typeof client.disconnect === "function") {
7
+ try {
8
+ client.disconnect();
9
+ } catch {
10
+ }
11
+ }
12
+ }
13
+ var ws_transport = {
14
+ kind: "ws",
15
+ async connect(url, token) {
16
+ return Client.connect_ws(
17
+ url,
18
+ token != null ? { format: "rbcf", token } : { format: "rbcf" }
19
+ );
20
+ },
21
+ release(client) {
22
+ release_with_disconnect(client);
23
+ }
24
+ };
25
+ var http_transport = {
26
+ kind: "http",
27
+ async connect(url, token) {
28
+ return Client.connect_http(
29
+ url,
30
+ token != null ? { format: "rbcf", token } : { format: "rbcf" }
31
+ );
32
+ },
33
+ release(_client) {
34
+ }
35
+ };
36
+ var json_ws_transport = {
37
+ kind: "ws",
38
+ async connect(url, token) {
39
+ return Client.connect_json_ws(url, token != null ? { token } : void 0);
40
+ },
41
+ release(client) {
42
+ release_with_disconnect(client);
43
+ }
44
+ };
45
+ var json_http_transport = {
46
+ kind: "http",
47
+ async connect(url, token) {
48
+ return Client.connect_json_http(url, token != null ? { token } : void 0);
49
+ },
50
+ release(_client) {
51
+ }
52
+ };
53
+
54
+ // src/auth-provider.tsx
55
+ import {
56
+ createContext,
57
+ useCallback,
58
+ useEffect,
59
+ useMemo,
60
+ useRef,
61
+ useState
62
+ } from "react";
63
+
64
+ // src/client-cache.ts
65
+ var current_key = null;
66
+ var current_client = null;
67
+ var current_transport = null;
68
+ var pending_promise = null;
69
+ function key_of(kind, url, token) {
70
+ return `${kind}|${url}|${token}`;
71
+ }
72
+ async function ensureClient(transport, url, token) {
73
+ const key = key_of(transport.kind, url, token);
74
+ if (current_key === key) {
75
+ if (current_client) return current_client;
76
+ if (pending_promise) return pending_promise;
77
+ }
78
+ if (current_client && current_transport) {
79
+ try {
80
+ current_transport.release(current_client);
81
+ } catch {
82
+ }
83
+ current_client = null;
84
+ }
85
+ current_key = key;
86
+ current_transport = transport;
87
+ const p = transport.connect(url, token).then((client) => {
88
+ if (current_key !== key) {
89
+ try {
90
+ transport.release(client);
91
+ } catch {
92
+ }
93
+ throw new Error("@reifydb/auth: client connect superseded");
94
+ }
95
+ current_client = client;
96
+ pending_promise = null;
97
+ return client;
98
+ });
99
+ pending_promise = p;
100
+ return p;
101
+ }
102
+ function clearClient() {
103
+ if (current_client && current_transport) {
104
+ try {
105
+ current_transport.release(current_client);
106
+ } catch {
107
+ }
108
+ }
109
+ current_key = null;
110
+ current_client = null;
111
+ current_transport = null;
112
+ pending_promise = null;
113
+ }
114
+ function currentClient() {
115
+ if (!current_client) {
116
+ throw new Error("@reifydb/auth: no authenticated client; call ensureClient first");
117
+ }
118
+ return current_client;
119
+ }
120
+
121
+ // src/sign-in.ts
122
+ async function performSignIn(args) {
123
+ const { url, transport, method, wallet, domain, statement, sessionTtlSeconds } = args;
124
+ const wallet_address = wallet.publicKey;
125
+ if (wallet_address == null || wallet_address.length === 0) {
126
+ throw new Error("@reifydb/auth: wallet.publicKey is required to sign in");
127
+ }
128
+ if (!Number.isFinite(sessionTtlSeconds) || sessionTtlSeconds <= 0) {
129
+ throw new Error("@reifydb/auth: sessionTtlSeconds must be a positive number");
130
+ }
131
+ const client = await transport.connect(url);
132
+ try {
133
+ const challenge = await client.login_challenge(method, {
134
+ identifier: wallet_address,
135
+ public_key: wallet_address,
136
+ domain,
137
+ statement
138
+ });
139
+ if (challenge.kind !== "challenge") {
140
+ throw new Error(
141
+ `@reifydb/auth: expected challenge response, got ${challenge.kind}`
142
+ );
143
+ }
144
+ const messageBytes = new TextEncoder().encode(challenge.message);
145
+ const signatureBytes = await wallet.signMessage(messageBytes);
146
+ const signature = wallet.encodeSignature(signatureBytes);
147
+ const auth = await client.login_challenge(method, {
148
+ challenge_id: challenge.challenge_id,
149
+ signature,
150
+ signed_message: challenge.message
151
+ });
152
+ if (auth.kind !== "authenticated") {
153
+ throw new Error(
154
+ `@reifydb/auth: expected authenticated response, got ${auth.kind}`
155
+ );
156
+ }
157
+ return {
158
+ token: auth.token,
159
+ identity: auth.identity,
160
+ wallet_address,
161
+ expires_at: Math.floor(Date.now() / 1e3) + sessionTtlSeconds
162
+ };
163
+ } finally {
164
+ transport.release(client);
165
+ }
166
+ }
167
+
168
+ // src/storage.ts
169
+ var SUFFIX = ".auth";
170
+ function key_for(namespace) {
171
+ return `${namespace}${SUFFIX}`;
172
+ }
173
+ function is_auth_session(v) {
174
+ if (v === null || typeof v !== "object") return false;
175
+ const o = v;
176
+ return typeof o.token === "string" && o.token.length > 0 && typeof o.identity === "string" && o.identity.length > 0 && typeof o.wallet_address === "string" && o.wallet_address.length > 0 && typeof o.expires_at === "number" && Number.isFinite(o.expires_at) && o.expires_at > 0;
177
+ }
178
+ function safe_remove(namespace) {
179
+ try {
180
+ localStorage.removeItem(key_for(namespace));
181
+ } catch {
182
+ }
183
+ }
184
+ function readStoredSession(namespace) {
185
+ if (typeof window === "undefined") return null;
186
+ let raw;
187
+ try {
188
+ raw = localStorage.getItem(key_for(namespace));
189
+ } catch {
190
+ return null;
191
+ }
192
+ if (raw == null) return null;
193
+ let parsed;
194
+ try {
195
+ parsed = JSON.parse(raw);
196
+ } catch {
197
+ safe_remove(namespace);
198
+ return null;
199
+ }
200
+ if (!is_auth_session(parsed)) {
201
+ safe_remove(namespace);
202
+ return null;
203
+ }
204
+ if (parsed.expires_at <= Date.now() / 1e3) {
205
+ safe_remove(namespace);
206
+ return null;
207
+ }
208
+ return parsed;
209
+ }
210
+ function writeStoredSession(namespace, session) {
211
+ if (typeof window === "undefined") return;
212
+ if (!is_auth_session(session)) {
213
+ throw new Error("@reifydb/auth: refusing to persist malformed session");
214
+ }
215
+ try {
216
+ localStorage.setItem(key_for(namespace), JSON.stringify(session));
217
+ } catch {
218
+ }
219
+ }
220
+ function clearStoredSession(namespace) {
221
+ if (typeof window === "undefined") return;
222
+ safe_remove(namespace);
223
+ }
224
+ function storageKeyFor(namespace) {
225
+ return key_for(namespace);
226
+ }
227
+
228
+ // src/auth-provider.tsx
229
+ import { jsx } from "react/jsx-runtime";
230
+ var DEFAULT_TTL_SECONDS = 86400;
231
+ var AuthContext = createContext(null);
232
+ function AuthProvider(props) {
233
+ const {
234
+ url,
235
+ transport,
236
+ storageNamespace,
237
+ method,
238
+ domain,
239
+ statement,
240
+ sessionTtlSeconds = DEFAULT_TTL_SECONDS,
241
+ wallet,
242
+ children
243
+ } = props;
244
+ const [state, setState] = useState(() => {
245
+ const stored = readStoredSession(storageNamespace);
246
+ return stored ? { status: "verifying", session: stored, clientReady: false, error: null } : { status: "disconnected", session: null, clientReady: false, error: null };
247
+ });
248
+ const wallet_connected = wallet.connected;
249
+ const wallet_connecting = wallet.connecting;
250
+ const wallet_public_key = wallet.publicKey;
251
+ const wallet_has_selected = wallet.hasSelectedWallet;
252
+ const session_ref = useRef(state.session);
253
+ session_ref.current = state.session;
254
+ const wallet_ref = useRef(wallet);
255
+ wallet_ref.current = wallet;
256
+ const tear_down = useCallback(
257
+ (next_status, next_error) => {
258
+ clearStoredSession(storageNamespace);
259
+ clearClient();
260
+ setState({
261
+ status: next_status,
262
+ session: null,
263
+ clientReady: false,
264
+ error: next_error
265
+ });
266
+ },
267
+ [storageNamespace]
268
+ );
269
+ useEffect(() => {
270
+ const session = state.session;
271
+ if (session == null) return;
272
+ if (wallet_connected && wallet_public_key != null) {
273
+ if (wallet_public_key !== session.wallet_address) {
274
+ tear_down("disconnected", null);
275
+ return;
276
+ }
277
+ let cancelled = false;
278
+ ensureClient(transport, url, session.token).then(() => {
279
+ if (cancelled) return;
280
+ setState(
281
+ (prev) => prev.session === session ? { ...prev, status: "authenticated", clientReady: true, error: null } : prev
282
+ );
283
+ }).catch((err) => {
284
+ if (cancelled) return;
285
+ const message = err instanceof Error ? err.message : "Failed to connect client";
286
+ tear_down("error", message);
287
+ });
288
+ return () => {
289
+ cancelled = true;
290
+ };
291
+ }
292
+ if (!wallet_connected && (wallet_connecting || wallet_has_selected)) {
293
+ setState(
294
+ (prev) => prev.session === session ? { ...prev, status: "verifying", clientReady: false } : prev
295
+ );
296
+ return;
297
+ }
298
+ tear_down("disconnected", null);
299
+ }, [
300
+ state.session,
301
+ wallet_connected,
302
+ wallet_connecting,
303
+ wallet_public_key,
304
+ wallet_has_selected,
305
+ transport,
306
+ url,
307
+ tear_down
308
+ ]);
309
+ useEffect(() => {
310
+ if (typeof window === "undefined") return;
311
+ const key = storageKeyFor(storageNamespace);
312
+ const on_storage = (e) => {
313
+ if (e.key !== key) return;
314
+ const current = session_ref.current;
315
+ if (e.newValue == null) {
316
+ if (current != null) tear_down("disconnected", null);
317
+ return;
318
+ }
319
+ try {
320
+ const parsed = JSON.parse(e.newValue);
321
+ if (current == null || parsed.token !== current.token || parsed.wallet_address !== current.wallet_address || parsed.identity !== current.identity) {
322
+ tear_down("disconnected", null);
323
+ }
324
+ } catch {
325
+ tear_down("disconnected", null);
326
+ }
327
+ };
328
+ window.addEventListener("storage", on_storage);
329
+ return () => {
330
+ window.removeEventListener("storage", on_storage);
331
+ };
332
+ }, [storageNamespace, tear_down]);
333
+ const signIn = useCallback(async () => {
334
+ const w = wallet_ref.current;
335
+ if (!w.connected || w.publicKey == null) {
336
+ setState((prev) => ({ ...prev, status: "error", error: "Wallet not connected" }));
337
+ return;
338
+ }
339
+ setState((prev) => ({ ...prev, status: "signing", error: null }));
340
+ try {
341
+ const session = await performSignIn({
342
+ url,
343
+ transport,
344
+ method,
345
+ wallet: w,
346
+ domain,
347
+ statement,
348
+ sessionTtlSeconds
349
+ });
350
+ if (session.wallet_address !== wallet_ref.current.publicKey) {
351
+ throw new Error("Wallet changed during sign in");
352
+ }
353
+ writeStoredSession(storageNamespace, session);
354
+ setState({
355
+ status: "verifying",
356
+ session,
357
+ clientReady: false,
358
+ error: null
359
+ });
360
+ } catch (err) {
361
+ const message = err instanceof Error ? err.message : "Sign in failed";
362
+ setState({
363
+ status: "error",
364
+ session: null,
365
+ clientReady: false,
366
+ error: message
367
+ });
368
+ }
369
+ }, [
370
+ url,
371
+ transport,
372
+ method,
373
+ domain,
374
+ statement,
375
+ sessionTtlSeconds,
376
+ storageNamespace
377
+ ]);
378
+ const signOut = useCallback(async () => {
379
+ try {
380
+ await currentClient().logout();
381
+ } catch {
382
+ }
383
+ tear_down("disconnected", null);
384
+ }, [tear_down]);
385
+ const value = useMemo(
386
+ () => ({
387
+ status: state.status,
388
+ session: state.session,
389
+ clientReady: state.clientReady,
390
+ error: state.error,
391
+ signIn,
392
+ signOut
393
+ }),
394
+ [state, signIn, signOut]
395
+ );
396
+ return /* @__PURE__ */ jsx(AuthContext.Provider, { value, children });
397
+ }
398
+
399
+ // src/use-auth.ts
400
+ import { useContext } from "react";
401
+ function useAuth() {
402
+ const ctx = useContext(AuthContext);
403
+ if (ctx == null) {
404
+ throw new Error("@reifydb/auth: useAuth must be used inside <AuthProvider>");
405
+ }
406
+ return ctx;
407
+ }
408
+ function useAuthClient() {
409
+ const { clientReady } = useAuth();
410
+ if (!clientReady) {
411
+ throw new Error("@reifydb/auth: useAuthClient called before clientReady");
412
+ }
413
+ return currentClient();
414
+ }
415
+
416
+ // src/index.ts
417
+ export * from "@reifydb/core";
418
+ export * from "@reifydb/client";
419
+ export {
420
+ AuthContext,
421
+ AuthProvider,
422
+ clearClient,
423
+ clearStoredSession,
424
+ currentClient,
425
+ ensureClient,
426
+ http_transport,
427
+ json_http_transport,
428
+ json_ws_transport,
429
+ performSignIn,
430
+ readStoredSession,
431
+ storageKeyFor,
432
+ useAuth,
433
+ useAuthClient,
434
+ writeStoredSession,
435
+ ws_transport
436
+ };
437
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/transport.ts","../src/auth-provider.tsx","../src/client-cache.ts","../src/sign-in.ts","../src/storage.ts","../src/use-auth.ts","../src/index.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {\n Client,\n type WsClient,\n type HttpClient,\n type JsonWsClient,\n type JsonHttpClient,\n} from \"@reifydb/client\";\nimport type { AuthCapableClient } from \"./types\";\n\nexport interface AuthTransport<\n TClient extends AuthCapableClient = AuthCapableClient,\n> {\n readonly kind: \"ws\" | \"http\";\n connect(url: string, token?: string): Promise<TClient>;\n release(client: TClient): void;\n}\n\nfunction release_with_disconnect(client: { disconnect?: () => void }): void {\n if (typeof client.disconnect === \"function\") {\n try {\n client.disconnect();\n } catch {\n // disconnect should be idempotent and never throw, but guard anyway\n }\n }\n}\n\nexport const ws_transport: AuthTransport<WsClient> = {\n kind: \"ws\",\n async connect(url, token) {\n return Client.connect_ws(\n url,\n token != null ? { format: \"rbcf\", token } : { format: \"rbcf\" },\n );\n },\n release(client) {\n release_with_disconnect(client);\n },\n};\n\nexport const http_transport: AuthTransport<HttpClient> = {\n kind: \"http\",\n async connect(url, token) {\n return Client.connect_http(\n url,\n token != null ? { format: \"rbcf\", token } : { format: \"rbcf\" },\n );\n },\n release(_client) {\n // HttpClient has no persistent socket; nothing to release.\n },\n};\n\nexport const json_ws_transport: AuthTransport<JsonWsClient> = {\n kind: \"ws\",\n async connect(url, token) {\n return Client.connect_json_ws(url, token != null ? { token } : undefined);\n },\n release(client) {\n release_with_disconnect(client);\n },\n};\n\nexport const json_http_transport: AuthTransport<JsonHttpClient> = {\n kind: \"http\",\n async connect(url, token) {\n return Client.connect_json_http(url, token != null ? { token } : undefined);\n },\n release(_client) {\n // JsonHttpClient has no persistent socket; nothing to release.\n },\n};\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport React, {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactElement,\n type ReactNode,\n} from \"react\";\n\nimport { clearClient, currentClient, ensureClient } from \"./client-cache\";\nimport { performSignIn } from \"./sign-in\";\nimport {\n clearStoredSession,\n readStoredSession,\n storageKeyFor,\n writeStoredSession,\n} from \"./storage\";\nimport type {\n AuthCapableClient,\n AuthSession,\n AuthState,\n WalletConnector,\n} from \"./types\";\nimport type { AuthTransport } from \"./transport\";\n\nconst DEFAULT_TTL_SECONDS = 86400;\n\nexport interface AuthContextValue extends AuthState {\n signIn(): Promise<void>;\n signOut(): Promise<void>;\n}\n\nexport const AuthContext = createContext<AuthContextValue | null>(null);\n\nexport interface AuthProviderProps<\n TClient extends AuthCapableClient = AuthCapableClient,\n> {\n url: string;\n transport: AuthTransport<TClient>;\n storageNamespace: string;\n method: string;\n domain: string;\n statement: string;\n sessionTtlSeconds?: number;\n wallet: WalletConnector;\n children: ReactNode;\n}\n\ninterface InternalState {\n status: AuthState[\"status\"];\n session: AuthSession | null;\n clientReady: boolean;\n error: string | null;\n}\n\nexport function AuthProvider<TClient extends AuthCapableClient>(\n props: AuthProviderProps<TClient>,\n): ReactElement {\n const {\n url,\n transport,\n storageNamespace,\n method,\n domain,\n statement,\n sessionTtlSeconds = DEFAULT_TTL_SECONDS,\n wallet,\n children,\n } = props;\n\n const [state, setState] = useState<InternalState>(() => {\n const stored = readStoredSession(storageNamespace);\n return stored\n ? { status: \"verifying\", session: stored, clientReady: false, error: null }\n : { status: \"disconnected\", session: null, clientReady: false, error: null };\n });\n\n // Pull live wallet fields into stable primitives for effect deps.\n const wallet_connected = wallet.connected;\n const wallet_connecting = wallet.connecting;\n const wallet_public_key = wallet.publicKey;\n const wallet_has_selected = wallet.hasSelectedWallet;\n\n // Refs so callbacks can read latest values without re-binding.\n const session_ref = useRef(state.session);\n session_ref.current = state.session;\n const wallet_ref = useRef(wallet);\n wallet_ref.current = wallet;\n\n const tear_down = useCallback(\n (next_status: InternalState[\"status\"], next_error: string | null) => {\n clearStoredSession(storageNamespace);\n clearClient();\n setState({\n status: next_status,\n session: null,\n clientReady: false,\n error: next_error,\n });\n },\n [storageNamespace],\n );\n\n // Wallet-match gate: the security invariant. The authenticated client is only\n // ever constructed when the connected wallet matches the persisted session.\n useEffect(() => {\n const session = state.session;\n if (session == null) return;\n\n if (wallet_connected && wallet_public_key != null) {\n if (wallet_public_key !== session.wallet_address) {\n tear_down(\"disconnected\", null);\n return;\n }\n let cancelled = false;\n ensureClient(transport, url, session.token)\n .then(() => {\n if (cancelled) return;\n setState((prev) =>\n prev.session === session\n ? { ...prev, status: \"authenticated\", clientReady: true, error: null }\n : prev,\n );\n })\n .catch((err: unknown) => {\n if (cancelled) return;\n const message = err instanceof Error ? err.message : \"Failed to connect client\";\n tear_down(\"error\", message);\n });\n return () => {\n cancelled = true;\n };\n }\n\n if (!wallet_connected && (wallet_connecting || wallet_has_selected)) {\n // Wallet adapter is autoConnecting; stay in verifying. Do NOT construct\n // the client yet - we must not authenticate before the match is confirmed.\n setState((prev) =>\n prev.session === session\n ? { ...prev, status: \"verifying\", clientReady: false }\n : prev,\n );\n return;\n }\n\n // Wallet is definitively absent (no selected wallet, not connecting). User\n // explicitly disconnected, so the session can no longer be proven; tear down.\n tear_down(\"disconnected\", null);\n }, [\n state.session,\n wallet_connected,\n wallet_connecting,\n wallet_public_key,\n wallet_has_selected,\n transport,\n url,\n tear_down,\n ]);\n\n // Cross-tab defense: if our storage entry is changed or cleared by another\n // tab, re-validate and tear down if it no longer matches our in-memory state.\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const key = storageKeyFor(storageNamespace);\n const on_storage = (e: StorageEvent) => {\n if (e.key !== key) return;\n const current = session_ref.current;\n if (e.newValue == null) {\n if (current != null) tear_down(\"disconnected\", null);\n return;\n }\n try {\n const parsed = JSON.parse(e.newValue) as Partial<AuthSession>;\n if (\n current == null ||\n parsed.token !== current.token ||\n parsed.wallet_address !== current.wallet_address ||\n parsed.identity !== current.identity\n ) {\n tear_down(\"disconnected\", null);\n }\n } catch {\n tear_down(\"disconnected\", null);\n }\n };\n window.addEventListener(\"storage\", on_storage);\n return () => {\n window.removeEventListener(\"storage\", on_storage);\n };\n }, [storageNamespace, tear_down]);\n\n const signIn = useCallback(async () => {\n const w = wallet_ref.current;\n if (!w.connected || w.publicKey == null) {\n setState((prev) => ({ ...prev, status: \"error\", error: \"Wallet not connected\" }));\n return;\n }\n setState((prev) => ({ ...prev, status: \"signing\", error: null }));\n try {\n const session = await performSignIn({\n url,\n transport,\n method,\n wallet: w,\n domain,\n statement,\n sessionTtlSeconds,\n });\n // Sanity: signed-in wallet must match the live publicKey. If the user\n // swapped wallets while the signature was in flight, refuse the session.\n if (session.wallet_address !== wallet_ref.current.publicKey) {\n throw new Error(\"Wallet changed during sign in\");\n }\n writeStoredSession(storageNamespace, session);\n setState({\n status: \"verifying\",\n session,\n clientReady: false,\n error: null,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Sign in failed\";\n setState({\n status: \"error\",\n session: null,\n clientReady: false,\n error: message,\n });\n }\n }, [\n url,\n transport,\n method,\n domain,\n statement,\n sessionTtlSeconds,\n storageNamespace,\n ]);\n\n const signOut = useCallback(async () => {\n // Best-effort server-side logout via the currently-cached client.\n try {\n await currentClient().logout();\n } catch {\n // no current client, or server-side logout failed; tear down regardless\n }\n tear_down(\"disconnected\", null);\n }, [tear_down]);\n\n const value = useMemo<AuthContextValue>(\n () => ({\n status: state.status,\n session: state.session,\n clientReady: state.clientReady,\n error: state.error,\n signIn,\n signOut,\n }),\n [state, signIn, signOut],\n );\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport type { AuthCapableClient } from \"./types\";\nimport type { AuthTransport } from \"./transport\";\n\n// Module-level dedupe: in React StrictMode (dev) the AuthProvider effect runs\n// twice with the same inputs, which previously opened two sockets. We cache the\n// in-flight promise so both runs share one connection.\n\nlet current_key: string | null = null;\nlet current_client: AuthCapableClient | null = null;\nlet current_transport: AuthTransport | null = null;\nlet pending_promise: Promise<AuthCapableClient> | null = null;\n\nfunction key_of(kind: string, url: string, token: string): string {\n return `${kind}|${url}|${token}`;\n}\n\nexport async function ensureClient<T extends AuthCapableClient>(\n transport: AuthTransport<T>,\n url: string,\n token: string,\n): Promise<T> {\n const key = key_of(transport.kind, url, token);\n\n if (current_key === key) {\n if (current_client) return current_client as T;\n if (pending_promise) return pending_promise as Promise<T>;\n }\n\n // New (kind, url, token) — release any prior client, start fresh.\n if (current_client && current_transport) {\n try {\n (current_transport as AuthTransport<AuthCapableClient>).release(current_client);\n } catch {\n // release must be idempotent; ignore\n }\n current_client = null;\n }\n current_key = key;\n current_transport = transport as AuthTransport;\n\n const p = transport.connect(url, token).then((client) => {\n // Another ensure/clear ran while we were connecting — drop this one.\n if (current_key !== key) {\n try {\n transport.release(client);\n } catch {\n // ignore\n }\n throw new Error(\"@reifydb/auth: client connect superseded\");\n }\n current_client = client;\n pending_promise = null;\n return client;\n });\n pending_promise = p as Promise<AuthCapableClient>;\n return p;\n}\n\nexport function clearClient(): void {\n if (current_client && current_transport) {\n try {\n (current_transport as AuthTransport<AuthCapableClient>).release(current_client);\n } catch {\n // ignore\n }\n }\n current_key = null;\n current_client = null;\n current_transport = null;\n pending_promise = null;\n}\n\nexport function currentClient<T extends AuthCapableClient = AuthCapableClient>(): T {\n if (!current_client) {\n throw new Error(\"@reifydb/auth: no authenticated client; call ensureClient first\");\n }\n return current_client as T;\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport type { AuthCapableClient, AuthSession, WalletConnector } from \"./types\";\nimport type { AuthTransport } from \"./transport\";\n\nexport interface SignInArgs<TClient extends AuthCapableClient = AuthCapableClient> {\n url: string;\n transport: AuthTransport<TClient>;\n method: string;\n wallet: Pick<WalletConnector, \"publicKey\" | \"signMessage\" | \"encodeSignature\">;\n domain: string;\n statement: string;\n sessionTtlSeconds: number;\n}\n\nexport async function performSignIn<TClient extends AuthCapableClient>(\n args: SignInArgs<TClient>,\n): Promise<AuthSession> {\n const { url, transport, method, wallet, domain, statement, sessionTtlSeconds } = args;\n\n const wallet_address = wallet.publicKey;\n if (wallet_address == null || wallet_address.length === 0) {\n throw new Error(\"@reifydb/auth: wallet.publicKey is required to sign in\");\n }\n if (!Number.isFinite(sessionTtlSeconds) || sessionTtlSeconds <= 0) {\n throw new Error(\"@reifydb/auth: sessionTtlSeconds must be a positive number\");\n }\n\n const client = await transport.connect(url);\n try {\n const challenge = await client.login_challenge(method, {\n identifier: wallet_address,\n public_key: wallet_address,\n domain,\n statement,\n });\n if (challenge.kind !== \"challenge\") {\n throw new Error(\n `@reifydb/auth: expected challenge response, got ${challenge.kind}`,\n );\n }\n\n const messageBytes = new TextEncoder().encode(challenge.message);\n const signatureBytes = await wallet.signMessage(messageBytes);\n const signature = wallet.encodeSignature(signatureBytes);\n\n const auth = await client.login_challenge(method, {\n challenge_id: challenge.challenge_id,\n signature,\n signed_message: challenge.message,\n });\n if (auth.kind !== \"authenticated\") {\n throw new Error(\n `@reifydb/auth: expected authenticated response, got ${auth.kind}`,\n );\n }\n\n return {\n token: auth.token,\n identity: auth.identity,\n wallet_address,\n expires_at: Math.floor(Date.now() / 1000) + sessionTtlSeconds,\n };\n } finally {\n transport.release(client);\n }\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport type { AuthSession } from \"./types\";\n\nconst SUFFIX = \".auth\";\n\nfunction key_for(namespace: string): string {\n return `${namespace}${SUFFIX}`;\n}\n\nfunction is_auth_session(v: unknown): v is AuthSession {\n if (v === null || typeof v !== \"object\") return false;\n const o = v as Record<string, unknown>;\n return (\n typeof o.token === \"string\" && o.token.length > 0 &&\n typeof o.identity === \"string\" && o.identity.length > 0 &&\n typeof o.wallet_address === \"string\" && o.wallet_address.length > 0 &&\n typeof o.expires_at === \"number\" && Number.isFinite(o.expires_at) && o.expires_at > 0\n );\n}\n\nfunction safe_remove(namespace: string): void {\n try {\n localStorage.removeItem(key_for(namespace));\n } catch {\n // localStorage may be unavailable; ignore\n }\n}\n\nexport function readStoredSession(namespace: string): AuthSession | null {\n if (typeof window === \"undefined\") return null;\n let raw: string | null;\n try {\n raw = localStorage.getItem(key_for(namespace));\n } catch {\n return null;\n }\n if (raw == null) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n safe_remove(namespace);\n return null;\n }\n if (!is_auth_session(parsed)) {\n safe_remove(namespace);\n return null;\n }\n if (parsed.expires_at <= Date.now() / 1000) {\n safe_remove(namespace);\n return null;\n }\n return parsed;\n}\n\nexport function writeStoredSession(namespace: string, session: AuthSession): void {\n if (typeof window === \"undefined\") return;\n if (!is_auth_session(session)) {\n throw new Error(\"@reifydb/auth: refusing to persist malformed session\");\n }\n try {\n localStorage.setItem(key_for(namespace), JSON.stringify(session));\n } catch {\n // localStorage may be unavailable (private mode, full quota); ignore.\n }\n}\n\nexport function clearStoredSession(namespace: string): void {\n if (typeof window === \"undefined\") return;\n safe_remove(namespace);\n}\n\nexport function storageKeyFor(namespace: string): string {\n return key_for(namespace);\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport { useContext } from \"react\";\n\nimport { AuthContext, type AuthContextValue } from \"./auth-provider\";\nimport { currentClient } from \"./client-cache\";\nimport type { AuthCapableClient } from \"./types\";\n\nexport function useAuth(): AuthContextValue {\n const ctx = useContext(AuthContext);\n if (ctx == null) {\n throw new Error(\"@reifydb/auth: useAuth must be used inside <AuthProvider>\");\n }\n return ctx;\n}\n\nexport function useAuthClient<\n TClient extends AuthCapableClient = AuthCapableClient,\n>(): TClient {\n const { clientReady } = useAuth();\n if (!clientReady) {\n throw new Error(\"@reifydb/auth: useAuthClient called before clientReady\");\n }\n return currentClient<TClient>();\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nexport type {\n AuthCapableClient,\n AuthSession,\n AuthState,\n AuthStatus,\n LoginChallengeResult,\n WalletConnector,\n} from \"./types\";\n\nexport type { AuthTransport } from \"./transport\";\nexport {\n http_transport,\n json_http_transport,\n json_ws_transport,\n ws_transport,\n} from \"./transport\";\n\nexport {\n AuthContext,\n AuthProvider,\n type AuthContextValue,\n type AuthProviderProps,\n} from \"./auth-provider\";\n\nexport { useAuth, useAuthClient } from \"./use-auth\";\n\nexport { performSignIn, type SignInArgs } from \"./sign-in\";\n\nexport {\n clearStoredSession,\n readStoredSession,\n storageKeyFor,\n writeStoredSession,\n} from \"./storage\";\n\nexport { clearClient, currentClient, ensureClient } from \"./client-cache\";\n\nexport * from \"@reifydb/core\";\nexport * from \"@reifydb/client\";\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@reifydb/auth",
3
+ "version": "0.5.5",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "dependencies": {
8
+ "@reifydb/core": "0.5.0",
9
+ "@reifydb/client": "0.5.0"
10
+ },
11
+ "peerDependencies": {
12
+ "react": ">=16.8.0"
13
+ },
14
+ "devDependencies": {
15
+ "@solana/web3.js": "^1.95.0",
16
+ "@testing-library/react": "^16.3.0",
17
+ "@types/react": "^19.1.12",
18
+ "@vitest/coverage-v8": "^3.2.4",
19
+ "bs58": "^6.0.0",
20
+ "happy-dom": "^18.0.1",
21
+ "react": "^19.1.1",
22
+ "tsup": "^8.5.0",
23
+ "tweetnacl": "^1.0.3",
24
+ "typescript": "^5.9.2",
25
+ "vitest": "^3.2.4"
26
+ },
27
+ "engines": {
28
+ "node": ">=16.0.0"
29
+ },
30
+ "keywords": [
31
+ "reifydb",
32
+ "auth",
33
+ "authentication",
34
+ "wallet",
35
+ "session"
36
+ ],
37
+ "files": [
38
+ "dist/",
39
+ "package.json",
40
+ "readme.md",
41
+ "license.md"
42
+ ],
43
+ "publishConfig": {
44
+ "access": "public",
45
+ "linkWorkspacePackages": false
46
+ },
47
+ "license": "Apache-2.0",
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "https://github.com/reifydb/reifydb.git",
51
+ "directory": "pkg/typescript/auth"
52
+ },
53
+ "homepage": "https://reifydb.com",
54
+ "bugs": {
55
+ "url": "https://github.com/reifydb/reifydb/issues"
56
+ },
57
+ "scripts": {
58
+ "build": "tsup src/index.ts --dts --format esm --sourcemap",
59
+ "dev": "tsc --watch",
60
+ "test": "pnpm test:unit",
61
+ "test:unit": "vitest run --config vitest.unit.config.ts",
62
+ "test:unit:watch": "vitest --config vitest.unit.config.ts",
63
+ "test:integration": "vitest run --config vitest.config.ts",
64
+ "test:integration:watch": "vitest --config vitest.config.ts",
65
+ "test:integration:coverage": "vitest run --coverage --config vitest.config.ts",
66
+ "test:coverage": "pnpm test:integration:coverage",
67
+ "pretest:integration": "pnpm build",
68
+ "publish:npm": "pnpm publish --access public --no-git-checks"
69
+ }
70
+ }