@blinkdotnew/sdk 0.19.6 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -179
- package/dist/index.d.mts +6 -239
- package/dist/index.d.ts +6 -239
- package/dist/index.js +154 -559
- package/dist/index.mjs +154 -559
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -146,7 +146,7 @@ This SDK powers every Blink-generated app with:
|
|
|
146
146
|
|
|
147
147
|
- **🔐 Authentication**: Flexible auth system with managed (redirect) and headless (custom UI) modes, email/password, social providers (Google, GitHub, Apple, Microsoft), magic links, RBAC, and custom email branding
|
|
148
148
|
- **🗄️ Database**: PostgREST-compatible CRUD operations with advanced filtering
|
|
149
|
-
- **🤖 AI**:
|
|
149
|
+
- **🤖 AI**: Text generation with web search, object generation, image creation (Gemini 2.5 Flash), speech synthesis, and transcription
|
|
150
150
|
- **📄 Data**: Extract text content from documents, secure API proxy with secret substitution, web scraping, screenshots, and web search
|
|
151
151
|
- **📁 Storage**: File upload, download, and management
|
|
152
152
|
- **📧 Notifications**: Email sending with attachments, custom branding, and delivery tracking
|
|
@@ -195,167 +195,48 @@ const blink = createClient({
|
|
|
195
195
|
|
|
196
196
|
The SDK has **first-class React Native support** with platform-aware features that automatically adapt to mobile environments.
|
|
197
197
|
|
|
198
|
-
#### Step 1: Install Dependencies
|
|
199
|
-
|
|
200
198
|
```bash
|
|
201
|
-
npm install @blinkdotnew/sdk @react-native-async-storage/async-storage
|
|
199
|
+
npm install @blinkdotnew/sdk @react-native-async-storage/async-storage
|
|
202
200
|
```
|
|
203
201
|
|
|
204
|
-
**Required packages:**
|
|
205
|
-
- `@blinkdotnew/sdk` - The Blink SDK
|
|
206
|
-
- `@react-native-async-storage/async-storage` - For token persistence
|
|
207
|
-
- `expo-web-browser` - For OAuth authentication (Google, GitHub, Apple, etc.)
|
|
208
|
-
|
|
209
|
-
#### Step 2: Create Client (`lib/blink.ts`)
|
|
210
|
-
|
|
211
|
-
**⚠️ IMPORTANT: You MUST pass `webBrowser: WebBrowser` to enable OAuth on mobile!**
|
|
212
|
-
|
|
213
202
|
```typescript
|
|
214
|
-
// lib/blink.ts
|
|
215
203
|
import { createClient, AsyncStorageAdapter } from '@blinkdotnew/sdk'
|
|
216
204
|
import AsyncStorage from '@react-native-async-storage/async-storage'
|
|
217
|
-
import * as WebBrowser from 'expo-web-browser' // ← Import this
|
|
218
205
|
|
|
219
|
-
|
|
206
|
+
const blink = createClient({
|
|
220
207
|
projectId: 'your-project-id',
|
|
221
208
|
authRequired: false,
|
|
222
|
-
|
|
223
|
-
mode: 'headless',
|
|
224
|
-
webBrowser: WebBrowser // ← Pass it here! Required for OAuth
|
|
225
|
-
},
|
|
209
|
+
// Use AsyncStorage for secure token persistence on mobile
|
|
226
210
|
storage: new AsyncStorageAdapter(AsyncStorage)
|
|
227
211
|
})
|
|
228
|
-
```
|
|
229
212
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
// Sign up
|
|
235
|
-
const user = await blink.auth.signUp({
|
|
236
|
-
email: 'user@example.com',
|
|
237
|
-
password: 'SecurePass123'
|
|
213
|
+
// All features work seamlessly in React Native!
|
|
214
|
+
const { data } = await blink.ai.generateImage({
|
|
215
|
+
prompt: 'A beautiful sunset over mountains',
|
|
216
|
+
n: 1
|
|
238
217
|
})
|
|
239
|
-
|
|
240
|
-
// Sign in
|
|
241
|
-
const user = await blink.auth.signInWithEmail('user@example.com', 'SecurePass123')
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
**OAuth (Google, GitHub, Apple, Microsoft):**
|
|
245
|
-
```typescript
|
|
246
|
-
// ✅ Same code works on web, iOS, AND Android!
|
|
247
|
-
const user = await blink.auth.signInWithGoogle()
|
|
248
|
-
const user = await blink.auth.signInWithGitHub()
|
|
249
|
-
const user = await blink.auth.signInWithApple()
|
|
250
|
-
const user = await blink.auth.signInWithMicrosoft()
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
#### Step 4: Create Auth Hook (`hooks/useAuth.ts`)
|
|
254
|
-
|
|
255
|
-
```typescript
|
|
256
|
-
// hooks/useAuth.ts
|
|
257
|
-
import { useEffect, useState } from 'react'
|
|
258
|
-
import { blink } from '@/lib/blink'
|
|
259
|
-
import type { BlinkUser } from '@blinkdotnew/sdk'
|
|
260
|
-
|
|
261
|
-
export function useAuth() {
|
|
262
|
-
const [user, setUser] = useState<BlinkUser | null>(null)
|
|
263
|
-
const [isLoading, setIsLoading] = useState(true)
|
|
264
|
-
|
|
265
|
-
useEffect(() => {
|
|
266
|
-
const unsubscribe = blink.auth.onAuthStateChanged((state) => {
|
|
267
|
-
setUser(state.user)
|
|
268
|
-
setIsLoading(state.isLoading)
|
|
269
|
-
})
|
|
270
|
-
return unsubscribe
|
|
271
|
-
}, [])
|
|
272
|
-
|
|
273
|
-
return {
|
|
274
|
-
user,
|
|
275
|
-
isLoading,
|
|
276
|
-
isAuthenticated: !!user,
|
|
277
|
-
signInWithGoogle: () => blink.auth.signInWithGoogle(),
|
|
278
|
-
signInWithGitHub: () => blink.auth.signInWithGitHub(),
|
|
279
|
-
signInWithApple: () => blink.auth.signInWithApple(),
|
|
280
|
-
signOut: () => blink.auth.signOut(),
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
#### Step 5: Use in Components
|
|
286
|
-
|
|
287
|
-
```typescript
|
|
288
|
-
import { useAuth } from '@/hooks/useAuth'
|
|
289
|
-
import { View, Text, Button } from 'react-native'
|
|
290
|
-
|
|
291
|
-
function App() {
|
|
292
|
-
const { user, isLoading, signInWithGoogle, signOut } = useAuth()
|
|
293
|
-
|
|
294
|
-
if (isLoading) return <Text>Loading...</Text>
|
|
295
|
-
|
|
296
|
-
if (!user) {
|
|
297
|
-
return <Button onPress={signInWithGoogle} title="Sign in with Google" />
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
return (
|
|
301
|
-
<View>
|
|
302
|
-
<Text>Welcome, {user.email}!</Text>
|
|
303
|
-
<Button onPress={signOut} title="Sign Out" />
|
|
304
|
-
</View>
|
|
305
|
-
)
|
|
306
|
-
}
|
|
307
218
|
```
|
|
308
219
|
|
|
309
|
-
|
|
220
|
+
**Platform-Aware Features:**
|
|
221
|
+
- ✅ **AsyncStorage integration** for secure token persistence
|
|
222
|
+
- ✅ **Automatic platform detection** - skips browser-only features (analytics tracking, cross-tab sync)
|
|
223
|
+
- ✅ **No polyfills needed** - works out of the box
|
|
224
|
+
- ✅ **Optimized for mobile** - reduced memory footprint
|
|
310
225
|
|
|
226
|
+
**Configuration Options:**
|
|
311
227
|
```typescript
|
|
312
|
-
//
|
|
228
|
+
// With AsyncStorage (recommended for token persistence)
|
|
313
229
|
const blink = createClient({
|
|
314
230
|
projectId: 'your-project-id',
|
|
315
|
-
auth: { mode: 'headless' }, // Missing webBrowser!
|
|
316
231
|
storage: new AsyncStorageAdapter(AsyncStorage)
|
|
317
232
|
})
|
|
318
233
|
|
|
319
|
-
//
|
|
320
|
-
import * as WebBrowser from 'expo-web-browser'
|
|
321
|
-
|
|
234
|
+
// Without persistence (tokens in memory only)
|
|
322
235
|
const blink = createClient({
|
|
323
|
-
projectId: 'your-project-id'
|
|
324
|
-
auth: {
|
|
325
|
-
mode: 'headless',
|
|
326
|
-
webBrowser: WebBrowser // ← Required for OAuth!
|
|
327
|
-
},
|
|
328
|
-
storage: new AsyncStorageAdapter(AsyncStorage)
|
|
236
|
+
projectId: 'your-project-id'
|
|
329
237
|
})
|
|
330
238
|
```
|
|
331
239
|
|
|
332
|
-
#### Low-Level OAuth (For Custom Control)
|
|
333
|
-
|
|
334
|
-
If you need custom polling timeouts or manual browser handling:
|
|
335
|
-
|
|
336
|
-
```typescript
|
|
337
|
-
// Get auth URL and authenticate function separately
|
|
338
|
-
const { authUrl, authenticate } = await blink.auth.signInWithProviderMobile('google')
|
|
339
|
-
|
|
340
|
-
// Open browser manually
|
|
341
|
-
await WebBrowser.openAuthSessionAsync(authUrl)
|
|
342
|
-
|
|
343
|
-
// Poll with custom options
|
|
344
|
-
const user = await authenticate({
|
|
345
|
-
maxAttempts: 120, // 60 seconds (default: 60 = 30 seconds)
|
|
346
|
-
intervalMs: 500 // Check every 500ms
|
|
347
|
-
})
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
#### Platform Features
|
|
351
|
-
|
|
352
|
-
- ✅ **AsyncStorage** - Secure token persistence
|
|
353
|
-
- ✅ **Universal OAuth** - Same code works on web + mobile
|
|
354
|
-
- ✅ **expo-web-browser** - Native browser UI
|
|
355
|
-
- ✅ **No deep linking** - Session-based polling
|
|
356
|
-
- ✅ **Works in Expo Go** - No custom dev client needed
|
|
357
|
-
- ✅ **Auto token refresh** - Seamless sessions
|
|
358
|
-
|
|
359
240
|
## 📖 API Reference
|
|
360
241
|
|
|
361
242
|
### Authentication
|
|
@@ -827,56 +708,29 @@ const { object: todoList } = await blink.ai.generateObject({
|
|
|
827
708
|
// })
|
|
828
709
|
// Error: "schema must be a JSON Schema of 'type: \"object\"', got 'type: \"array\"'"
|
|
829
710
|
|
|
830
|
-
// Generate and modify images with AI
|
|
831
|
-
// 🔥
|
|
711
|
+
// Generate and modify images with AI (powered by Gemini 2.5 Flash Image)
|
|
712
|
+
// 🔥 Automatic optimization - no need to specify size, quality, or style parameters
|
|
832
713
|
// 🎨 For style transfer: provide ALL images in the images array, don't reference URLs in prompts
|
|
833
714
|
|
|
834
|
-
// Basic image generation
|
|
715
|
+
// Basic image generation - returns public URLs directly
|
|
835
716
|
const { data } = await blink.ai.generateImage({
|
|
836
717
|
prompt: 'A serene landscape with mountains and a lake at sunset'
|
|
837
718
|
})
|
|
838
719
|
console.log('Image URL:', data[0].url)
|
|
839
720
|
|
|
840
|
-
//
|
|
841
|
-
const { data: proImage } = await blink.ai.generateImage({
|
|
842
|
-
prompt: 'A detailed infographic about AI with charts and diagrams',
|
|
843
|
-
model: 'fal-ai/nano-banana-pro', // High quality model
|
|
844
|
-
n: 1,
|
|
845
|
-
size: '1792x1024' // Custom size
|
|
846
|
-
})
|
|
847
|
-
|
|
848
|
-
// Generate multiple variations
|
|
721
|
+
// Multiple images
|
|
849
722
|
const { data } = await blink.ai.generateImage({
|
|
850
723
|
prompt: 'A futuristic robot in different poses',
|
|
851
|
-
model: 'fal-ai/nano-banana', // Fast model
|
|
852
724
|
n: 3
|
|
853
725
|
})
|
|
854
726
|
data.forEach((img, i) => console.log(`Image ${i+1}:`, img.url))
|
|
855
727
|
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
| Model | Speed | Quality | Best For |
|
|
859
|
-
|-------|-------|---------|----------|
|
|
860
|
-
| `fal-ai/nano-banana` (default) | ⚡ Fast | Good | Prototypes, high-volume generation |
|
|
861
|
-
| `fal-ai/nano-banana-pro` | Standard | ⭐ Excellent | Marketing materials, high-fidelity visuals |
|
|
862
|
-
| `fal-ai/gemini-25-flash-image` | ⚡ Fast | Good | Alias for `nano-banana` |
|
|
863
|
-
| `fal-ai/gemini-3-pro-image-preview` | Standard | ⭐ Excellent | Alias for `nano-banana-pro` |
|
|
864
|
-
| `gemini-2.5-flash-image-preview` | ⚡ Fast | Good | Legacy - Direct Gemini API |
|
|
865
|
-
| `gemini-3-pro-image-preview` | Standard | ⭐ Excellent | Legacy - Direct Gemini API |
|
|
866
|
-
|
|
867
|
-
// Image editing - transform existing images with prompts (uses default fast model)
|
|
728
|
+
// Image editing - transform existing images with prompts
|
|
868
729
|
const { data: headshots } = await blink.ai.modifyImage({
|
|
869
|
-
images: ['https://storage.example.com/user-photo.jpg'], // Up to
|
|
730
|
+
images: ['https://storage.example.com/user-photo.jpg'], // Up to 50 images supported!
|
|
870
731
|
prompt: 'Transform into professional business headshot with studio lighting'
|
|
871
732
|
})
|
|
872
733
|
|
|
873
|
-
// High-quality editing with Pro model
|
|
874
|
-
const { data: proEdited } = await blink.ai.modifyImage({
|
|
875
|
-
images: ['https://storage.example.com/portrait.jpg'],
|
|
876
|
-
prompt: 'Add a majestic ancient tree in the background with glowing leaves',
|
|
877
|
-
model: 'fal-ai/nano-banana-pro/edit' // High quality editing
|
|
878
|
-
})
|
|
879
|
-
|
|
880
734
|
// Advanced image editing with multiple input images
|
|
881
735
|
const { data } = await blink.ai.modifyImage({
|
|
882
736
|
images: [
|
|
@@ -885,19 +739,9 @@ const { data } = await blink.ai.modifyImage({
|
|
|
885
739
|
'https://storage.example.com/photo3.jpg'
|
|
886
740
|
],
|
|
887
741
|
prompt: 'Combine these architectural styles into a futuristic building design',
|
|
888
|
-
model: 'fal-ai/nano-banana/edit', // Fast editing
|
|
889
742
|
n: 2
|
|
890
743
|
})
|
|
891
744
|
|
|
892
|
-
**Available Models for Image Editing:**
|
|
893
|
-
|
|
894
|
-
| Model | Speed | Quality | Best For |
|
|
895
|
-
|-------|-------|---------|----------|
|
|
896
|
-
| `fal-ai/nano-banana/edit` (default) | ⚡ Fast | Good | Quick adjustments, style transfers |
|
|
897
|
-
| `fal-ai/nano-banana-pro/edit` | Standard | ⭐ Excellent | Detailed retouching, complex edits |
|
|
898
|
-
| `fal-ai/gemini-25-flash-image/edit` | ⚡ Fast | Good | Alias for `nano-banana/edit` |
|
|
899
|
-
| `fal-ai/gemini-3-pro-image-preview/edit` | Standard | ⭐ Excellent | Alias for `nano-banana-pro/edit` |
|
|
900
|
-
|
|
901
745
|
// 🎨 Style Transfer & Feature Application
|
|
902
746
|
// ⚠️ IMPORTANT: When applying styles/features from one image to another,
|
|
903
747
|
// provide ALL images in the array - don't reference images in the prompt text
|
package/dist/index.d.mts
CHANGED
|
@@ -82,49 +82,6 @@ interface BlinkClientConfig {
|
|
|
82
82
|
}
|
|
83
83
|
interface BlinkAuthConfig {
|
|
84
84
|
mode?: 'managed' | 'headless';
|
|
85
|
-
/**
|
|
86
|
-
* Automatically detect and extract auth tokens from URL parameters
|
|
87
|
-
*
|
|
88
|
-
* - Web: Set to `true` (default) to handle OAuth redirects
|
|
89
|
-
* - React Native: Set to `false` to use deep links instead
|
|
90
|
-
*
|
|
91
|
-
* @default true
|
|
92
|
-
*
|
|
93
|
-
* @example
|
|
94
|
-
* // React Native - disable URL detection, use deep links
|
|
95
|
-
* {
|
|
96
|
-
* auth: {
|
|
97
|
-
* detectSessionInUrl: false,
|
|
98
|
-
* storage: AsyncStorageAdapter(AsyncStorage)
|
|
99
|
-
* }
|
|
100
|
-
* }
|
|
101
|
-
*/
|
|
102
|
-
detectSessionInUrl?: boolean;
|
|
103
|
-
/**
|
|
104
|
-
* WebBrowser module for React Native OAuth (expo-web-browser)
|
|
105
|
-
*
|
|
106
|
-
* When provided, `signInWithGoogle()` and other OAuth methods will
|
|
107
|
-
* automatically use the mobile session-based flow on React Native,
|
|
108
|
-
* so you don't need platform-specific code.
|
|
109
|
-
*
|
|
110
|
-
* @example
|
|
111
|
-
* // React Native setup (configure once)
|
|
112
|
-
* import * as WebBrowser from 'expo-web-browser'
|
|
113
|
-
* import AsyncStorage from '@react-native-async-storage/async-storage'
|
|
114
|
-
*
|
|
115
|
-
* const blink = createClient({
|
|
116
|
-
* projectId: 'your-project',
|
|
117
|
-
* auth: {
|
|
118
|
-
* mode: 'headless',
|
|
119
|
-
* webBrowser: WebBrowser // Pass the module here
|
|
120
|
-
* },
|
|
121
|
-
* storage: new AsyncStorageAdapter(AsyncStorage)
|
|
122
|
-
* })
|
|
123
|
-
*
|
|
124
|
-
* // Now this works on both web and mobile!
|
|
125
|
-
* const user = await blink.auth.signInWithGoogle()
|
|
126
|
-
*/
|
|
127
|
-
webBrowser?: WebBrowserModule;
|
|
128
85
|
email?: {
|
|
129
86
|
requireVerification?: boolean;
|
|
130
87
|
allowSignUp?: boolean;
|
|
@@ -161,7 +118,6 @@ type AuthProvider = 'email' | 'google' | 'github' | 'apple' | 'microsoft' | 'twi
|
|
|
161
118
|
interface AuthOptions {
|
|
162
119
|
redirectUrl?: string;
|
|
163
120
|
metadata?: Record<string, any>;
|
|
164
|
-
useMobileSession?: boolean;
|
|
165
121
|
}
|
|
166
122
|
interface SignUpData {
|
|
167
123
|
email: string;
|
|
@@ -175,22 +131,6 @@ interface SignUpData {
|
|
|
175
131
|
interface MagicLinkOptions {
|
|
176
132
|
redirectUrl?: string;
|
|
177
133
|
}
|
|
178
|
-
/**
|
|
179
|
-
* WebBrowser interface for React Native OAuth
|
|
180
|
-
* Compatible with expo-web-browser module
|
|
181
|
-
*
|
|
182
|
-
* Simply pass the expo-web-browser module directly:
|
|
183
|
-
* ```typescript
|
|
184
|
-
* import * as WebBrowser from 'expo-web-browser'
|
|
185
|
-
* const blink = createClient({ auth: { webBrowser: WebBrowser } })
|
|
186
|
-
* ```
|
|
187
|
-
*/
|
|
188
|
-
interface WebBrowserModule {
|
|
189
|
-
openAuthSessionAsync(url: string, redirectUrl?: string, options?: unknown): Promise<{
|
|
190
|
-
type: string;
|
|
191
|
-
url?: string;
|
|
192
|
-
}>;
|
|
193
|
-
}
|
|
194
134
|
interface BlinkUser {
|
|
195
135
|
id: string;
|
|
196
136
|
email: string;
|
|
@@ -836,7 +776,7 @@ declare class HttpClient {
|
|
|
836
776
|
signal?: AbortSignal;
|
|
837
777
|
}): Promise<BlinkResponse<any>>;
|
|
838
778
|
/**
|
|
839
|
-
* Stream AI text generation
|
|
779
|
+
* Stream AI text generation - uses Vercel AI SDK's pipeUIMessageStreamToResponse (Data Stream Protocol)
|
|
840
780
|
*/
|
|
841
781
|
streamAiText(prompt: string, options: {
|
|
842
782
|
model?: string | undefined;
|
|
@@ -860,7 +800,7 @@ declare class HttpClient {
|
|
|
860
800
|
signal?: AbortSignal;
|
|
861
801
|
}): Promise<BlinkResponse<any>>;
|
|
862
802
|
/**
|
|
863
|
-
* Stream AI object generation
|
|
803
|
+
* Stream AI object generation - uses Vercel AI SDK's pipeTextStreamToResponse
|
|
864
804
|
*/
|
|
865
805
|
streamAiObject(prompt: string, options: {
|
|
866
806
|
model?: string | undefined;
|
|
@@ -941,10 +881,10 @@ declare class HttpClient {
|
|
|
941
881
|
private parseResponse;
|
|
942
882
|
private handleErrorResponse;
|
|
943
883
|
/**
|
|
944
|
-
* Parse Vercel AI SDK
|
|
945
|
-
*
|
|
884
|
+
* Parse Vercel AI SDK v5 Data Stream Protocol (Server-Sent Events)
|
|
885
|
+
* Supports all event types from the UI Message Stream protocol
|
|
946
886
|
*/
|
|
947
|
-
private
|
|
887
|
+
private parseDataStreamProtocol;
|
|
948
888
|
}
|
|
949
889
|
|
|
950
890
|
/**
|
|
@@ -1068,143 +1008,8 @@ declare class BlinkAuth {
|
|
|
1068
1008
|
* Sign in with Microsoft (headless mode)
|
|
1069
1009
|
*/
|
|
1070
1010
|
signInWithMicrosoft(options?: AuthOptions): Promise<BlinkUser>;
|
|
1071
|
-
/**
|
|
1072
|
-
* Initiate OAuth for mobile without deep linking (expo-web-browser pattern)
|
|
1073
|
-
*
|
|
1074
|
-
* This method:
|
|
1075
|
-
* 1. Generates a unique session ID
|
|
1076
|
-
* 2. Returns OAuth URL with session parameter
|
|
1077
|
-
* 3. App opens URL in expo-web-browser
|
|
1078
|
-
* 4. App polls checkMobileOAuthSession() until complete
|
|
1079
|
-
*
|
|
1080
|
-
* @param provider - OAuth provider (google, github, apple, etc.)
|
|
1081
|
-
* @param options - Optional metadata
|
|
1082
|
-
* @returns Session ID and OAuth URL
|
|
1083
|
-
*
|
|
1084
|
-
* @example
|
|
1085
|
-
* // React Native with expo-web-browser
|
|
1086
|
-
* import * as WebBrowser from 'expo-web-browser';
|
|
1087
|
-
*
|
|
1088
|
-
* const { sessionId, authUrl } = await blink.auth.initiateMobileOAuth('google');
|
|
1089
|
-
*
|
|
1090
|
-
* // Open browser
|
|
1091
|
-
* await WebBrowser.openAuthSessionAsync(authUrl);
|
|
1092
|
-
*
|
|
1093
|
-
* // Poll for completion
|
|
1094
|
-
* const user = await blink.auth.pollMobileOAuthSession(sessionId);
|
|
1095
|
-
* console.log('Authenticated:', user.email);
|
|
1096
|
-
*/
|
|
1097
|
-
initiateMobileOAuth(provider: AuthProvider, options?: Omit<AuthOptions, 'redirectUrl'>): Promise<{
|
|
1098
|
-
sessionId: string;
|
|
1099
|
-
authUrl: string;
|
|
1100
|
-
}>;
|
|
1101
|
-
/**
|
|
1102
|
-
* Check mobile OAuth session status (single check)
|
|
1103
|
-
*
|
|
1104
|
-
* @param sessionId - Session ID from initiateMobileOAuth
|
|
1105
|
-
* @returns Tokens if session is complete, null if still pending
|
|
1106
|
-
*/
|
|
1107
|
-
checkMobileOAuthSession(sessionId: string): Promise<AuthTokens | null>;
|
|
1108
|
-
/**
|
|
1109
|
-
* Poll mobile OAuth session until complete (convenience method)
|
|
1110
|
-
*
|
|
1111
|
-
* @param sessionId - Session ID from initiateMobileOAuth
|
|
1112
|
-
* @param options - Polling options
|
|
1113
|
-
* @returns Authenticated user
|
|
1114
|
-
*
|
|
1115
|
-
* @example
|
|
1116
|
-
* const { sessionId, authUrl } = await blink.auth.initiateMobileOAuth('google');
|
|
1117
|
-
* await WebBrowser.openAuthSessionAsync(authUrl);
|
|
1118
|
-
* const user = await blink.auth.pollMobileOAuthSession(sessionId, {
|
|
1119
|
-
* maxAttempts: 60,
|
|
1120
|
-
* intervalMs: 1000
|
|
1121
|
-
* });
|
|
1122
|
-
*/
|
|
1123
|
-
pollMobileOAuthSession(sessionId: string, options?: {
|
|
1124
|
-
maxAttempts?: number;
|
|
1125
|
-
intervalMs?: number;
|
|
1126
|
-
}): Promise<BlinkUser>;
|
|
1127
|
-
/**
|
|
1128
|
-
* Sign in with OAuth provider using expo-web-browser (React Native)
|
|
1129
|
-
*
|
|
1130
|
-
* This is a convenience method that handles the entire flow:
|
|
1131
|
-
* 1. Initiates mobile OAuth session
|
|
1132
|
-
* 2. Returns auth URL to open in WebBrowser
|
|
1133
|
-
* 3. Provides polling function to call after browser opens
|
|
1134
|
-
*
|
|
1135
|
-
* @param provider - OAuth provider
|
|
1136
|
-
* @returns Object with authUrl and authenticate function
|
|
1137
|
-
*
|
|
1138
|
-
* @example
|
|
1139
|
-
* import * as WebBrowser from 'expo-web-browser';
|
|
1140
|
-
*
|
|
1141
|
-
* const { authUrl, authenticate } = await blink.auth.signInWithProviderMobile('google');
|
|
1142
|
-
*
|
|
1143
|
-
* // Open browser
|
|
1144
|
-
* await WebBrowser.openAuthSessionAsync(authUrl);
|
|
1145
|
-
*
|
|
1146
|
-
* // Wait for authentication
|
|
1147
|
-
* const user = await authenticate();
|
|
1148
|
-
*/
|
|
1149
|
-
signInWithProviderMobile(provider: AuthProvider, options?: Omit<AuthOptions, 'redirectUrl'>): Promise<{
|
|
1150
|
-
authUrl: string;
|
|
1151
|
-
authenticate: () => Promise<BlinkUser>;
|
|
1152
|
-
}>;
|
|
1153
|
-
/**
|
|
1154
|
-
* Sign in with Google using expo-web-browser (React Native convenience)
|
|
1155
|
-
*/
|
|
1156
|
-
signInWithGoogleMobile(options?: Omit<AuthOptions, 'redirectUrl'>): Promise<{
|
|
1157
|
-
authUrl: string;
|
|
1158
|
-
authenticate: () => Promise<BlinkUser>;
|
|
1159
|
-
}>;
|
|
1160
|
-
/**
|
|
1161
|
-
* Sign in with GitHub using expo-web-browser (React Native convenience)
|
|
1162
|
-
*/
|
|
1163
|
-
signInWithGitHubMobile(options?: Omit<AuthOptions, 'redirectUrl'>): Promise<{
|
|
1164
|
-
authUrl: string;
|
|
1165
|
-
authenticate: () => Promise<BlinkUser>;
|
|
1166
|
-
}>;
|
|
1167
|
-
/**
|
|
1168
|
-
* Sign in with Apple using expo-web-browser (React Native convenience)
|
|
1169
|
-
*/
|
|
1170
|
-
signInWithAppleMobile(options?: Omit<AuthOptions, 'redirectUrl'>): Promise<{
|
|
1171
|
-
authUrl: string;
|
|
1172
|
-
authenticate: () => Promise<BlinkUser>;
|
|
1173
|
-
}>;
|
|
1174
|
-
/**
|
|
1175
|
-
* React Native OAuth flow using expo-web-browser (internal)
|
|
1176
|
-
* Automatically handles opening browser and extracting tokens from redirect
|
|
1177
|
-
*/
|
|
1178
|
-
private signInWithProviderReactNative;
|
|
1179
1011
|
/**
|
|
1180
1012
|
* Generic provider sign-in method (headless mode)
|
|
1181
|
-
*
|
|
1182
|
-
* Supports both web (popup) and React Native (deep link) OAuth flows.
|
|
1183
|
-
*
|
|
1184
|
-
* **React Native Setup:**
|
|
1185
|
-
* 1. Configure deep linking in your app (app.json):
|
|
1186
|
-
* ```json
|
|
1187
|
-
* { "expo": { "scheme": "com.yourapp" } }
|
|
1188
|
-
* ```
|
|
1189
|
-
*
|
|
1190
|
-
* 2. Add redirect URL in Blink Dashboard:
|
|
1191
|
-
* `com.yourapp://**`
|
|
1192
|
-
*
|
|
1193
|
-
* 3. Handle deep link callbacks:
|
|
1194
|
-
* ```typescript
|
|
1195
|
-
* import * as Linking from 'expo-linking'
|
|
1196
|
-
*
|
|
1197
|
-
* Linking.addEventListener('url', async ({ url }) => {
|
|
1198
|
-
* const { queryParams } = Linking.parse(url)
|
|
1199
|
-
* if (queryParams.access_token) {
|
|
1200
|
-
* await blink.auth.setSession(queryParams)
|
|
1201
|
-
* }
|
|
1202
|
-
* })
|
|
1203
|
-
* ```
|
|
1204
|
-
*
|
|
1205
|
-
* @param provider - OAuth provider (google, github, apple, etc.)
|
|
1206
|
-
* @param options - Optional redirect URL and metadata
|
|
1207
|
-
* @returns Promise that resolves with authenticated user
|
|
1208
1013
|
*/
|
|
1209
1014
|
signInWithProvider(provider: AuthProvider, options?: AuthOptions): Promise<BlinkUser>;
|
|
1210
1015
|
/**
|
|
@@ -1294,40 +1099,6 @@ declare class BlinkAuth {
|
|
|
1294
1099
|
* Manually set tokens (for server-side usage)
|
|
1295
1100
|
*/
|
|
1296
1101
|
setToken(jwt: string, persist?: boolean): Promise<void>;
|
|
1297
|
-
/**
|
|
1298
|
-
* Manually set auth session from tokens (React Native deep link OAuth)
|
|
1299
|
-
*
|
|
1300
|
-
* Use this method to set the user session after receiving tokens from a deep link callback.
|
|
1301
|
-
* This is the React Native equivalent of automatic URL token detection on web.
|
|
1302
|
-
*
|
|
1303
|
-
* @param tokens - Auth tokens received from deep link or OAuth callback
|
|
1304
|
-
* @param persist - Whether to persist tokens to storage (default: true)
|
|
1305
|
-
*
|
|
1306
|
-
* @example
|
|
1307
|
-
* // React Native: Handle deep link OAuth callback
|
|
1308
|
-
* import * as Linking from 'expo-linking'
|
|
1309
|
-
*
|
|
1310
|
-
* Linking.addEventListener('url', async ({ url }) => {
|
|
1311
|
-
* const { queryParams } = Linking.parse(url)
|
|
1312
|
-
*
|
|
1313
|
-
* if (queryParams.access_token) {
|
|
1314
|
-
* await blink.auth.setSession({
|
|
1315
|
-
* access_token: queryParams.access_token,
|
|
1316
|
-
* refresh_token: queryParams.refresh_token,
|
|
1317
|
-
* expires_in: parseInt(queryParams.expires_in) || 3600,
|
|
1318
|
-
* refresh_expires_in: parseInt(queryParams.refresh_expires_in)
|
|
1319
|
-
* })
|
|
1320
|
-
*
|
|
1321
|
-
* console.log('User authenticated:', blink.auth.currentUser())
|
|
1322
|
-
* }
|
|
1323
|
-
* })
|
|
1324
|
-
*/
|
|
1325
|
-
setSession(tokens: {
|
|
1326
|
-
access_token: string;
|
|
1327
|
-
refresh_token?: string;
|
|
1328
|
-
expires_in?: number;
|
|
1329
|
-
refresh_expires_in?: number;
|
|
1330
|
-
}, persist?: boolean): Promise<BlinkUser>;
|
|
1331
1102
|
/**
|
|
1332
1103
|
* Refresh access token using refresh token
|
|
1333
1104
|
*/
|
|
@@ -1352,10 +1123,6 @@ declare class BlinkAuth {
|
|
|
1352
1123
|
* Generate secure random state for OAuth flows
|
|
1353
1124
|
*/
|
|
1354
1125
|
private generateState;
|
|
1355
|
-
/**
|
|
1356
|
-
* Generate unique session ID for mobile OAuth
|
|
1357
|
-
*/
|
|
1358
|
-
private generateSessionId;
|
|
1359
1126
|
/**
|
|
1360
1127
|
* Extract magic link token from URL
|
|
1361
1128
|
*/
|
|
@@ -2297,4 +2064,4 @@ declare class BlinkRealtimeImpl implements BlinkRealtime {
|
|
|
2297
2064
|
onPresence(channelName: string, callback: (users: PresenceUser[]) => void): () => void;
|
|
2298
2065
|
}
|
|
2299
2066
|
|
|
2300
|
-
export { type AnalyticsEvent, AsyncStorageAdapter, type AuthState, type AuthStateChangeCallback, type AuthTokens, type BlinkAI, BlinkAIImpl, type BlinkAnalytics, BlinkAnalyticsImpl, type BlinkClient, type BlinkClientConfig, type BlinkData, BlinkDataImpl, BlinkDatabase, type BlinkRealtime, BlinkRealtimeChannel, BlinkRealtimeError, BlinkRealtimeImpl, type BlinkStorage, BlinkStorageImpl, BlinkTable, type BlinkUser, type CreateOptions, type DataExtraction, type FileObject, type FilterCondition, type ImageGenerationRequest, type ImageGenerationResponse, type Message, NoOpStorageAdapter, type ObjectGenerationRequest, type ObjectGenerationResponse, type PresenceUser, type QueryOptions, type RealtimeChannel, type RealtimeGetMessagesOptions, type RealtimeMessage, type RealtimePublishOptions, type RealtimeSubscribeOptions, type SearchRequest, type SearchResponse, type SpeechGenerationRequest, type SpeechGenerationResponse, type StorageAdapter, type StorageUploadOptions, type StorageUploadResponse, type TableOperations, type TextGenerationRequest, type TextGenerationResponse, type TokenUsage, type TranscriptionRequest, type TranscriptionResponse, type UpdateOptions, type UpsertOptions,
|
|
2067
|
+
export { type AnalyticsEvent, AsyncStorageAdapter, type AuthState, type AuthStateChangeCallback, type AuthTokens, type BlinkAI, BlinkAIImpl, type BlinkAnalytics, BlinkAnalyticsImpl, type BlinkClient, type BlinkClientConfig, type BlinkData, BlinkDataImpl, BlinkDatabase, type BlinkRealtime, BlinkRealtimeChannel, BlinkRealtimeError, BlinkRealtimeImpl, type BlinkStorage, BlinkStorageImpl, BlinkTable, type BlinkUser, type CreateOptions, type DataExtraction, type FileObject, type FilterCondition, type ImageGenerationRequest, type ImageGenerationResponse, type Message, NoOpStorageAdapter, type ObjectGenerationRequest, type ObjectGenerationResponse, type PresenceUser, type QueryOptions, type RealtimeChannel, type RealtimeGetMessagesOptions, type RealtimeMessage, type RealtimePublishOptions, type RealtimeSubscribeOptions, type SearchRequest, type SearchResponse, type SpeechGenerationRequest, type SpeechGenerationResponse, type StorageAdapter, type StorageUploadOptions, type StorageUploadResponse, type TableOperations, type TextGenerationRequest, type TextGenerationResponse, type TokenUsage, type TranscriptionRequest, type TranscriptionResponse, type UpdateOptions, type UpsertOptions, WebStorageAdapter, createClient, getDefaultStorageAdapter, isBrowser, isNode, isReactNative, isWeb, platform };
|