@lunora/react-native 1.0.0-alpha.1 → 1.0.0-alpha.11
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 +2 -0
- package/dist/auth.d.mts +26 -24
- package/dist/auth.d.ts +26 -24
- package/dist/auth.mjs +1 -2
- package/dist/index.d.mts +64 -61
- package/dist/index.d.ts +64 -61
- package/dist/index.mjs +1 -2
- package/dist/packem_shared/createLunoraClient-5PwdvVvS.mjs +1 -0
- package/dist/packem_shared/expoBearerToken-CSfRb511.mjs +1 -0
- package/package.json +3 -3
- package/dist/packem_shared/createLunoraClient-D9i-IKbc.mjs +0 -36
- package/dist/packem_shared/expoBearerToken-B0Zorz--.mjs +0 -7
package/README.md
CHANGED
package/dist/auth.d.mts
CHANGED
|
@@ -1,33 +1,35 @@
|
|
|
1
1
|
export { expoClient, setupExpoFocusManager, setupExpoOnlineManager } from '@better-auth/expo/client';
|
|
2
2
|
/**
|
|
3
|
-
* Read the current better-auth session token from an Expo auth client, for use
|
|
4
|
-
* as a **bearer** credential on the Lunora client — `client.setAuthToken(token)`
|
|
5
|
-
* for HTTP RPC and `client.setWsToken(token ?? undefined)` for the live socket.
|
|
6
|
-
*
|
|
7
|
-
* The Expo plugin persists the session as a cookie in `SecureStore`;
|
|
8
|
-
* `getCookie()` exposes it, and this pulls the `session_token` value out.
|
|
9
|
-
* better-auth's `bearer` plugin accepts that value verbatim in the
|
|
10
|
-
* `Authorization` header — so the native client authenticates WITHOUT sending a
|
|
11
|
-
* `Cookie`, which the runtime's CSRF guard rejects on an `Origin`-less native
|
|
12
|
-
* request (React Native sends no `Origin`). Returns `null` when signed out.
|
|
13
|
-
*
|
|
14
|
-
* Re-run it whenever the session changes and feed the result to the client (see
|
|
15
|
-
* the package README):
|
|
16
|
-
*
|
|
17
|
-
* ```ts
|
|
18
|
-
* const token = expoBearerToken(authClient);
|
|
19
|
-
* client.setAuthToken(token);
|
|
20
|
-
* client.setWsToken(token ?? undefined);
|
|
21
|
-
* ```
|
|
22
|
-
|
|
3
|
+
* Read the current better-auth session token from an Expo auth client, for use
|
|
4
|
+
* as a **bearer** credential on the Lunora client — `client.setAuthToken(token)`
|
|
5
|
+
* for HTTP RPC and `client.setWsToken(token ?? undefined)` for the live socket.
|
|
6
|
+
*
|
|
7
|
+
* The Expo plugin persists the session as a cookie in `SecureStore`;
|
|
8
|
+
* `getCookie()` exposes it, and this pulls the `session_token` value out.
|
|
9
|
+
* better-auth's `bearer` plugin accepts that value verbatim in the
|
|
10
|
+
* `Authorization` header — so the native client authenticates WITHOUT sending a
|
|
11
|
+
* `Cookie`, which the runtime's CSRF guard rejects on an `Origin`-less native
|
|
12
|
+
* request (React Native sends no `Origin`). Returns `null` when signed out.
|
|
13
|
+
*
|
|
14
|
+
* Re-run it whenever the session changes and feed the result to the client (see
|
|
15
|
+
* the package README):
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* const token = expoBearerToken(authClient);
|
|
19
|
+
* client.setAuthToken(token);
|
|
20
|
+
* client.setWsToken(token ?? undefined);
|
|
21
|
+
* ```
|
|
22
|
+
* @experimental
|
|
23
|
+
*/
|
|
23
24
|
declare const expoBearerToken: (authClient: {
|
|
24
25
|
getCookie: () => string;
|
|
25
26
|
}) => null | string;
|
|
26
27
|
/**
|
|
27
|
-
* The slice of a key/value store the better-auth Expo plugin needs — the shape
|
|
28
|
-
* of `expo-secure-store` (a synchronous `getItem`, plus `setItem`). Pass Expo
|
|
29
|
-
* `SecureStore` straight in.
|
|
30
|
-
|
|
28
|
+
* The slice of a key/value store the better-auth Expo plugin needs — the shape
|
|
29
|
+
* of `expo-secure-store` (a synchronous `getItem`, plus `setItem`). Pass Expo
|
|
30
|
+
* `SecureStore` straight in.
|
|
31
|
+
* @experimental
|
|
32
|
+
*/
|
|
31
33
|
interface SecureStorageLike {
|
|
32
34
|
getItem: (key: string) => null | string;
|
|
33
35
|
setItem: (key: string, value: string) => unknown;
|
package/dist/auth.d.ts
CHANGED
|
@@ -1,33 +1,35 @@
|
|
|
1
1
|
export { expoClient, setupExpoFocusManager, setupExpoOnlineManager } from '@better-auth/expo/client';
|
|
2
2
|
/**
|
|
3
|
-
* Read the current better-auth session token from an Expo auth client, for use
|
|
4
|
-
* as a **bearer** credential on the Lunora client — `client.setAuthToken(token)`
|
|
5
|
-
* for HTTP RPC and `client.setWsToken(token ?? undefined)` for the live socket.
|
|
6
|
-
*
|
|
7
|
-
* The Expo plugin persists the session as a cookie in `SecureStore`;
|
|
8
|
-
* `getCookie()` exposes it, and this pulls the `session_token` value out.
|
|
9
|
-
* better-auth's `bearer` plugin accepts that value verbatim in the
|
|
10
|
-
* `Authorization` header — so the native client authenticates WITHOUT sending a
|
|
11
|
-
* `Cookie`, which the runtime's CSRF guard rejects on an `Origin`-less native
|
|
12
|
-
* request (React Native sends no `Origin`). Returns `null` when signed out.
|
|
13
|
-
*
|
|
14
|
-
* Re-run it whenever the session changes and feed the result to the client (see
|
|
15
|
-
* the package README):
|
|
16
|
-
*
|
|
17
|
-
* ```ts
|
|
18
|
-
* const token = expoBearerToken(authClient);
|
|
19
|
-
* client.setAuthToken(token);
|
|
20
|
-
* client.setWsToken(token ?? undefined);
|
|
21
|
-
* ```
|
|
22
|
-
|
|
3
|
+
* Read the current better-auth session token from an Expo auth client, for use
|
|
4
|
+
* as a **bearer** credential on the Lunora client — `client.setAuthToken(token)`
|
|
5
|
+
* for HTTP RPC and `client.setWsToken(token ?? undefined)` for the live socket.
|
|
6
|
+
*
|
|
7
|
+
* The Expo plugin persists the session as a cookie in `SecureStore`;
|
|
8
|
+
* `getCookie()` exposes it, and this pulls the `session_token` value out.
|
|
9
|
+
* better-auth's `bearer` plugin accepts that value verbatim in the
|
|
10
|
+
* `Authorization` header — so the native client authenticates WITHOUT sending a
|
|
11
|
+
* `Cookie`, which the runtime's CSRF guard rejects on an `Origin`-less native
|
|
12
|
+
* request (React Native sends no `Origin`). Returns `null` when signed out.
|
|
13
|
+
*
|
|
14
|
+
* Re-run it whenever the session changes and feed the result to the client (see
|
|
15
|
+
* the package README):
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* const token = expoBearerToken(authClient);
|
|
19
|
+
* client.setAuthToken(token);
|
|
20
|
+
* client.setWsToken(token ?? undefined);
|
|
21
|
+
* ```
|
|
22
|
+
* @experimental
|
|
23
|
+
*/
|
|
23
24
|
declare const expoBearerToken: (authClient: {
|
|
24
25
|
getCookie: () => string;
|
|
25
26
|
}) => null | string;
|
|
26
27
|
/**
|
|
27
|
-
* The slice of a key/value store the better-auth Expo plugin needs — the shape
|
|
28
|
-
* of `expo-secure-store` (a synchronous `getItem`, plus `setItem`). Pass Expo
|
|
29
|
-
* `SecureStore` straight in.
|
|
30
|
-
|
|
28
|
+
* The slice of a key/value store the better-auth Expo plugin needs — the shape
|
|
29
|
+
* of `expo-secure-store` (a synchronous `getItem`, plus `setItem`). Pass Expo
|
|
30
|
+
* `SecureStore` straight in.
|
|
31
|
+
* @experimental
|
|
32
|
+
*/
|
|
31
33
|
interface SecureStorageLike {
|
|
32
34
|
getItem: (key: string) => null | string;
|
|
33
35
|
setItem: (key: string, value: string) => unknown;
|
package/dist/auth.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { expoClient, setupExpoFocusManager, setupExpoOnlineManager } from '@better-auth/expo/client';
|
|
1
|
+
import{default as p}from"./packem_shared/expoBearerToken-CSfRb511.mjs";import{expoClient as a,setupExpoFocusManager as n,setupExpoOnlineManager as t}from"@better-auth/expo/client";export{p as expoBearerToken,a as expoClient,n as setupExpoFocusManager,t as setupExpoOnlineManager};
|
package/dist/index.d.mts
CHANGED
|
@@ -1,75 +1,78 @@
|
|
|
1
1
|
import { AsyncStorageLike, LunoraClientOptions, LunoraClient } from '@lunora/client';
|
|
2
2
|
export * from '@lunora/react';
|
|
3
3
|
/**
|
|
4
|
-
* A `() => headers` factory the React Native client threads onto every HTTP RPC
|
|
5
|
-
* request *and* the WebSocket upgrade — a generic escape hatch for attaching a
|
|
6
|
-
* **custom** credential header (an API-gateway key, a proxy token, …) that
|
|
7
|
-
* React Native's missing cookie jar can't carry implicitly. Return `undefined`
|
|
8
|
-
* (or an empty object) when there's nothing to attach.
|
|
9
|
-
*
|
|
10
|
-
* For better-auth Expo sessions, prefer a **bearer** token instead: read it with
|
|
11
|
-
* `@lunora/react-native/auth`'s `expoBearerToken` and feed it to
|
|
12
|
-
* `client.setAuthToken` / `setWsToken` (see the package README). A bearer avoids
|
|
13
|
-
* the `Cookie` header the runtime's CSRF guard rejects on `Origin`-less native
|
|
14
|
-
* requests.
|
|
15
|
-
|
|
4
|
+
* A `() => headers` factory the React Native client threads onto every HTTP RPC
|
|
5
|
+
* request *and* the WebSocket upgrade — a generic escape hatch for attaching a
|
|
6
|
+
* **custom** credential header (an API-gateway key, a proxy token, …) that
|
|
7
|
+
* React Native's missing cookie jar can't carry implicitly. Return `undefined`
|
|
8
|
+
* (or an empty object) when there's nothing to attach.
|
|
9
|
+
*
|
|
10
|
+
* For better-auth Expo sessions, prefer a **bearer** token instead: read it with
|
|
11
|
+
* `@lunora/react-native/auth`'s `expoBearerToken` and feed it to
|
|
12
|
+
* `client.setAuthToken` / `setWsToken` (see the package README). A bearer avoids
|
|
13
|
+
* the `Cookie` header the runtime's CSRF guard rejects on `Origin`-less native
|
|
14
|
+
* requests.
|
|
15
|
+
* @experimental
|
|
16
|
+
*/
|
|
16
17
|
type AuthHeadersFactory = () => Record<string, string> | undefined;
|
|
17
18
|
/**
|
|
18
|
-
* Options for `createLunoraClient` — the React Native / Expo counterpart to
|
|
19
|
-
* constructing a `LunoraClient` directly. It is `LunoraClientOptions` with two
|
|
20
|
-
* React-Native-shaped conveniences layered on. `storage` wires the
|
|
21
|
-
* AsyncStorage-backed offline-queue persistence for you (the browser default
|
|
22
|
-
* auto-probes IndexedDB, which React Native lacks, so without this the queue
|
|
23
|
-
* stays in memory and is lost on reload). `getAuthHeaders` is a generic escape
|
|
24
|
-
* hatch for a custom credential header on both the HTTP RPC path and the
|
|
25
|
-
* WebSocket upgrade; for better-auth sessions prefer a bearer token
|
|
26
|
-
* (`expoBearerToken` + the client's `setAuthToken` / `setWsToken`).
|
|
27
|
-
*
|
|
28
|
-
* The `persistence`, `fetch`, and `WebSocket` fields of `LunoraClientOptions`
|
|
29
|
-
* are still accepted and take precedence when you need full control; the two
|
|
30
|
-
* conveniences are sugar over exactly those seams.
|
|
31
|
-
|
|
19
|
+
* Options for `createLunoraClient` — the React Native / Expo counterpart to
|
|
20
|
+
* constructing a `LunoraClient` directly. It is `LunoraClientOptions` with two
|
|
21
|
+
* React-Native-shaped conveniences layered on. `storage` wires the
|
|
22
|
+
* AsyncStorage-backed offline-queue persistence for you (the browser default
|
|
23
|
+
* auto-probes IndexedDB, which React Native lacks, so without this the queue
|
|
24
|
+
* stays in memory and is lost on reload). `getAuthHeaders` is a generic escape
|
|
25
|
+
* hatch for a custom credential header on both the HTTP RPC path and the
|
|
26
|
+
* WebSocket upgrade; for better-auth sessions prefer a bearer token
|
|
27
|
+
* (`expoBearerToken` + the client's `setAuthToken` / `setWsToken`).
|
|
28
|
+
*
|
|
29
|
+
* The `persistence`, `fetch`, and `WebSocket` fields of `LunoraClientOptions`
|
|
30
|
+
* are still accepted and take precedence when you need full control; the two
|
|
31
|
+
* conveniences are sugar over exactly those seams.
|
|
32
|
+
* @experimental
|
|
33
|
+
*/
|
|
32
34
|
interface CreateLunoraClientOptions extends LunoraClientOptions {
|
|
33
35
|
/**
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
* Attaches a credential to every HTTP RPC request and to the WebSocket
|
|
37
|
+
* upgrade request. See `AuthHeadersFactory`. When omitted, requests go out
|
|
38
|
+
* with only whatever `LunoraClient` already sets (its bearer token from
|
|
39
|
+
* `setAuthToken`, if any).
|
|
40
|
+
*
|
|
41
|
+
* Merged UNDER the client's own headers on the HTTP path (an explicit
|
|
42
|
+
* `setAuthToken` bearer wins over a same-named header here); applied to the
|
|
43
|
+
* WebSocket upgrade via a wrapping `WebSocket`, since the socket has no other
|
|
44
|
+
* way to carry credentials in React Native.
|
|
45
|
+
*/
|
|
44
46
|
getAuthHeaders?: AuthHeadersFactory;
|
|
45
47
|
/**
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
* React Native `AsyncStorage` (or any async key/value store with the same
|
|
49
|
+
* `getItem`/`setItem`/`removeItem` surface — Expo `SecureStore`, an in-memory
|
|
50
|
+
* map in tests). When supplied, the offline mutation queue is persisted here
|
|
51
|
+
* via `createAsyncStoragePersistence`, so writes made offline survive an app
|
|
52
|
+
* restart. Ignored when an explicit `persistence` is passed.
|
|
53
|
+
*/
|
|
52
54
|
storage?: AsyncStorageLike;
|
|
53
55
|
}
|
|
54
56
|
/**
|
|
55
|
-
* Construct a `LunoraClient` tuned for React Native / Expo — a thin wrapper over
|
|
56
|
-
* `new LunoraClient(options)` that fills in the two things a browser gets for
|
|
57
|
-
* free but React Native does not.
|
|
58
|
-
*
|
|
59
|
-
* First, a durable offline queue: pass `storage` (React Native `AsyncStorage`,
|
|
60
|
-
* or any async key/value store) and the offline mutation queue is persisted
|
|
61
|
-
* through `createAsyncStoragePersistence` — the browser default auto-probes
|
|
62
|
-
* IndexedDB, which React Native lacks, so without this the queue lives only in
|
|
63
|
-
* memory and is lost on reload.
|
|
64
|
-
*
|
|
65
|
-
* Second, credentialed requests: pass `getAuthHeaders` and the returned headers
|
|
66
|
-
* ride both the HTTP RPC path and the WebSocket upgrade, since React Native has
|
|
67
|
-
* no cookie jar to attach a session implicitly.
|
|
68
|
-
*
|
|
69
|
-
* Everything on `LunoraClientOptions` is still accepted and passed through; an
|
|
70
|
-
* explicit `persistence`, `fetch`, or `WebSocket` takes precedence over the
|
|
71
|
-
* convenience derived from `storage` / `getAuthHeaders`. See the package README
|
|
72
|
-
* for a full setup example.
|
|
73
|
-
|
|
57
|
+
* Construct a `LunoraClient` tuned for React Native / Expo — a thin wrapper over
|
|
58
|
+
* `new LunoraClient(options)` that fills in the two things a browser gets for
|
|
59
|
+
* free but React Native does not.
|
|
60
|
+
*
|
|
61
|
+
* First, a durable offline queue: pass `storage` (React Native `AsyncStorage`,
|
|
62
|
+
* or any async key/value store) and the offline mutation queue is persisted
|
|
63
|
+
* through `createAsyncStoragePersistence` — the browser default auto-probes
|
|
64
|
+
* IndexedDB, which React Native lacks, so without this the queue lives only in
|
|
65
|
+
* memory and is lost on reload.
|
|
66
|
+
*
|
|
67
|
+
* Second, credentialed requests: pass `getAuthHeaders` and the returned headers
|
|
68
|
+
* ride both the HTTP RPC path and the WebSocket upgrade, since React Native has
|
|
69
|
+
* no cookie jar to attach a session implicitly.
|
|
70
|
+
*
|
|
71
|
+
* Everything on `LunoraClientOptions` is still accepted and passed through; an
|
|
72
|
+
* explicit `persistence`, `fetch`, or `WebSocket` takes precedence over the
|
|
73
|
+
* convenience derived from `storage` / `getAuthHeaders`. See the package README
|
|
74
|
+
* for a full setup example.
|
|
75
|
+
* @experimental
|
|
76
|
+
*/
|
|
74
77
|
declare const createLunoraClient: (options: CreateLunoraClientOptions) => LunoraClient;
|
|
75
78
|
export { type AuthHeadersFactory, type CreateLunoraClientOptions, createLunoraClient };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,75 +1,78 @@
|
|
|
1
1
|
import { AsyncStorageLike, LunoraClientOptions, LunoraClient } from '@lunora/client';
|
|
2
2
|
export * from '@lunora/react';
|
|
3
3
|
/**
|
|
4
|
-
* A `() => headers` factory the React Native client threads onto every HTTP RPC
|
|
5
|
-
* request *and* the WebSocket upgrade — a generic escape hatch for attaching a
|
|
6
|
-
* **custom** credential header (an API-gateway key, a proxy token, …) that
|
|
7
|
-
* React Native's missing cookie jar can't carry implicitly. Return `undefined`
|
|
8
|
-
* (or an empty object) when there's nothing to attach.
|
|
9
|
-
*
|
|
10
|
-
* For better-auth Expo sessions, prefer a **bearer** token instead: read it with
|
|
11
|
-
* `@lunora/react-native/auth`'s `expoBearerToken` and feed it to
|
|
12
|
-
* `client.setAuthToken` / `setWsToken` (see the package README). A bearer avoids
|
|
13
|
-
* the `Cookie` header the runtime's CSRF guard rejects on `Origin`-less native
|
|
14
|
-
* requests.
|
|
15
|
-
|
|
4
|
+
* A `() => headers` factory the React Native client threads onto every HTTP RPC
|
|
5
|
+
* request *and* the WebSocket upgrade — a generic escape hatch for attaching a
|
|
6
|
+
* **custom** credential header (an API-gateway key, a proxy token, …) that
|
|
7
|
+
* React Native's missing cookie jar can't carry implicitly. Return `undefined`
|
|
8
|
+
* (or an empty object) when there's nothing to attach.
|
|
9
|
+
*
|
|
10
|
+
* For better-auth Expo sessions, prefer a **bearer** token instead: read it with
|
|
11
|
+
* `@lunora/react-native/auth`'s `expoBearerToken` and feed it to
|
|
12
|
+
* `client.setAuthToken` / `setWsToken` (see the package README). A bearer avoids
|
|
13
|
+
* the `Cookie` header the runtime's CSRF guard rejects on `Origin`-less native
|
|
14
|
+
* requests.
|
|
15
|
+
* @experimental
|
|
16
|
+
*/
|
|
16
17
|
type AuthHeadersFactory = () => Record<string, string> | undefined;
|
|
17
18
|
/**
|
|
18
|
-
* Options for `createLunoraClient` — the React Native / Expo counterpart to
|
|
19
|
-
* constructing a `LunoraClient` directly. It is `LunoraClientOptions` with two
|
|
20
|
-
* React-Native-shaped conveniences layered on. `storage` wires the
|
|
21
|
-
* AsyncStorage-backed offline-queue persistence for you (the browser default
|
|
22
|
-
* auto-probes IndexedDB, which React Native lacks, so without this the queue
|
|
23
|
-
* stays in memory and is lost on reload). `getAuthHeaders` is a generic escape
|
|
24
|
-
* hatch for a custom credential header on both the HTTP RPC path and the
|
|
25
|
-
* WebSocket upgrade; for better-auth sessions prefer a bearer token
|
|
26
|
-
* (`expoBearerToken` + the client's `setAuthToken` / `setWsToken`).
|
|
27
|
-
*
|
|
28
|
-
* The `persistence`, `fetch`, and `WebSocket` fields of `LunoraClientOptions`
|
|
29
|
-
* are still accepted and take precedence when you need full control; the two
|
|
30
|
-
* conveniences are sugar over exactly those seams.
|
|
31
|
-
|
|
19
|
+
* Options for `createLunoraClient` — the React Native / Expo counterpart to
|
|
20
|
+
* constructing a `LunoraClient` directly. It is `LunoraClientOptions` with two
|
|
21
|
+
* React-Native-shaped conveniences layered on. `storage` wires the
|
|
22
|
+
* AsyncStorage-backed offline-queue persistence for you (the browser default
|
|
23
|
+
* auto-probes IndexedDB, which React Native lacks, so without this the queue
|
|
24
|
+
* stays in memory and is lost on reload). `getAuthHeaders` is a generic escape
|
|
25
|
+
* hatch for a custom credential header on both the HTTP RPC path and the
|
|
26
|
+
* WebSocket upgrade; for better-auth sessions prefer a bearer token
|
|
27
|
+
* (`expoBearerToken` + the client's `setAuthToken` / `setWsToken`).
|
|
28
|
+
*
|
|
29
|
+
* The `persistence`, `fetch`, and `WebSocket` fields of `LunoraClientOptions`
|
|
30
|
+
* are still accepted and take precedence when you need full control; the two
|
|
31
|
+
* conveniences are sugar over exactly those seams.
|
|
32
|
+
* @experimental
|
|
33
|
+
*/
|
|
32
34
|
interface CreateLunoraClientOptions extends LunoraClientOptions {
|
|
33
35
|
/**
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
* Attaches a credential to every HTTP RPC request and to the WebSocket
|
|
37
|
+
* upgrade request. See `AuthHeadersFactory`. When omitted, requests go out
|
|
38
|
+
* with only whatever `LunoraClient` already sets (its bearer token from
|
|
39
|
+
* `setAuthToken`, if any).
|
|
40
|
+
*
|
|
41
|
+
* Merged UNDER the client's own headers on the HTTP path (an explicit
|
|
42
|
+
* `setAuthToken` bearer wins over a same-named header here); applied to the
|
|
43
|
+
* WebSocket upgrade via a wrapping `WebSocket`, since the socket has no other
|
|
44
|
+
* way to carry credentials in React Native.
|
|
45
|
+
*/
|
|
44
46
|
getAuthHeaders?: AuthHeadersFactory;
|
|
45
47
|
/**
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
* React Native `AsyncStorage` (or any async key/value store with the same
|
|
49
|
+
* `getItem`/`setItem`/`removeItem` surface — Expo `SecureStore`, an in-memory
|
|
50
|
+
* map in tests). When supplied, the offline mutation queue is persisted here
|
|
51
|
+
* via `createAsyncStoragePersistence`, so writes made offline survive an app
|
|
52
|
+
* restart. Ignored when an explicit `persistence` is passed.
|
|
53
|
+
*/
|
|
52
54
|
storage?: AsyncStorageLike;
|
|
53
55
|
}
|
|
54
56
|
/**
|
|
55
|
-
* Construct a `LunoraClient` tuned for React Native / Expo — a thin wrapper over
|
|
56
|
-
* `new LunoraClient(options)` that fills in the two things a browser gets for
|
|
57
|
-
* free but React Native does not.
|
|
58
|
-
*
|
|
59
|
-
* First, a durable offline queue: pass `storage` (React Native `AsyncStorage`,
|
|
60
|
-
* or any async key/value store) and the offline mutation queue is persisted
|
|
61
|
-
* through `createAsyncStoragePersistence` — the browser default auto-probes
|
|
62
|
-
* IndexedDB, which React Native lacks, so without this the queue lives only in
|
|
63
|
-
* memory and is lost on reload.
|
|
64
|
-
*
|
|
65
|
-
* Second, credentialed requests: pass `getAuthHeaders` and the returned headers
|
|
66
|
-
* ride both the HTTP RPC path and the WebSocket upgrade, since React Native has
|
|
67
|
-
* no cookie jar to attach a session implicitly.
|
|
68
|
-
*
|
|
69
|
-
* Everything on `LunoraClientOptions` is still accepted and passed through; an
|
|
70
|
-
* explicit `persistence`, `fetch`, or `WebSocket` takes precedence over the
|
|
71
|
-
* convenience derived from `storage` / `getAuthHeaders`. See the package README
|
|
72
|
-
* for a full setup example.
|
|
73
|
-
|
|
57
|
+
* Construct a `LunoraClient` tuned for React Native / Expo — a thin wrapper over
|
|
58
|
+
* `new LunoraClient(options)` that fills in the two things a browser gets for
|
|
59
|
+
* free but React Native does not.
|
|
60
|
+
*
|
|
61
|
+
* First, a durable offline queue: pass `storage` (React Native `AsyncStorage`,
|
|
62
|
+
* or any async key/value store) and the offline mutation queue is persisted
|
|
63
|
+
* through `createAsyncStoragePersistence` — the browser default auto-probes
|
|
64
|
+
* IndexedDB, which React Native lacks, so without this the queue lives only in
|
|
65
|
+
* memory and is lost on reload.
|
|
66
|
+
*
|
|
67
|
+
* Second, credentialed requests: pass `getAuthHeaders` and the returned headers
|
|
68
|
+
* ride both the HTTP RPC path and the WebSocket upgrade, since React Native has
|
|
69
|
+
* no cookie jar to attach a session implicitly.
|
|
70
|
+
*
|
|
71
|
+
* Everything on `LunoraClientOptions` is still accepted and passed through; an
|
|
72
|
+
* explicit `persistence`, `fetch`, or `WebSocket` takes precedence over the
|
|
73
|
+
* convenience derived from `storage` / `getAuthHeaders`. See the package README
|
|
74
|
+
* for a full setup example.
|
|
75
|
+
* @experimental
|
|
76
|
+
*/
|
|
74
77
|
declare const createLunoraClient: (options: CreateLunoraClientOptions) => LunoraClient;
|
|
75
78
|
export { type AuthHeadersFactory, type CreateLunoraClientOptions, createLunoraClient };
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export * from '@lunora/react';
|
|
1
|
+
import{createLunoraClient as o}from"./packem_shared/createLunoraClient-5PwdvVvS.mjs";export*from"@lunora/react";export{o as createLunoraClient};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{LunoraClient as i,createAsyncStoragePersistence as h}from"@lunora/client";const d=(s,t)=>(o,e)=>{const r=t();if(!r)return s(o,e);const c=new Headers(r);return e?.headers&&new Headers(e.headers).forEach((n,a)=>{c.set(a,n)}),s(o,{...e,headers:c})},f=(s,t)=>class extends s{constructor(o,e){const r=t();super(o,e,r?{headers:r}:void 0)}},b=s=>{const{getAuthHeaders:t,storage:o,...e}=s,r=t&&e.fetch===void 0&&typeof fetch=="function"?d(fetch.bind(globalThis),t):e.fetch,c=t&&e.WebSocket===void 0&&typeof WebSocket=="function"?f(WebSocket,t):e.WebSocket;return new i({...e,persistence:e.persistence??(o?h({storage:o}):void 0),fetch:r,WebSocket:c})};export{b as createLunoraClient,d as withAuthHeaders,f as withAuthWebSocket};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const o=/(?:^|;)[^;=]*session_token=([^;]+)/,t=e=>o.exec(e.getCookie())?.[1]??null;export{t as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lunora/react-native",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.11",
|
|
4
4
|
"description": "React Native / Expo integration for Lunora: an AsyncStorage-backed client factory, the useQuery/useMutation/useSubscription hooks, and a one-call better-auth Expo client",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cloudflare",
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
"access": "public"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@lunora/client": "1.0.0-alpha.
|
|
54
|
-
"@lunora/react": "1.0.0-alpha.
|
|
53
|
+
"@lunora/client": "1.0.0-alpha.31",
|
|
54
|
+
"@lunora/react": "1.0.0-alpha.35"
|
|
55
55
|
},
|
|
56
56
|
"peerDependencies": {
|
|
57
57
|
"@better-auth/expo": "^1.6.23",
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { LunoraClient, createAsyncStoragePersistence } from '@lunora/client';
|
|
2
|
-
|
|
3
|
-
const withAuthHeaders = (fetchImpl, getAuthHeaders) => (input, init) => {
|
|
4
|
-
const extra = getAuthHeaders();
|
|
5
|
-
if (!extra) {
|
|
6
|
-
return fetchImpl(input, init);
|
|
7
|
-
}
|
|
8
|
-
const merged = new Headers(extra);
|
|
9
|
-
if (init?.headers) {
|
|
10
|
-
new Headers(init.headers).forEach((value, key) => {
|
|
11
|
-
merged.set(key, value);
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
return fetchImpl(input, { ...init, headers: merged });
|
|
15
|
-
};
|
|
16
|
-
const withAuthWebSocket = (WebSocketImpl, getAuthHeaders) => class AuthWebSocket extends WebSocketImpl {
|
|
17
|
-
constructor(url, protocols) {
|
|
18
|
-
const headers = getAuthHeaders();
|
|
19
|
-
super(url, protocols, headers ? { headers } : void 0);
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
const createLunoraClient = (options) => {
|
|
23
|
-
const { getAuthHeaders, storage, ...rest } = options;
|
|
24
|
-
const authedFetch = getAuthHeaders && rest.fetch === void 0 && typeof fetch === "function" ? withAuthHeaders(fetch.bind(globalThis), getAuthHeaders) : rest.fetch;
|
|
25
|
-
const authedWebSocket = getAuthHeaders && rest.WebSocket === void 0 && typeof WebSocket === "function" ? withAuthWebSocket(WebSocket, getAuthHeaders) : rest.WebSocket;
|
|
26
|
-
return new LunoraClient({
|
|
27
|
-
...rest,
|
|
28
|
-
// Auto-wire AsyncStorage persistence unless the caller passed an explicit
|
|
29
|
-
// `persistence` (including `false` to opt out).
|
|
30
|
-
persistence: rest.persistence ?? (storage ? createAsyncStoragePersistence({ storage }) : void 0),
|
|
31
|
-
fetch: authedFetch,
|
|
32
|
-
WebSocket: authedWebSocket
|
|
33
|
-
});
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
export { createLunoraClient, withAuthHeaders, withAuthWebSocket };
|