@lakebed-native/client 0.1.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.
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import { type PressableProps } from "react-native";
3
+ export type SignInWithGoogleProps = PressableProps & {
4
+ children?: React.ReactNode;
5
+ clientId?: string;
6
+ redirectUri?: string;
7
+ shooBaseUrl?: string;
8
+ };
9
+ export declare function SignInWithGoogle({ children, clientId, redirectUri, shooBaseUrl, disabled, onPress, ...props }: SignInWithGoogleProps): React.ReactElement;
10
+ //# sourceMappingURL=SignInWithGoogle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignInWithGoogle.d.ts","sourceRoot":"","sources":["../../src/client/SignInWithGoogle.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAGpE,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG;IACnD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAC/B,QAAgC,EAChC,QAAQ,EACR,WAAW,EACX,WAAW,EACX,QAAQ,EACR,OAAO,EACP,GAAG,KAAK,EACT,EAAE,qBAAqB,GAAG,KAAK,CAAC,YAAY,CAe5C"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Pressable, Text } from "react-native";
3
+ import { signInWithGoogle } from "./api.js";
4
+ export function SignInWithGoogle({ children = "Sign in with Google", clientId, redirectUri, shooBaseUrl, disabled, onPress, ...props }) {
5
+ return (_jsx(Pressable, { accessibilityRole: "button", disabled: disabled, onPress: (event) => {
6
+ onPress?.(event);
7
+ if (event.defaultPrevented || disabled)
8
+ return;
9
+ void signInWithGoogle({ clientId, redirectUri, shooBaseUrl });
10
+ }, ...props, children: typeof children === "string" ? _jsx(Text, { children: children }) : children }));
11
+ }
12
+ //# sourceMappingURL=SignInWithGoogle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignInWithGoogle.js","sourceRoot":"","sources":["../../src/client/SignInWithGoogle.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAuB,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAS5C,MAAM,UAAU,gBAAgB,CAAC,EAC/B,QAAQ,GAAG,qBAAqB,EAChC,QAAQ,EACR,WAAW,EACX,WAAW,EACX,QAAQ,EACR,OAAO,EACP,GAAG,KAAK,EACc;IACtB,OAAO,CACL,KAAC,SAAS,IACR,iBAAiB,EAAC,QAAQ,EAC1B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;YACjB,IAAI,KAAK,CAAC,gBAAgB,IAAI,QAAQ;gBAAE,OAAO;YAC/C,KAAK,gBAAgB,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;QAChE,CAAC,KACG,KAAK,YAER,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAC,IAAI,cAAE,QAAQ,GAAQ,CAAC,CAAC,CAAC,QAAQ,GACxD,CACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { AuthUser } from "@lakebed-native/shared";
2
+ import { type GoogleAuthOptions } from "./google-auth.js";
3
+ import { type ClientTransport } from "./transport.js";
4
+ type ClientConfig = {
5
+ serverUrl: string;
6
+ appUrl?: string;
7
+ wsUrl?: string;
8
+ transport?: ClientTransport;
9
+ };
10
+ export declare function configureClient(c: Partial<ClientConfig>): void;
11
+ export declare function getClientConfig(): ClientConfig;
12
+ export declare function fetchQuery<T>(name: string, args?: unknown): Promise<T>;
13
+ export declare function fetchMutation<T>(name: string, args?: unknown): Promise<T>;
14
+ export declare function fetchAuth(): Promise<AuthUser | null>;
15
+ export declare function signInWithGoogle(options?: GoogleAuthOptions): Promise<AuthUser>;
16
+ export declare function signOut(): Promise<void>;
17
+ export type WsClient = {
18
+ subscribe: <T>(query: string, args: unknown | undefined, cb: (data: T) => void) => string;
19
+ unsubscribe: (id: string) => void;
20
+ mutate: <T>(mutation: string, args?: unknown) => Promise<T>;
21
+ close: () => void;
22
+ };
23
+ export declare function createWsClient(): WsClient;
24
+ export type { GoogleAuthOptions } from "./google-auth.js";
25
+ export type { ClientTransport } from "./transport.js";
26
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/client/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAOL,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAGxB,KAAK,YAAY,GAAG;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B,CAAC;AAEF,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAM9D;AAED,wBAAgB,eAAe,IAAI,YAAY,CAO9C;AAED,wBAAsB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAE5E;AAED,wBAAsB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAE/E;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAE1D;AAED,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAWzF;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7C;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,SAAS,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,CAAC;IAC1F,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5D,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,wBAAgB,cAAc,IAAI,QAAQ,CAiGzC;AAED,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,136 @@
1
+ import { readStoredAuthToken, runGooglePkceSignIn, } from "./google-auth.js";
2
+ import { hostedSubscribeQuery } from "./hosted-ws.js";
3
+ import { configureTransport, getTransportConfig, transportFetchAuth, transportFetchMutation, transportFetchQuery, transportSignOut, } from "./transport.js";
4
+ import { hostedReconnectAuth } from "./hosted-ws.js";
5
+ export function configureClient(c) {
6
+ configureTransport({
7
+ serverUrl: c.serverUrl,
8
+ appUrl: c.appUrl,
9
+ transport: c.transport,
10
+ });
11
+ }
12
+ export function getClientConfig() {
13
+ const t = getTransportConfig();
14
+ return {
15
+ serverUrl: t.serverUrl,
16
+ appUrl: t.appUrl,
17
+ transport: t.transport,
18
+ };
19
+ }
20
+ export async function fetchQuery(name, args) {
21
+ return transportFetchQuery(name, args);
22
+ }
23
+ export async function fetchMutation(name, args) {
24
+ return transportFetchMutation(name, args);
25
+ }
26
+ export async function fetchAuth() {
27
+ return transportFetchAuth();
28
+ }
29
+ export async function signInWithGoogle(options = {}) {
30
+ await runGooglePkceSignIn(options);
31
+ const transport = getTransportConfig().transport;
32
+ if (transport === "hosted-ws") {
33
+ await hostedReconnectAuth();
34
+ const user = await transportFetchAuth();
35
+ if (!user)
36
+ throw new Error("Google sign-in succeeded but hosted auth is unavailable.");
37
+ return user;
38
+ }
39
+ const idToken = await readStoredAuthToken();
40
+ return transportFetchMutation("signInWithGoogle", { idToken });
41
+ }
42
+ export async function signOut() {
43
+ await transportSignOut();
44
+ }
45
+ export function createWsClient() {
46
+ const config = getTransportConfig();
47
+ if (config.transport === "hosted-ws") {
48
+ let subCounter = 0;
49
+ const subs = new Map();
50
+ return {
51
+ subscribe(query, args, cb) {
52
+ const id = `hosted-sub-${++subCounter}`;
53
+ const unsub = hostedSubscribeQuery(query, cb, args);
54
+ subs.set(id, unsub);
55
+ return id;
56
+ },
57
+ unsubscribe(id) {
58
+ subs.get(id)?.();
59
+ subs.delete(id);
60
+ },
61
+ mutate(mutation, args) {
62
+ return transportFetchMutation(mutation, args);
63
+ },
64
+ close() {
65
+ for (const unsub of subs.values())
66
+ unsub();
67
+ subs.clear();
68
+ },
69
+ };
70
+ }
71
+ const wsUrl = config.serverUrl.replace(/^http/, "ws") + "/ws";
72
+ const ws = new WebSocket(wsUrl);
73
+ const subs = new Map();
74
+ let subCounter = 0;
75
+ const pendingMutations = new Map();
76
+ ws.onmessage = (event) => {
77
+ const msg = JSON.parse(String(event.data));
78
+ if (msg.type === "query-result" && msg.subscriptionId) {
79
+ subs.get(msg.subscriptionId)?.(msg.data);
80
+ }
81
+ if (msg.type === "mutation-result" && msg.requestId) {
82
+ const pending = pendingMutations.get(msg.requestId);
83
+ if (pending) {
84
+ if (msg.error)
85
+ pending.reject(new Error(msg.error));
86
+ else
87
+ pending.resolve(msg.data);
88
+ pendingMutations.delete(msg.requestId);
89
+ }
90
+ }
91
+ };
92
+ return {
93
+ subscribe(query, args, cb) {
94
+ const id = `client-sub-${++subCounter}`;
95
+ subs.set(id, cb);
96
+ const send = () => {
97
+ if (ws.readyState === WebSocket.OPEN) {
98
+ ws.send(JSON.stringify({ type: "subscribe", query, args, subscriptionId: id }));
99
+ }
100
+ else {
101
+ ws.addEventListener("open", send, { once: true });
102
+ }
103
+ };
104
+ send();
105
+ return id;
106
+ },
107
+ unsubscribe(id) {
108
+ subs.delete(id);
109
+ if (ws.readyState === WebSocket.OPEN) {
110
+ ws.send(JSON.stringify({ type: "unsubscribe", subscriptionId: id }));
111
+ }
112
+ },
113
+ mutate(mutation, args) {
114
+ return new Promise((resolve, reject) => {
115
+ const requestId = crypto.randomUUID();
116
+ pendingMutations.set(requestId, {
117
+ resolve: (v) => resolve(v),
118
+ reject,
119
+ });
120
+ const send = () => {
121
+ if (ws.readyState === WebSocket.OPEN) {
122
+ ws.send(JSON.stringify({ type: "mutate", mutation, args, requestId }));
123
+ }
124
+ else {
125
+ ws.addEventListener("open", send, { once: true });
126
+ }
127
+ };
128
+ send();
129
+ });
130
+ },
131
+ close() {
132
+ ws.close();
133
+ },
134
+ };
135
+ }
136
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/client/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type GoogleAuthOptions = {
2
+ clientId?: string;
3
+ redirectUri?: string;
4
+ shooBaseUrl?: string;
5
+ };
6
+ export type StoredIdentity = {
7
+ userId: string;
8
+ token: string;
9
+ expiresAt?: number;
10
+ };
11
+ export declare function readStoredIdentity(): Promise<StoredIdentity | null>;
12
+ export declare function persistIdentity(userId: string, token: string, expiresIn?: number): Promise<void>;
13
+ export declare function clearStoredIdentity(): Promise<void>;
14
+ export declare function readStoredAuthToken(): Promise<string | null>;
15
+ export declare function runGooglePkceSignIn(options?: GoogleAuthOptions): Promise<{
16
+ idToken: string;
17
+ userId: string;
18
+ }>;
19
+ //# sourceMappingURL=google-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-auth.d.ts","sourceRoot":"","sources":["../../src/client/google-auth.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAyEF,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAQzE;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEzD;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQlE;AA6ED,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAmD9C"}
@@ -0,0 +1,209 @@
1
+ const IDENTITY_KEY = "lakebed_identity";
2
+ const PKCE_KEY = "lakebed_google_pkce";
3
+ const PKCE_MAX_AGE_MS = 10 * 60 * 1000;
4
+ const DEFAULT_SHOO_BASE_URL = "https://shoo.dev";
5
+ function randomString(length) {
6
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";
7
+ const bytes = new Uint8Array(length);
8
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
9
+ crypto.getRandomValues(bytes);
10
+ }
11
+ else {
12
+ for (let i = 0; i < length; i++)
13
+ bytes[i] = Math.floor(Math.random() * 256);
14
+ }
15
+ let value = "";
16
+ for (const byte of bytes)
17
+ value += chars[byte % chars.length];
18
+ return value;
19
+ }
20
+ async function sha256Base64Url(input) {
21
+ const cryptoMod = await import("expo-crypto").catch(() => null);
22
+ if (cryptoMod) {
23
+ try {
24
+ return await cryptoMod.digestStringAsync(cryptoMod.CryptoDigestAlgorithm.SHA256, input, {
25
+ encoding: "base64url",
26
+ });
27
+ }
28
+ catch {
29
+ // fall through to web crypto
30
+ }
31
+ }
32
+ const data = new TextEncoder().encode(input);
33
+ const digest = await crypto.subtle.digest("SHA-256", data);
34
+ return bytesToBase64Url(new Uint8Array(digest));
35
+ }
36
+ function bytesToBase64Url(bytes) {
37
+ let binary = "";
38
+ for (const byte of bytes)
39
+ binary += String.fromCharCode(byte);
40
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
41
+ }
42
+ async function storageGet(key) {
43
+ const SecureStore = await import("expo-secure-store").catch(() => null);
44
+ if (!SecureStore)
45
+ return null;
46
+ try {
47
+ return await SecureStore.getItemAsync(key);
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ async function storageSet(key, value) {
54
+ const SecureStore = await import("expo-secure-store").catch(() => null);
55
+ if (!SecureStore)
56
+ return;
57
+ try {
58
+ await SecureStore.setItemAsync(key, value);
59
+ }
60
+ catch {
61
+ // ignore
62
+ }
63
+ }
64
+ async function storageDelete(key) {
65
+ const SecureStore = await import("expo-secure-store").catch(() => null);
66
+ if (!SecureStore)
67
+ return;
68
+ try {
69
+ await SecureStore.deleteItemAsync(key);
70
+ }
71
+ catch {
72
+ // ignore
73
+ }
74
+ }
75
+ export async function readStoredIdentity() {
76
+ const raw = await storageGet(IDENTITY_KEY);
77
+ if (!raw)
78
+ return null;
79
+ try {
80
+ return JSON.parse(raw);
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ }
86
+ export async function persistIdentity(userId, token, expiresIn) {
87
+ const expiresAt = typeof expiresIn === "number" ? Date.now() + expiresIn * 1000 : undefined;
88
+ await storageSet(IDENTITY_KEY, JSON.stringify({ userId, token, expiresAt }));
89
+ }
90
+ export async function clearStoredIdentity() {
91
+ await storageDelete(IDENTITY_KEY);
92
+ }
93
+ export async function readStoredAuthToken() {
94
+ const identity = await readStoredIdentity();
95
+ if (!identity?.token)
96
+ return null;
97
+ if (identity.expiresAt && identity.expiresAt <= Date.now()) {
98
+ await clearStoredIdentity();
99
+ return null;
100
+ }
101
+ return identity.token;
102
+ }
103
+ function resolveGoogleAuthOptions(options = {}) {
104
+ let redirectUri = options.redirectUri;
105
+ if (!redirectUri) {
106
+ try {
107
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
108
+ const Linking = require("expo-linking");
109
+ redirectUri = Linking.createURL("auth/callback");
110
+ }
111
+ catch {
112
+ redirectUri = "lakebed-native://auth/callback";
113
+ }
114
+ }
115
+ const clientId = options.clientId ?? `origin:${new URL(redirectUri).origin}`;
116
+ return {
117
+ clientId,
118
+ redirectUri,
119
+ shooBaseUrl: String(options.shooBaseUrl ?? DEFAULT_SHOO_BASE_URL).replace(/\/+$/g, ""),
120
+ };
121
+ }
122
+ async function createPkceBundle() {
123
+ const verifier = randomString(64);
124
+ const state = randomString(32);
125
+ const challenge = await sha256Base64Url(verifier);
126
+ return { verifier, state, challenge };
127
+ }
128
+ function createSignInUrl(options, bundle) {
129
+ const url = new URL("/authorize", options.shooBaseUrl);
130
+ url.searchParams.set("client_id", options.clientId);
131
+ url.searchParams.set("redirect_uri", options.redirectUri);
132
+ url.searchParams.set("state", bundle.state);
133
+ url.searchParams.set("code_challenge", bundle.challenge);
134
+ url.searchParams.set("code_challenge_method", "S256");
135
+ url.searchParams.set("pii", "true");
136
+ return url.toString();
137
+ }
138
+ async function exchangeCode(options) {
139
+ const body = new URLSearchParams({
140
+ client_id: options.auth.clientId,
141
+ code: options.code,
142
+ code_verifier: options.codeVerifier,
143
+ grant_type: "authorization_code",
144
+ redirect_uri: options.auth.redirectUri,
145
+ });
146
+ const response = await fetch(new URL("/token", options.auth.shooBaseUrl), {
147
+ body,
148
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
149
+ method: "POST",
150
+ });
151
+ if (!response.ok) {
152
+ throw new Error(`Google sign-in token exchange failed (${response.status})`);
153
+ }
154
+ return response.json();
155
+ }
156
+ function parseCallbackUrl(url) {
157
+ const parsed = new URL(url);
158
+ const code = parsed.searchParams.get("code");
159
+ const state = parsed.searchParams.get("state");
160
+ if (!code || !state)
161
+ return null;
162
+ return { code, state };
163
+ }
164
+ export async function runGooglePkceSignIn(options = {}) {
165
+ const auth = resolveGoogleAuthOptions(options);
166
+ const bundle = await createPkceBundle();
167
+ const pkce = { verifier: bundle.verifier, state: bundle.state, createdAt: Date.now() };
168
+ await storageSet(PKCE_KEY, JSON.stringify(pkce));
169
+ const signInUrl = createSignInUrl(auth, bundle);
170
+ let callbackUrl;
171
+ const WebBrowser = await import("expo-web-browser").catch(() => null);
172
+ if (!WebBrowser) {
173
+ throw new Error("Google sign-in requires expo-web-browser in the Lakebed Native shell.");
174
+ }
175
+ try {
176
+ WebBrowser.maybeCompleteAuthSession();
177
+ const result = await WebBrowser.openAuthSessionAsync(signInUrl, auth.redirectUri);
178
+ if (result.type !== "success" || !("url" in result) || !result.url) {
179
+ throw new Error("Google sign-in was canceled.");
180
+ }
181
+ callbackUrl = result.url;
182
+ }
183
+ catch {
184
+ throw new Error("Google sign-in requires expo-web-browser in the Lakebed Native shell.");
185
+ }
186
+ const callback = parseCallbackUrl(callbackUrl);
187
+ if (!callback)
188
+ throw new Error("Google sign-in callback was missing code/state.");
189
+ const rawPkce = await storageGet(PKCE_KEY);
190
+ const parsedPkce = rawPkce ? JSON.parse(rawPkce) : null;
191
+ await storageDelete(PKCE_KEY);
192
+ if (!parsedPkce?.verifier || parsedPkce.state !== callback.state) {
193
+ throw new Error("Google sign-in state mismatch.");
194
+ }
195
+ if (Date.now() - parsedPkce.createdAt > PKCE_MAX_AGE_MS) {
196
+ throw new Error("Google sign-in verifier expired.");
197
+ }
198
+ const token = await exchangeCode({
199
+ code: callback.code,
200
+ codeVerifier: parsedPkce.verifier,
201
+ auth,
202
+ });
203
+ if (!token.id_token || !token.pairwise_sub) {
204
+ throw new Error("Google sign-in token response was missing identity claims.");
205
+ }
206
+ await persistIdentity(`google:${token.pairwise_sub}`, token.id_token, token.expires_in);
207
+ return { idToken: token.id_token, userId: `google:${token.pairwise_sub}` };
208
+ }
209
+ //# sourceMappingURL=google-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-auth.js","sourceRoot":"","sources":["../../src/client/google-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { AuthUser } from "@lakebed-native/shared";
2
+ export { configureClient, fetchAuth, fetchMutation, fetchQuery, getClientConfig, signInWithGoogle as apiSignInWithGoogle, signOut as apiSignOut, } from "./api.js";
3
+ export declare function useAuth(): {
4
+ user: AuthUser | null;
5
+ loading: boolean;
6
+ refresh: () => Promise<void>;
7
+ };
8
+ export declare function useQuery<T>(name: string, args?: unknown): {
9
+ data: T | undefined;
10
+ loading: boolean;
11
+ error: Error | null;
12
+ refetch: () => Promise<void>;
13
+ };
14
+ export declare function useMutation<TArgs = unknown, TResult = unknown>(name: string): {
15
+ mutate: (args?: TArgs) => Promise<TResult>;
16
+ loading: boolean;
17
+ error: Error | null;
18
+ };
19
+ export declare function signInWithGoogle(): Promise<AuthUser>;
20
+ export declare function signOut(): Promise<void>;
21
+ /** Provider-less config hook for shell bootstrap */
22
+ export declare function useClientBootstrap(serverUrl: string): boolean;
23
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/client/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAWvD,OAAO,EACL,eAAe,EACf,SAAS,EACT,aAAa,EACb,UAAU,EACV,eAAe,EACf,gBAAgB,IAAI,mBAAmB,EACvC,OAAO,IAAI,UAAU,GACtB,MAAM,UAAU,CAAC;AAElB,wBAAgB,OAAO,IAAI;IACzB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAkBA;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG;IACzD,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAuBA;AAED,wBAAgB,WAAW,CAAC,KAAK,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC5D,IAAI,EAAE,MAAM,GACX;IACD,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB,CAsBA;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,QAAQ,CAAC,CAE1D;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7C;AAED,oDAAoD;AACpD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAU7D"}
@@ -0,0 +1,78 @@
1
+ import { useCallback, useEffect, useState, useSyncExternalStore } from "react";
2
+ import { configureClient, fetchAuth, fetchMutation, fetchQuery, signInWithGoogle as apiSignInWithGoogle, signOut as apiSignOut, } from "./api.js";
3
+ export { configureClient, fetchAuth, fetchMutation, fetchQuery, getClientConfig, signInWithGoogle as apiSignInWithGoogle, signOut as apiSignOut, } from "./api.js";
4
+ export function useAuth() {
5
+ const [user, setUser] = useState(null);
6
+ const [loading, setLoading] = useState(true);
7
+ const refresh = useCallback(async () => {
8
+ setLoading(true);
9
+ try {
10
+ setUser(await fetchAuth());
11
+ }
12
+ finally {
13
+ setLoading(false);
14
+ }
15
+ }, []);
16
+ useEffect(() => {
17
+ void refresh();
18
+ }, [refresh]);
19
+ return { user, loading, refresh };
20
+ }
21
+ export function useQuery(name, args) {
22
+ const [data, setData] = useState(undefined);
23
+ const [loading, setLoading] = useState(true);
24
+ const [error, setError] = useState(null);
25
+ const refetch = useCallback(async () => {
26
+ setLoading(true);
27
+ setError(null);
28
+ try {
29
+ const result = await fetchQuery(name, args);
30
+ setData(result);
31
+ }
32
+ catch (err) {
33
+ setError(err instanceof Error ? err : new Error(String(err)));
34
+ }
35
+ finally {
36
+ setLoading(false);
37
+ }
38
+ }, [name, JSON.stringify(args)]);
39
+ useEffect(() => {
40
+ void refetch();
41
+ }, [refetch]);
42
+ return { data, loading, error, refetch };
43
+ }
44
+ export function useMutation(name) {
45
+ const [loading, setLoading] = useState(false);
46
+ const [error, setError] = useState(null);
47
+ const mutate = useCallback(async (args) => {
48
+ setLoading(true);
49
+ setError(null);
50
+ try {
51
+ return await fetchMutation(name, args);
52
+ }
53
+ catch (err) {
54
+ const e = err instanceof Error ? err : new Error(String(err));
55
+ setError(e);
56
+ throw e;
57
+ }
58
+ finally {
59
+ setLoading(false);
60
+ }
61
+ }, [name]);
62
+ return { mutate, loading, error };
63
+ }
64
+ export async function signInWithGoogle() {
65
+ return apiSignInWithGoogle();
66
+ }
67
+ export async function signOut() {
68
+ return apiSignOut();
69
+ }
70
+ /** Provider-less config hook for shell bootstrap */
71
+ export function useClientBootstrap(serverUrl) {
72
+ const ready = useSyncExternalStore(() => () => { }, () => true, () => false);
73
+ useEffect(() => {
74
+ configureClient({ serverUrl });
75
+ }, [serverUrl]);
76
+ return ready;
77
+ }
78
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/client/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { AuthUser } from "@lakebed-native/shared";
2
+ export declare function configureHostedWs(url: string): void;
3
+ export declare function hostedFetchQuery<T>(name: string, args?: unknown): Promise<T>;
4
+ export declare function hostedFetchMutation<T>(name: string, args?: unknown): Promise<T>;
5
+ export declare function hostedFetchAuth(): Promise<AuthUser | null>;
6
+ export declare function hostedReconnectAuth(): Promise<void>;
7
+ export declare function hostedSubscribeQuery<T>(name: string, cb: (data: T) => void, args?: unknown): () => void;
8
+ //# sourceMappingURL=hosted-ws.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-ws.d.ts","sourceRoot":"","sources":["../../src/client/hosted-ws.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAyGvD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAQnD;AAuCD,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAOlF;AAED,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAKrF;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAKhE;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOzD;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EACrB,IAAI,CAAC,EAAE,OAAO,GACb,MAAM,IAAI,CAYZ"}
@@ -0,0 +1,163 @@
1
+ import { readStoredAuthToken } from "./google-auth.js";
2
+ let appUrl = "";
3
+ let socket = null;
4
+ let nextRequestId = 1;
5
+ const pending = new Map();
6
+ const queryListeners = new Map();
7
+ let currentAuth = null;
8
+ let connectPromise = null;
9
+ function hostedAuthToUser(auth) {
10
+ if (!auth?.userId)
11
+ return null;
12
+ const id = auth.userId.startsWith("guest:") ? "guest" : auth.userId;
13
+ return {
14
+ id,
15
+ name: auth.displayName ?? "User",
16
+ email: auth.email,
17
+ avatarUrl: auth.picture,
18
+ };
19
+ }
20
+ function wsUrlForApp(base, token) {
21
+ const normalized = base.replace(/\/+$/g, "");
22
+ const protocol = normalized.startsWith("https") ? "wss" : "ws";
23
+ const hostPath = normalized.replace(/^https?:\/\//, "");
24
+ const url = new URL(`${protocol}://${hostPath}/__lakebed/ws`);
25
+ if (token)
26
+ url.searchParams.set("lakebed_token", token);
27
+ return url.toString();
28
+ }
29
+ function send(message) {
30
+ const ws = socket;
31
+ if (!ws)
32
+ throw new Error("Lakebed hosted connection is not open.");
33
+ const payload = JSON.stringify(message);
34
+ if (ws.readyState === WebSocket.OPEN) {
35
+ ws.send(payload);
36
+ return;
37
+ }
38
+ ws.addEventListener("open", () => ws.send(payload), { once: true });
39
+ }
40
+ function request(op, payload = {}) {
41
+ const id = nextRequestId++;
42
+ send({ id, op, ...payload });
43
+ return new Promise((resolve, reject) => {
44
+ pending.set(id, { resolve, reject });
45
+ });
46
+ }
47
+ function emitQuery(name, data) {
48
+ for (const listener of queryListeners.get(name) ?? []) {
49
+ listener(data);
50
+ }
51
+ }
52
+ function handleMessage(raw) {
53
+ const message = JSON.parse(raw);
54
+ if (message.op === "auth.result" && message.auth) {
55
+ currentAuth = hostedAuthToUser(message.auth);
56
+ }
57
+ if (message.op === "query.result" && message.name) {
58
+ emitQuery(message.name, message.data);
59
+ return;
60
+ }
61
+ if (typeof message.id === "number" && pending.has(message.id)) {
62
+ const handlers = pending.get(message.id);
63
+ pending.delete(message.id);
64
+ if (message.ok === false) {
65
+ handlers.reject(new Error(message.error ?? "Lakebed hosted request failed"));
66
+ return;
67
+ }
68
+ const result = message.op === "auth.result" ? currentAuth : (message.result ?? message.data);
69
+ handlers.resolve(result);
70
+ }
71
+ }
72
+ export function configureHostedWs(url) {
73
+ appUrl = url.replace(/\/+$/g, "");
74
+ if (socket) {
75
+ socket.close();
76
+ socket = null;
77
+ }
78
+ connectPromise = null;
79
+ currentAuth = null;
80
+ }
81
+ async function ensureConnected() {
82
+ if (!appUrl)
83
+ throw new Error("Hosted app URL is not configured.");
84
+ if (socket && (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING)) {
85
+ if (socket.readyState === WebSocket.OPEN)
86
+ return;
87
+ await connectPromise;
88
+ return;
89
+ }
90
+ connectPromise = new Promise((resolve, reject) => {
91
+ void (async () => {
92
+ try {
93
+ const token = await readStoredAuthToken();
94
+ socket = new WebSocket(wsUrlForApp(appUrl, token));
95
+ socket.addEventListener("open", () => {
96
+ send({ op: "auth.get" });
97
+ resolve();
98
+ });
99
+ socket.addEventListener("message", (event) => handleMessage(String(event.data)));
100
+ socket.addEventListener("error", () => reject(new Error("Lakebed hosted websocket failed")));
101
+ socket.addEventListener("close", () => {
102
+ socket = null;
103
+ connectPromise = null;
104
+ });
105
+ }
106
+ catch (err) {
107
+ reject(err instanceof Error ? err : new Error(String(err)));
108
+ }
109
+ })();
110
+ });
111
+ await connectPromise;
112
+ }
113
+ function hostedQueryArgs(args) {
114
+ if (args === undefined)
115
+ return undefined;
116
+ return Array.isArray(args) ? args : [args];
117
+ }
118
+ export async function hostedFetchQuery(name, args) {
119
+ await ensureConnected();
120
+ const payload = { name };
121
+ const argList = hostedQueryArgs(args);
122
+ if (argList)
123
+ payload.args = argList;
124
+ const data = await request("query.subscribe", payload);
125
+ return data;
126
+ }
127
+ export async function hostedFetchMutation(name, args) {
128
+ await ensureConnected();
129
+ const argList = args === undefined ? [] : Array.isArray(args) ? args : [args];
130
+ const result = await request("mutation.run", { name, args: argList });
131
+ return result;
132
+ }
133
+ export async function hostedFetchAuth() {
134
+ await ensureConnected();
135
+ if (currentAuth)
136
+ return currentAuth;
137
+ await request("auth.get");
138
+ return currentAuth;
139
+ }
140
+ export async function hostedReconnectAuth() {
141
+ if (socket) {
142
+ socket.close();
143
+ socket = null;
144
+ }
145
+ connectPromise = null;
146
+ await ensureConnected();
147
+ }
148
+ export function hostedSubscribeQuery(name, cb, args) {
149
+ if (!queryListeners.has(name))
150
+ queryListeners.set(name, new Set());
151
+ queryListeners.get(name).add(cb);
152
+ void ensureConnected().then(() => {
153
+ const payload = { op: "query.subscribe", name };
154
+ const argList = hostedQueryArgs(args);
155
+ if (argList)
156
+ payload.args = argList;
157
+ send(payload);
158
+ });
159
+ return () => {
160
+ queryListeners.get(name)?.delete(cb);
161
+ };
162
+ }
163
+ //# sourceMappingURL=hosted-ws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-ws.js","sourceRoot":"","sources":["../../src/client/hosted-ws.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { configureClient, getClientConfig, useAuth, useQuery, useMutation, useClientBootstrap, } from "./hooks.js";
2
+ export { signInWithGoogle, signOut } from "./api.js";
3
+ export { fetchQuery, fetchMutation, createWsClient } from "./api.js";
4
+ export { SignInWithGoogle } from "./SignInWithGoogle.js";
5
+ export type { SignInWithGoogleProps } from "./SignInWithGoogle.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,eAAe,EACf,OAAO,EACP,QAAQ,EACR,WAAW,EACX,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { configureClient, getClientConfig, useAuth, useQuery, useMutation, useClientBootstrap, } from "./hooks.js";
2
+ export { signInWithGoogle, signOut } from "./api.js";
3
+ export { fetchQuery, fetchMutation, createWsClient } from "./api.js";
4
+ export { SignInWithGoogle } from "./SignInWithGoogle.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,eAAe,EACf,OAAO,EACP,QAAQ,EACR,WAAW,EACX,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { AuthUser } from "@lakebed-native/shared";
2
+ export type ClientTransport = "local-http" | "hosted-ws";
3
+ type TransportConfig = {
4
+ serverUrl: string;
5
+ appUrl?: string;
6
+ transport: ClientTransport;
7
+ };
8
+ export declare function isHostedLakebedUrl(url: string): boolean;
9
+ export declare function resolveTransport(serverUrl: string, explicit?: ClientTransport): ClientTransport;
10
+ export declare function configureTransport(c: {
11
+ serverUrl?: string;
12
+ appUrl?: string;
13
+ transport?: ClientTransport;
14
+ }): void;
15
+ export declare function getTransportConfig(): TransportConfig;
16
+ export declare function transportFetchQuery<T>(name: string, args?: unknown): Promise<T>;
17
+ export declare function transportFetchMutation<T>(name: string, args?: unknown): Promise<T>;
18
+ export declare function transportFetchAuth(): Promise<AuthUser | null>;
19
+ export declare function transportSignOut(): Promise<void>;
20
+ export {};
21
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAIvD,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,WAAW,CAAC;AAEzD,KAAK,eAAe,GAAG;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,eAAe,CAAC;CAC5B,CAAC;AAOF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUvD;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,eAAe,CAM/F;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B,GAAG,IAAI,CAWP;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAEpD;AAOD,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAerF;AAED,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAexF;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CASnE;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOtD"}
@@ -0,0 +1,103 @@
1
+ import { clearStoredIdentity, readStoredAuthToken } from "./google-auth.js";
2
+ import * as hosted from "./hosted-ws.js";
3
+ let config = {
4
+ serverUrl: "http://localhost:3000",
5
+ transport: "local-http",
6
+ };
7
+ export function isHostedLakebedUrl(url) {
8
+ try {
9
+ const parsed = new URL(url);
10
+ const host = parsed.hostname;
11
+ if (host === "localhost" || host === "127.0.0.1" || host === "::1")
12
+ return false;
13
+ if (parsed.pathname.includes("/d/"))
14
+ return false;
15
+ return host.endsWith(".lakebed.app") || host.endsWith(".lakebed.dev");
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ export function resolveTransport(serverUrl, explicit) {
22
+ if (explicit)
23
+ return explicit;
24
+ if (isHostedLakebedUrl(serverUrl))
25
+ return "hosted-ws";
26
+ if (serverUrl.includes("/d/") && serverUrl.includes("/api"))
27
+ return "local-http";
28
+ if (serverUrl.includes("localhost") || serverUrl.includes("127.0.0.1"))
29
+ return "local-http";
30
+ return "hosted-ws";
31
+ }
32
+ export function configureTransport(c) {
33
+ const serverUrl = (c.appUrl ?? c.serverUrl ?? config.serverUrl).replace(/\/+$/g, "");
34
+ const transport = resolveTransport(serverUrl, c.transport);
35
+ config = {
36
+ serverUrl: transport === "hosted-ws" ? serverUrl : (c.serverUrl ?? serverUrl),
37
+ appUrl: transport === "hosted-ws" ? serverUrl : c.appUrl,
38
+ transport,
39
+ };
40
+ if (transport === "hosted-ws") {
41
+ hosted.configureHostedWs(serverUrl);
42
+ }
43
+ }
44
+ export function getTransportConfig() {
45
+ return config;
46
+ }
47
+ async function localAuthHeaders() {
48
+ const token = await readStoredAuthToken();
49
+ return token ? { Authorization: `Bearer ${token}` } : {};
50
+ }
51
+ export async function transportFetchQuery(name, args) {
52
+ if (config.transport === "hosted-ws") {
53
+ return hosted.hostedFetchQuery(name, args);
54
+ }
55
+ const res = await fetch(`${config.serverUrl}/query`, {
56
+ method: "POST",
57
+ headers: {
58
+ "Content-Type": "application/json",
59
+ ...(await localAuthHeaders()),
60
+ },
61
+ body: JSON.stringify({ name, args }),
62
+ });
63
+ const json = (await res.json());
64
+ if (!res.ok || json.error)
65
+ throw new Error(json.error ?? `Query failed: ${name}`);
66
+ return json.data;
67
+ }
68
+ export async function transportFetchMutation(name, args) {
69
+ if (config.transport === "hosted-ws") {
70
+ return hosted.hostedFetchMutation(name, args);
71
+ }
72
+ const res = await fetch(`${config.serverUrl}/mutation`, {
73
+ method: "POST",
74
+ headers: {
75
+ "Content-Type": "application/json",
76
+ ...(await localAuthHeaders()),
77
+ },
78
+ body: JSON.stringify({ name, args }),
79
+ });
80
+ const json = (await res.json());
81
+ if (!res.ok || json.error)
82
+ throw new Error(json.error ?? `Mutation failed: ${name}`);
83
+ return json.data;
84
+ }
85
+ export async function transportFetchAuth() {
86
+ if (config.transport === "hosted-ws") {
87
+ return hosted.hostedFetchAuth();
88
+ }
89
+ const res = await fetch(`${config.serverUrl}/auth`, {
90
+ headers: await localAuthHeaders(),
91
+ });
92
+ const json = (await res.json());
93
+ return json.user;
94
+ }
95
+ export async function transportSignOut() {
96
+ await clearStoredIdentity();
97
+ if (config.transport === "hosted-ws") {
98
+ await hosted.hostedReconnectAuth();
99
+ return;
100
+ }
101
+ await fetch(`${config.serverUrl}/auth/reset`, { method: "POST" });
102
+ }
103
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@lakebed-native/client",
3
+ "version": "0.1.0",
4
+ "description": "Lakebed Native client runtime",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/mawlicious/lakebed-native.git",
9
+ "directory": "packages/client"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "type": "module",
18
+ "main": "./dist/client/index.js",
19
+ "types": "./dist/client/index.d.ts",
20
+ "exports": {
21
+ "./client": {
22
+ "types": "./dist/client/index.d.ts",
23
+ "import": "./dist/client/index.js",
24
+ "react-native": "./dist/client/index.js"
25
+ }
26
+ },
27
+ "scripts": {
28
+ "build": "tsc -p tsconfig.json"
29
+ },
30
+ "peerDependencies": {
31
+ "react": ">=18",
32
+ "react-native": ">=0.79"
33
+ },
34
+ "peerDependenciesMeta": {
35
+ "expo-crypto": { "optional": true },
36
+ "expo-linking": { "optional": true },
37
+ "expo-secure-store": { "optional": true },
38
+ "expo-web-browser": { "optional": true }
39
+ },
40
+ "dependencies": {
41
+ "@lakebed-native/shared": "0.1.0"
42
+ },
43
+ "devDependencies": {
44
+ "@types/react": "^19.1.2",
45
+ "react": "^19.1.0",
46
+ "react-native": "^0.79.2"
47
+ }
48
+ }