@sogni-ai/expo-client 1.0.0-alpha.13 → 1.0.0-alpha.15
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/CHANGELOG.md +14 -0
- package/README.md +108 -3
- package/dist/cjs/Account/index.d.ts +21 -1
- package/dist/cjs/Account/index.d.ts.map +1 -1
- package/dist/cjs/Account/index.js +55 -1
- package/dist/cjs/Account/index.js.map +1 -1
- package/dist/cjs/Account/types.d.ts +58 -0
- package/dist/cjs/Account/types.d.ts.map +1 -1
- package/dist/cjs/Account/types.js +2 -1
- package/dist/cjs/Account/types.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/lib/mediaInput.d.ts +15 -5
- package/dist/cjs/lib/mediaInput.d.ts.map +1 -1
- package/dist/cjs/lib/mediaInput.js +23 -8
- package/dist/cjs/lib/mediaInput.js.map +1 -1
- package/dist/esm/Account/index.js +55 -1
- package/dist/esm/Account/index.js.map +1 -1
- package/dist/esm/Account/types.js +2 -1
- package/dist/esm/Account/types.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/mediaInput.js +23 -8
- package/dist/esm/lib/mediaInput.js.map +1 -1
- package/package.json +1 -1
- package/src/Account/index.ts +59 -1
- package/src/Account/types.ts +64 -1
- package/src/index.ts +15 -1
- package/src/lib/mediaInput.ts +25 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
# [1.0.0-alpha.15](https://github.com/Sogni-AI/expo-client/compare/v1.0.0-alpha.14...v1.0.0-alpha.15) (2026-05-12)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **account:** add SSO login/signup via Google/Apple id_token ([d87aef6](https://github.com/Sogni-AI/expo-client/commit/d87aef676c9892245139222b25c8dc253afd5d5d))
|
|
7
|
+
|
|
8
|
+
# [1.0.0-alpha.14](https://github.com/Sogni-AI/expo-client/compare/v1.0.0-alpha.13...v1.0.0-alpha.14) (2026-05-12)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **media:** read upload bytes via arrayBuffer, not Blob ([90f99c5](https://github.com/Sogni-AI/expo-client/commit/90f99c532f888b0ec50a2bb9cca9a2fc84418cae))
|
|
14
|
+
|
|
1
15
|
# [1.0.0-alpha.13](https://github.com/Sogni-AI/expo-client/compare/v1.0.0-alpha.12...v1.0.0-alpha.13) (2026-05-12)
|
|
2
16
|
|
|
3
17
|
|
package/README.md
CHANGED
|
@@ -7,19 +7,23 @@ Expo / React Native SDK for the [Sogni Supernet](https://sogni.ai) — AI image,
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npx expo install @sogni-ai/expo-client@alpha expo-secure-store expo-standard-web-crypto
|
|
10
|
+
npx expo install @sogni-ai/expo-client@alpha expo-secure-store expo-standard-web-crypto react-native-url-polyfill
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
## Setup
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
At your app entry point (e.g. `app/_layout.tsx` for Expo Router or `App.tsx` for classic Expo) install two polyfills, in this order, **before any other SDK imports**:
|
|
16
16
|
|
|
17
17
|
```ts
|
|
18
|
+
import 'react-native-url-polyfill/auto';
|
|
18
19
|
import { polyfillWebCrypto } from 'expo-standard-web-crypto';
|
|
19
20
|
polyfillWebCrypto();
|
|
20
21
|
```
|
|
21
22
|
|
|
22
|
-
|
|
23
|
+
- **`react-native-url-polyfill/auto`** — gives you a spec-compliant `URL` and `URLSearchParams`. RN's built-in URL polyfill is partial and varies across Expo SDK versions; the SDK uses URL operations the partial polyfill doesn't always implement consistently (`searchParams.set`, protocol mutation, relative URL resolution). The dedicated polyfill makes URL behavior identical across every supported version.
|
|
24
|
+
- **`polyfillWebCrypto()`** — installs `crypto.getRandomValues`, used by the SDK to generate UUIDs and (optionally) fresh wallets. PBKDF2 for username+password login is done in pure JS via `@noble/hashes`, so no `crypto.subtle` polyfill is needed.
|
|
25
|
+
|
|
26
|
+
> **Debug logging note:** the SDK uses `console.debug` for verbose traces (WebSocket frames, etc.). Metro silences `console.debug` by default in production-style runs, so these messages won't appear unless you raise the log level. Set `logLevel: 'info'` or `'warn'` in `SogniClient.create()` to send progress/error info through `console.info` / `console.warn` instead.
|
|
23
27
|
|
|
24
28
|
## Usage
|
|
25
29
|
|
|
@@ -84,6 +88,107 @@ const session = await sogni.account.signup({
|
|
|
84
88
|
requires for signup. Wire it up via `react-native-turnstile` or an
|
|
85
89
|
Expo-friendly equivalent.
|
|
86
90
|
|
|
91
|
+
### Sign in / sign up with Google or Apple (SSO)
|
|
92
|
+
|
|
93
|
+
The Sogni server accepts Google and Apple `id_token` JWTs and resolves
|
|
94
|
+
them to a Sogni account with a custodial wallet. This is the
|
|
95
|
+
recommended flow for mobile apps because:
|
|
96
|
+
|
|
97
|
+
- **Zero friction on first launch.** One tap on the native Apple/Google sheet.
|
|
98
|
+
- **Survives uninstall + reinstall.** The user's Apple ID / Google account is
|
|
99
|
+
the recovery key — on reinstall, the same `id_token` resolves to the same
|
|
100
|
+
Sogni account server-side. No client-side storage required.
|
|
101
|
+
- **Same provider account works across devices** on the same OS.
|
|
102
|
+
|
|
103
|
+
Common login-or-signup pattern:
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
import { SogniClient, ApiError } from '@sogni-ai/expo-client';
|
|
107
|
+
|
|
108
|
+
async function signInOrUp(sogni: SogniClient, idToken: string, provider: 'google' | 'apple') {
|
|
109
|
+
try {
|
|
110
|
+
return await sogni.account.loginWithSSO({ provider, idToken });
|
|
111
|
+
} catch (e) {
|
|
112
|
+
// Server returns errorCode 105 when no account exists for this IDP identity.
|
|
113
|
+
if (e instanceof ApiError && e.payload.errorCode === 105) {
|
|
114
|
+
const username = await promptForUsername(); // your app's UI
|
|
115
|
+
return await sogni.account.signupWithSSO({ provider, idToken, username });
|
|
116
|
+
}
|
|
117
|
+
throw e;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
#### Getting the `id_token`
|
|
123
|
+
|
|
124
|
+
**Apple — `expo-apple-authentication`:**
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
npx expo install expo-apple-authentication
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
import * as AppleAuthentication from 'expo-apple-authentication';
|
|
132
|
+
|
|
133
|
+
const credential = await AppleAuthentication.signInAsync({
|
|
134
|
+
requestedScopes: [
|
|
135
|
+
AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
|
|
136
|
+
AppleAuthentication.AppleAuthenticationScope.EMAIL
|
|
137
|
+
]
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
if (credential.identityToken) {
|
|
141
|
+
await signInOrUp(sogni, credential.identityToken, 'apple');
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Google — `@react-native-google-signin/google-signin` (or `expo-auth-session`):**
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
npx expo install @react-native-google-signin/google-signin
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
import { GoogleSignin } from '@react-native-google-signin/google-signin';
|
|
153
|
+
|
|
154
|
+
GoogleSignin.configure({
|
|
155
|
+
iosClientId: '<your iOS OAuth client ID>',
|
|
156
|
+
webClientId: '<your Web OAuth client ID>' // also used as audience on Android
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
await GoogleSignin.hasPlayServices();
|
|
160
|
+
const { idToken } = await GoogleSignin.signIn();
|
|
161
|
+
if (idToken) {
|
|
162
|
+
await signInOrUp(sogni, idToken, 'google');
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
#### Feature gating for SSO accounts
|
|
167
|
+
|
|
168
|
+
After `account.me()` resolves, `sogni.account.current.authMethod` is one
|
|
169
|
+
of `'password' | 'sso-google' | 'sso-apple'`. SSO accounts have a
|
|
170
|
+
custodial wallet, so a few server endpoints are restricted (the server
|
|
171
|
+
returns `403` with `errorCode 176` / `SSO_RESTRICTED`):
|
|
172
|
+
|
|
173
|
+
- Token withdrawal to an external wallet
|
|
174
|
+
- ERC-20 approve
|
|
175
|
+
- Email update (managed by the IDP)
|
|
176
|
+
- Staking with `source: 'wallet'`
|
|
177
|
+
- Unstaking / airdrop claim to `destination: 'stake'` on Etherlink
|
|
178
|
+
|
|
179
|
+
Use `authMethod` to hide UI for these operations:
|
|
180
|
+
|
|
181
|
+
```ts
|
|
182
|
+
const isSSO = sogni.account.current.authMethod?.startsWith('sso-');
|
|
183
|
+
|
|
184
|
+
return (
|
|
185
|
+
<View>
|
|
186
|
+
{!isSSO && <Button title="Withdraw to Wallet" onPress={...} />}
|
|
187
|
+
{!isSSO && <Button title="Change Email" onPress={...} />}
|
|
188
|
+
</View>
|
|
189
|
+
);
|
|
190
|
+
```
|
|
191
|
+
|
|
87
192
|
### Generate an image
|
|
88
193
|
|
|
89
194
|
```ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import ApiClient from '../ApiClient';
|
|
2
2
|
import TypedEventEmitter from '../lib/TypedEventEmitter';
|
|
3
|
-
import { AccountSnapshot, Balances, LoginData, MeData, SignupParams } from './types';
|
|
3
|
+
import { AccountSnapshot, Balances, LoginData, MeData, SSOLoginParams, SSOSignupParams, SignupParams } from './types';
|
|
4
4
|
interface AccountEvents {
|
|
5
5
|
change: AccountSnapshot;
|
|
6
6
|
}
|
|
@@ -34,6 +34,26 @@ declare class AccountApi extends TypedEventEmitter<AccountEvents> {
|
|
|
34
34
|
login(username: string, password: string, options?: {
|
|
35
35
|
appSource?: string;
|
|
36
36
|
}): Promise<LoginData>;
|
|
37
|
+
/**
|
|
38
|
+
* Log in via Google or Apple SSO. Pass the raw id_token from the platform
|
|
39
|
+
* SDK (`expo-auth-session` for Google, `expo-apple-authentication` for
|
|
40
|
+
* Apple). The Sogni server validates the JWT signature against the IDP's
|
|
41
|
+
* public keys, resolves the user's wallet by the IDP subject, and returns
|
|
42
|
+
* Sogni JWTs.
|
|
43
|
+
*
|
|
44
|
+
* Throws `ApiError` with `payload.errorCode === 105` if no account exists
|
|
45
|
+
* for this IDP identity yet — fall back to `signupWithSSO()` in that case.
|
|
46
|
+
*/
|
|
47
|
+
loginWithSSO(params: SSOLoginParams): Promise<LoginData>;
|
|
48
|
+
/**
|
|
49
|
+
* Create a new Sogni account linked to a Google or Apple SSO identity. The
|
|
50
|
+
* server mints a custodial wallet via sogni-keymgr and returns Sogni JWTs;
|
|
51
|
+
* the user is automatically logged in on success.
|
|
52
|
+
*
|
|
53
|
+
* Common pattern: try `loginWithSSO()` first, fall back to this on
|
|
54
|
+
* `ApiError` 105 (account does not exist).
|
|
55
|
+
*/
|
|
56
|
+
signupWithSSO(params: SSOSignupParams): Promise<LoginData>;
|
|
37
57
|
/**
|
|
38
58
|
* Create a new account. Derives the user's wallet on-device, signs the
|
|
39
59
|
* EIP-712 signup payload, and exchanges it for JWT tokens (the user is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Account/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAoC,MAAM,cAAc,CAAC;AAChE,OAAO,iBAAiB,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EACL,eAAe,EACf,QAAQ,EACR,SAAS,EACT,MAAM,EACN,YAAY,EAEb,MAAM,SAAS,CAAC;AAEjB,UAAU,aAAa;IACrB,MAAM,EAAE,eAAe,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,cAAM,UAAW,SAAQ,iBAAiB,CAAC,aAAa,CAAC;IACvD,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,cAAc,CAAgB;gBAE1B,MAAM,EAAE,SAAS,EAAE,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO;IAiClE,uDAAuD;IACvD,IAAI,OAAO,IAAI,QAAQ,CAAC,eAAe,CAAC,CAEvC;IAED,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAInE;;;;OAIG;IACG,KAAK,CACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,SAAS,CAAC;IAsBrB;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC;IAuCtD,6EAA6E;IACvE,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Account/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAoC,MAAM,cAAc,CAAC;AAChE,OAAO,iBAAiB,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EACL,eAAe,EACf,QAAQ,EACR,SAAS,EACT,MAAM,EACN,cAAc,EACd,eAAe,EACf,YAAY,EAEb,MAAM,SAAS,CAAC;AAEjB,UAAU,aAAa;IACrB,MAAM,EAAE,eAAe,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,cAAM,UAAW,SAAQ,iBAAiB,CAAC,aAAa,CAAC;IACvD,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,cAAc,CAAgB;gBAE1B,MAAM,EAAE,SAAS,EAAE,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO;IAiClE,uDAAuD;IACvD,IAAI,OAAO,IAAI,QAAQ,CAAC,eAAe,CAAC,CAEvC;IAED,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAInE;;;;OAIG;IACG,KAAK,CACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,SAAS,CAAC;IAsBrB;;;;;;;;;OASG;IACG,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC;IAgB9D;;;;;;;OAOG;IACG,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC;IAoBhE;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC;IAuCtD,6EAA6E;IACvE,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC;IAY3B;;;;OAIG;IACG,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC;IAMzC;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAaf,SAAS;IAOvB,OAAO,CAAC,OAAO;CAMhB;AAUD,eAAe,UAAU,CAAC"}
|
|
@@ -85,6 +85,58 @@ class AccountApi extends TypedEventEmitter_1.default {
|
|
|
85
85
|
});
|
|
86
86
|
return res.data;
|
|
87
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Log in via Google or Apple SSO. Pass the raw id_token from the platform
|
|
90
|
+
* SDK (`expo-auth-session` for Google, `expo-apple-authentication` for
|
|
91
|
+
* Apple). The Sogni server validates the JWT signature against the IDP's
|
|
92
|
+
* public keys, resolves the user's wallet by the IDP subject, and returns
|
|
93
|
+
* Sogni JWTs.
|
|
94
|
+
*
|
|
95
|
+
* Throws `ApiError` with `payload.errorCode === 105` if no account exists
|
|
96
|
+
* for this IDP identity yet — fall back to `signupWithSSO()` in that case.
|
|
97
|
+
*/
|
|
98
|
+
async loginWithSSO(params) {
|
|
99
|
+
const auth = this._client.auth;
|
|
100
|
+
if (!(auth instanceof AuthManager_1.TokenAuthManager)) {
|
|
101
|
+
throw new Error('loginWithSSO() requires token-based auth (the default)');
|
|
102
|
+
}
|
|
103
|
+
const appSource = params.appSource?.trim() || this._client.appSource;
|
|
104
|
+
const res = await this._client.rest.post('/v1/account/sso/login', {
|
|
105
|
+
provider: params.provider,
|
|
106
|
+
idToken: params.idToken,
|
|
107
|
+
rememberMe: params.rememberMe ?? true,
|
|
108
|
+
...(appSource ? { appSource } : {})
|
|
109
|
+
});
|
|
110
|
+
await auth.authenticate({ token: res.data.token, refreshToken: res.data.refreshToken });
|
|
111
|
+
return res.data;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Create a new Sogni account linked to a Google or Apple SSO identity. The
|
|
115
|
+
* server mints a custodial wallet via sogni-keymgr and returns Sogni JWTs;
|
|
116
|
+
* the user is automatically logged in on success.
|
|
117
|
+
*
|
|
118
|
+
* Common pattern: try `loginWithSSO()` first, fall back to this on
|
|
119
|
+
* `ApiError` 105 (account does not exist).
|
|
120
|
+
*/
|
|
121
|
+
async signupWithSSO(params) {
|
|
122
|
+
const auth = this._client.auth;
|
|
123
|
+
if (!(auth instanceof AuthManager_1.TokenAuthManager)) {
|
|
124
|
+
throw new Error('signupWithSSO() requires token-based auth (the default)');
|
|
125
|
+
}
|
|
126
|
+
const appSource = params.appSource?.trim() || this._client.appSource;
|
|
127
|
+
const res = await this._client.rest.post('/v1/account/sso/signup', {
|
|
128
|
+
appid: this._client.appId,
|
|
129
|
+
provider: params.provider,
|
|
130
|
+
idToken: params.idToken,
|
|
131
|
+
username: params.username,
|
|
132
|
+
subscribe: params.subscribe ? 1 : 0,
|
|
133
|
+
...(params.referralCode ? { referralCode: params.referralCode } : {}),
|
|
134
|
+
rememberMe: params.rememberMe ?? true,
|
|
135
|
+
...(appSource ? { appSource } : {})
|
|
136
|
+
});
|
|
137
|
+
await auth.authenticate({ token: res.data.token, refreshToken: res.data.refreshToken });
|
|
138
|
+
return res.data;
|
|
139
|
+
}
|
|
88
140
|
/**
|
|
89
141
|
* Create a new account. Derives the user's wallet on-device, signs the
|
|
90
142
|
* EIP-712 signup payload, and exchanges it for JWT tokens (the user is
|
|
@@ -130,7 +182,9 @@ class AccountApi extends TypedEventEmitter_1.default {
|
|
|
130
182
|
this._update({
|
|
131
183
|
username: res.data.username,
|
|
132
184
|
email: res.data.currentEmail,
|
|
133
|
-
walletAddress: res.data.walletAddress
|
|
185
|
+
walletAddress: res.data.walletAddress,
|
|
186
|
+
// Legacy password accounts may omit the `auth` field; treat as 'password'.
|
|
187
|
+
authMethod: res.data.auth ?? 'password'
|
|
134
188
|
});
|
|
135
189
|
return res.data;
|
|
136
190
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Account/index.ts"],"names":[],"mappings":";;;;;AAAA,4CAAgE;AAChE,iFAAyD;AACzD,oDAAsD;AACtD,sCAAwF;AACxF,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Account/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { Balances } from '../ApiClient/WebSocketClient/events';
|
|
2
2
|
import { SupernetType } from '../ApiClient/WebSocketClient/types';
|
|
3
3
|
export type { Balances };
|
|
4
|
+
/** How the user originally authenticated. Drives feature gating on SSO accounts. */
|
|
5
|
+
export type AuthMethod = 'password' | 'sso-google' | 'sso-apple';
|
|
6
|
+
/** SSO identity providers supported by the Sogni API. */
|
|
7
|
+
export type SSOProvider = 'google' | 'apple';
|
|
4
8
|
export interface MeData {
|
|
5
9
|
currentEmail: string;
|
|
6
10
|
username: string;
|
|
@@ -11,6 +15,15 @@ export interface MeData {
|
|
|
11
15
|
discordServerMember?: boolean;
|
|
12
16
|
discordUsername?: string;
|
|
13
17
|
requestedUpdatedEmail?: string;
|
|
18
|
+
/**
|
|
19
|
+
* How the user originally authenticated.
|
|
20
|
+
*
|
|
21
|
+
* Legacy password accounts may omit this field — treat missing as
|
|
22
|
+
* `'password'`. Use this to hide UI that doesn't apply to SSO users (e.g.,
|
|
23
|
+
* "Change Email", "Withdraw to Wallet") since their wallet is custodial and
|
|
24
|
+
* their email is managed by the IDP.
|
|
25
|
+
*/
|
|
26
|
+
auth?: AuthMethod;
|
|
14
27
|
}
|
|
15
28
|
export interface LoginData {
|
|
16
29
|
token: string;
|
|
@@ -30,6 +43,46 @@ export interface SignupParams {
|
|
|
30
43
|
/** Optional app source label for signup attribution. */
|
|
31
44
|
appSource?: string;
|
|
32
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Parameters for `account.loginWithSSO()`. Pass the raw `idToken` JWT exactly
|
|
48
|
+
* as the Google or Apple SDK returned it — do NOT decode it client-side. The
|
|
49
|
+
* Sogni server validates the JWT signature against the IDP's public keys.
|
|
50
|
+
*/
|
|
51
|
+
export interface SSOLoginParams {
|
|
52
|
+
provider: SSOProvider;
|
|
53
|
+
/** Raw id_token JWT from the Google or Apple SDK. */
|
|
54
|
+
idToken: string;
|
|
55
|
+
/**
|
|
56
|
+
* Whether to mint a long-lived refresh token. Mobile apps usually want
|
|
57
|
+
* `true` so the user stays logged in after backgrounding. Default true.
|
|
58
|
+
*/
|
|
59
|
+
rememberMe?: boolean;
|
|
60
|
+
/** Optional app source label for analytics. */
|
|
61
|
+
appSource?: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Parameters for `account.signupWithSSO()` — first-time SSO account creation.
|
|
65
|
+
* On success the server mints a custodial wallet via sogni-keymgr and the
|
|
66
|
+
* user is automatically logged in.
|
|
67
|
+
*/
|
|
68
|
+
export interface SSOSignupParams {
|
|
69
|
+
provider: SSOProvider;
|
|
70
|
+
/** Raw id_token JWT from the Google or Apple SDK. */
|
|
71
|
+
idToken: string;
|
|
72
|
+
/**
|
|
73
|
+
* Desired username (4-20 chars). Same validation rules as
|
|
74
|
+
* password-based signup. Lowercased server-side for indexing.
|
|
75
|
+
*/
|
|
76
|
+
username: string;
|
|
77
|
+
/** Subscribe to product updates / newsletter. Default false. */
|
|
78
|
+
subscribe?: boolean;
|
|
79
|
+
/** Optional referral code from another Sogni user. */
|
|
80
|
+
referralCode?: string;
|
|
81
|
+
/** See SSOLoginParams.rememberMe. */
|
|
82
|
+
rememberMe?: boolean;
|
|
83
|
+
/** Optional app source label. */
|
|
84
|
+
appSource?: string;
|
|
85
|
+
}
|
|
33
86
|
export interface AccountSnapshot {
|
|
34
87
|
authenticated: boolean;
|
|
35
88
|
networkStatus: 'connected' | 'disconnected' | 'connecting';
|
|
@@ -38,6 +91,11 @@ export interface AccountSnapshot {
|
|
|
38
91
|
walletAddress: string | null;
|
|
39
92
|
username: string | null;
|
|
40
93
|
email: string | null;
|
|
94
|
+
/**
|
|
95
|
+
* How the current user authenticated, populated after `account.me()`. Null
|
|
96
|
+
* until me() resolves. Use this to gate UI for SSO accounts.
|
|
97
|
+
*/
|
|
98
|
+
authMethod: AuthMethod | null;
|
|
41
99
|
}
|
|
42
100
|
export declare function emptyAccountSnapshot(): AccountSnapshot;
|
|
43
101
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/Account/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB,MAAM,WAAW,MAAM;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/Account/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB,oFAAoF;AACpF,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,CAAC;AAEjE,yDAAyD;AACzD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE7C,MAAM,WAAW,MAAM;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,cAAc,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,WAAW,CAAC;IACtB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,CAAC;IACtB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,WAAW,GAAG,cAAc,GAAG,YAAY,CAAC;IAC3D,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,QAAQ,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;OAGG;IACH,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;CAC/B;AAED,wBAAgB,oBAAoB,IAAI,eAAe,CActD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/Account/types.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/Account/types.ts"],"names":[],"mappings":";;AA6GA,oDAcC;AAdD,SAAgB,oBAAoB;IAClC,OAAO;QACL,aAAa,EAAE,KAAK;QACpB,aAAa,EAAE,cAAc;QAC7B,OAAO,EAAE,IAAI;QACb,OAAO,EAAE;YACP,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;YAC1D,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE;SAC/E;QACD,aAAa,EAAE,IAAI;QACnB,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC"}
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import AccountApi from './Account';
|
|
2
|
-
import { AccountSnapshot, Balances, LoginData, MeData, SignupParams } from './Account/types';
|
|
2
|
+
import { AccountSnapshot, AuthMethod, Balances, LoginData, MeData, SignupParams, SSOLoginParams, SSOProvider, SSOSignupParams } from './Account/types';
|
|
3
3
|
import ChatApi from './Chat';
|
|
4
4
|
import ChatStream from './Chat/ChatStream';
|
|
5
5
|
import { parseToolCallArguments } from './Chat/tools';
|
|
@@ -14,7 +14,7 @@ import { ApiKeyAuthManager, AuthStorage, TokenAuthData } from './lib/AuthManager
|
|
|
14
14
|
import ErrorData from './types/ErrorData';
|
|
15
15
|
import { TokenType } from './types/token';
|
|
16
16
|
import { LIB_VERSION } from './version';
|
|
17
|
-
export type { AccountSnapshot, ApiErrorResponse, ApiResponse, AudioOutputFormat, AudioProjectParams, AuthenticatedEvent, AuthStorage, AvailableModel, Balances, BalanceUpdateEvent, ChangeNetworkEvent, ChatCompletionChunk, ChatCompletionParams, ChatCompletionResult, ChatMessage, ConnectedEvent, ContentPart, ControlNetMode, ControlNetName, ControlNetParams, DisconnectedEvent, ErrorData, ImageOutputFormat, ImageProjectParams, ImageUrlContentPart, Job, JobErrorReason, JobStatus, LLMModelInfo, LoginData, Logger, LogLevel, MediaInput, MeData, SignupParams, Project, ProjectParams, ProjectStatus, SupernetType, TextContentPart, ToastMessageEvent, TokenAuthData, TokenType, TokenUsage, ToolCall, ToolCallDelta, ToolChoice, ToolDefinition, ToolRound, VideoOutputFormat, VideoProjectParams };
|
|
17
|
+
export type { AccountSnapshot, ApiErrorResponse, ApiResponse, AudioOutputFormat, AudioProjectParams, AuthenticatedEvent, AuthStorage, AvailableModel, Balances, BalanceUpdateEvent, ChangeNetworkEvent, ChatCompletionChunk, ChatCompletionParams, ChatCompletionResult, ChatMessage, ConnectedEvent, ContentPart, ControlNetMode, ControlNetName, ControlNetParams, DisconnectedEvent, ErrorData, ImageOutputFormat, ImageProjectParams, ImageUrlContentPart, Job, JobErrorReason, JobStatus, LLMModelInfo, AuthMethod, LoginData, Logger, LogLevel, MediaInput, MeData, SignupParams, SSOLoginParams, SSOProvider, SSOSignupParams, Project, ProjectParams, ProjectStatus, SupernetType, TextContentPart, ToastMessageEvent, TokenAuthData, TokenType, TokenUsage, ToolCall, ToolCallDelta, ToolChoice, ToolDefinition, ToolRound, VideoOutputFormat, VideoProjectParams };
|
|
18
18
|
export { ApiError, ApiKeyAuthManager, ChatStream, LIB_VERSION, parseToolCallArguments };
|
|
19
19
|
export interface SogniClientConfig {
|
|
20
20
|
/** Unique application ID. Multiple connections with the same ID will be rejected by the server. */
|
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,WAAW,CAAC;AACnC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wDAAmC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,12 +22,22 @@ export interface MediaInputBody {
|
|
|
22
22
|
/**
|
|
23
23
|
* Convert a MediaInput into a fetch body for upload to a presigned PUT URL.
|
|
24
24
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
25
|
+
* Reads the URI via `fetch(uri).arrayBuffer()` and hands back a `Uint8Array`.
|
|
26
|
+
* We deliberately avoid `res.blob()` here for two reasons:
|
|
27
27
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
28
|
+
* 1. React Native's `Blob` is a minimal polyfill without `.text()` or
|
|
29
|
+
* `.arrayBuffer()` (see `Libraries/Blob/Blob.js`), so working with the
|
|
30
|
+
* raw bytes is more portable than rolling with a Blob whose surface
|
|
31
|
+
* depends on platform version.
|
|
32
|
+
* 2. On iOS PhotoKit (`ph://`) URIs, `res.blob()` has been observed to
|
|
33
|
+
* silently return a 0-byte blob — we'd PUT an empty body and the server
|
|
34
|
+
* would store a corrupted image. Reading as an ArrayBuffer makes the
|
|
35
|
+
* byte count visible and lets us throw on empty input.
|
|
36
|
+
*
|
|
37
|
+
* For very large files (videos, raw audio), this buffers the whole payload
|
|
38
|
+
* in JS memory. Acceptable for typical image / short audio reference
|
|
39
|
+
* uploads. If you have raw bytes already (e.g. from `expo-file-system`),
|
|
40
|
+
* pass `Uint8Array` directly to skip the fetch.
|
|
31
41
|
*/
|
|
32
42
|
export declare function toFetchBody(input: MediaInput, contentTypeOverride?: string): Promise<MediaInputBody>;
|
|
33
43
|
//# sourceMappingURL=mediaInput.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediaInput.d.ts","sourceRoot":"","sources":["../../../src/lib/mediaInput.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,UAAU,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,IAAI,aAAa,CAEzE;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED
|
|
1
|
+
{"version":3,"file":"mediaInput.d.ts","sourceRoot":"","sources":["../../../src/lib/mediaInput.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,UAAU,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,IAAI,aAAa,CAEzE;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,UAAU,EACjB,mBAAmB,CAAC,EAAE,MAAM,GAC3B,OAAO,CAAC,cAAc,CAAC,CAoBzB"}
|
|
@@ -8,12 +8,22 @@ function isMediaInputUri(input) {
|
|
|
8
8
|
/**
|
|
9
9
|
* Convert a MediaInput into a fetch body for upload to a presigned PUT URL.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
11
|
+
* Reads the URI via `fetch(uri).arrayBuffer()` and hands back a `Uint8Array`.
|
|
12
|
+
* We deliberately avoid `res.blob()` here for two reasons:
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* 1. React Native's `Blob` is a minimal polyfill without `.text()` or
|
|
15
|
+
* `.arrayBuffer()` (see `Libraries/Blob/Blob.js`), so working with the
|
|
16
|
+
* raw bytes is more portable than rolling with a Blob whose surface
|
|
17
|
+
* depends on platform version.
|
|
18
|
+
* 2. On iOS PhotoKit (`ph://`) URIs, `res.blob()` has been observed to
|
|
19
|
+
* silently return a 0-byte blob — we'd PUT an empty body and the server
|
|
20
|
+
* would store a corrupted image. Reading as an ArrayBuffer makes the
|
|
21
|
+
* byte count visible and lets us throw on empty input.
|
|
22
|
+
*
|
|
23
|
+
* For very large files (videos, raw audio), this buffers the whole payload
|
|
24
|
+
* in JS memory. Acceptable for typical image / short audio reference
|
|
25
|
+
* uploads. If you have raw bytes already (e.g. from `expo-file-system`),
|
|
26
|
+
* pass `Uint8Array` directly to skip the fetch.
|
|
17
27
|
*/
|
|
18
28
|
async function toFetchBody(input, contentTypeOverride) {
|
|
19
29
|
if (input instanceof Uint8Array) {
|
|
@@ -23,10 +33,15 @@ async function toFetchBody(input, contentTypeOverride) {
|
|
|
23
33
|
if (!res.ok) {
|
|
24
34
|
throw new Error(`Failed to read media at ${input.uri}: HTTP ${res.status}`);
|
|
25
35
|
}
|
|
26
|
-
const
|
|
36
|
+
const arrayBuffer = await res.arrayBuffer();
|
|
37
|
+
if (arrayBuffer.byteLength === 0) {
|
|
38
|
+
throw new Error(`Read 0 bytes from ${input.uri}. On iOS, ph:// PhotoKit URIs sometimes return empty bodies — copy the asset to a file:// path first (e.g. via expo-image-picker with allowsEditing or expo-image-manipulator).`);
|
|
39
|
+
}
|
|
40
|
+
const bytes = new Uint8Array(arrayBuffer);
|
|
41
|
+
const responseContentType = res.headers.get('content-type') ?? undefined;
|
|
27
42
|
return {
|
|
28
|
-
body:
|
|
29
|
-
contentType: contentTypeOverride ?? input.type ??
|
|
43
|
+
body: bytes,
|
|
44
|
+
contentType: contentTypeOverride ?? input.type ?? responseContentType
|
|
30
45
|
};
|
|
31
46
|
}
|
|
32
47
|
//# sourceMappingURL=mediaInput.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediaInput.js","sourceRoot":"","sources":["../../../src/lib/mediaInput.ts"],"names":[],"mappings":";;AAkBA,0CAEC;
|
|
1
|
+
{"version":3,"file":"mediaInput.js","sourceRoot":"","sources":["../../../src/lib/mediaInput.ts"],"names":[],"mappings":";;AAkBA,0CAEC;AA2BD,kCAuBC;AApDD,SAAgB,eAAe,CAAC,KAAiB;IAC/C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC;AACrD,CAAC;AAOD;;;;;;;;;;;;;;;;;;;GAmBG;AACI,KAAK,UAAU,WAAW,CAC/B,KAAiB,EACjB,mBAA4B;IAE5B,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,KAA4B,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC;IAClF,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,GAAG,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,WAAW,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,qBAAqB,KAAK,CAAC,GAAG,iLAAiL,CAChN,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,mBAAmB,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC;IACzE,OAAO;QACL,IAAI,EAAE,KAA4B;QAClC,WAAW,EAAE,mBAAmB,IAAI,KAAK,CAAC,IAAI,IAAI,mBAAmB;KACtE,CAAC;AACJ,CAAC"}
|
|
@@ -80,6 +80,58 @@ class AccountApi extends TypedEventEmitter {
|
|
|
80
80
|
});
|
|
81
81
|
return res.data;
|
|
82
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Log in via Google or Apple SSO. Pass the raw id_token from the platform
|
|
85
|
+
* SDK (`expo-auth-session` for Google, `expo-apple-authentication` for
|
|
86
|
+
* Apple). The Sogni server validates the JWT signature against the IDP's
|
|
87
|
+
* public keys, resolves the user's wallet by the IDP subject, and returns
|
|
88
|
+
* Sogni JWTs.
|
|
89
|
+
*
|
|
90
|
+
* Throws `ApiError` with `payload.errorCode === 105` if no account exists
|
|
91
|
+
* for this IDP identity yet — fall back to `signupWithSSO()` in that case.
|
|
92
|
+
*/
|
|
93
|
+
async loginWithSSO(params) {
|
|
94
|
+
const auth = this._client.auth;
|
|
95
|
+
if (!(auth instanceof TokenAuthManager)) {
|
|
96
|
+
throw new Error('loginWithSSO() requires token-based auth (the default)');
|
|
97
|
+
}
|
|
98
|
+
const appSource = params.appSource?.trim() || this._client.appSource;
|
|
99
|
+
const res = await this._client.rest.post('/v1/account/sso/login', {
|
|
100
|
+
provider: params.provider,
|
|
101
|
+
idToken: params.idToken,
|
|
102
|
+
rememberMe: params.rememberMe ?? true,
|
|
103
|
+
...(appSource ? { appSource } : {})
|
|
104
|
+
});
|
|
105
|
+
await auth.authenticate({ token: res.data.token, refreshToken: res.data.refreshToken });
|
|
106
|
+
return res.data;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Create a new Sogni account linked to a Google or Apple SSO identity. The
|
|
110
|
+
* server mints a custodial wallet via sogni-keymgr and returns Sogni JWTs;
|
|
111
|
+
* the user is automatically logged in on success.
|
|
112
|
+
*
|
|
113
|
+
* Common pattern: try `loginWithSSO()` first, fall back to this on
|
|
114
|
+
* `ApiError` 105 (account does not exist).
|
|
115
|
+
*/
|
|
116
|
+
async signupWithSSO(params) {
|
|
117
|
+
const auth = this._client.auth;
|
|
118
|
+
if (!(auth instanceof TokenAuthManager)) {
|
|
119
|
+
throw new Error('signupWithSSO() requires token-based auth (the default)');
|
|
120
|
+
}
|
|
121
|
+
const appSource = params.appSource?.trim() || this._client.appSource;
|
|
122
|
+
const res = await this._client.rest.post('/v1/account/sso/signup', {
|
|
123
|
+
appid: this._client.appId,
|
|
124
|
+
provider: params.provider,
|
|
125
|
+
idToken: params.idToken,
|
|
126
|
+
username: params.username,
|
|
127
|
+
subscribe: params.subscribe ? 1 : 0,
|
|
128
|
+
...(params.referralCode ? { referralCode: params.referralCode } : {}),
|
|
129
|
+
rememberMe: params.rememberMe ?? true,
|
|
130
|
+
...(appSource ? { appSource } : {})
|
|
131
|
+
});
|
|
132
|
+
await auth.authenticate({ token: res.data.token, refreshToken: res.data.refreshToken });
|
|
133
|
+
return res.data;
|
|
134
|
+
}
|
|
83
135
|
/**
|
|
84
136
|
* Create a new account. Derives the user's wallet on-device, signs the
|
|
85
137
|
* EIP-712 signup payload, and exchanges it for JWT tokens (the user is
|
|
@@ -125,7 +177,9 @@ class AccountApi extends TypedEventEmitter {
|
|
|
125
177
|
this._update({
|
|
126
178
|
username: res.data.username,
|
|
127
179
|
email: res.data.currentEmail,
|
|
128
|
-
walletAddress: res.data.walletAddress
|
|
180
|
+
walletAddress: res.data.walletAddress,
|
|
181
|
+
// Legacy password accounts may omit the `auth` field; treat as 'password'.
|
|
182
|
+
authMethod: res.data.auth ?? 'password'
|
|
129
183
|
});
|
|
130
184
|
return res.data;
|
|
131
185
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Account/index.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,QAAQ,EAAe,MAAM,cAAc,CAAC;AAChE,OAAO,iBAAiB,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AACxF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Account/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/Account/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/Account/types.ts"],"names":[],"mappings":"AA6GA,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,aAAa,EAAE,KAAK;QACpB,aAAa,EAAE,cAAc;QAC7B,OAAO,EAAE,IAAI;QACb,OAAO,EAAE;YACP,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;YAC1D,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE;SAC/E;QACD,aAAa,EAAE,IAAI;QACnB,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC"}
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,12 +4,22 @@ export function isMediaInputUri(input) {
|
|
|
4
4
|
/**
|
|
5
5
|
* Convert a MediaInput into a fetch body for upload to a presigned PUT URL.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Reads the URI via `fetch(uri).arrayBuffer()` and hands back a `Uint8Array`.
|
|
8
|
+
* We deliberately avoid `res.blob()` here for two reasons:
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* 1. React Native's `Blob` is a minimal polyfill without `.text()` or
|
|
11
|
+
* `.arrayBuffer()` (see `Libraries/Blob/Blob.js`), so working with the
|
|
12
|
+
* raw bytes is more portable than rolling with a Blob whose surface
|
|
13
|
+
* depends on platform version.
|
|
14
|
+
* 2. On iOS PhotoKit (`ph://`) URIs, `res.blob()` has been observed to
|
|
15
|
+
* silently return a 0-byte blob — we'd PUT an empty body and the server
|
|
16
|
+
* would store a corrupted image. Reading as an ArrayBuffer makes the
|
|
17
|
+
* byte count visible and lets us throw on empty input.
|
|
18
|
+
*
|
|
19
|
+
* For very large files (videos, raw audio), this buffers the whole payload
|
|
20
|
+
* in JS memory. Acceptable for typical image / short audio reference
|
|
21
|
+
* uploads. If you have raw bytes already (e.g. from `expo-file-system`),
|
|
22
|
+
* pass `Uint8Array` directly to skip the fetch.
|
|
13
23
|
*/
|
|
14
24
|
export async function toFetchBody(input, contentTypeOverride) {
|
|
15
25
|
if (input instanceof Uint8Array) {
|
|
@@ -19,10 +29,15 @@ export async function toFetchBody(input, contentTypeOverride) {
|
|
|
19
29
|
if (!res.ok) {
|
|
20
30
|
throw new Error(`Failed to read media at ${input.uri}: HTTP ${res.status}`);
|
|
21
31
|
}
|
|
22
|
-
const
|
|
32
|
+
const arrayBuffer = await res.arrayBuffer();
|
|
33
|
+
if (arrayBuffer.byteLength === 0) {
|
|
34
|
+
throw new Error(`Read 0 bytes from ${input.uri}. On iOS, ph:// PhotoKit URIs sometimes return empty bodies — copy the asset to a file:// path first (e.g. via expo-image-picker with allowsEditing or expo-image-manipulator).`);
|
|
35
|
+
}
|
|
36
|
+
const bytes = new Uint8Array(arrayBuffer);
|
|
37
|
+
const responseContentType = res.headers.get('content-type') ?? undefined;
|
|
23
38
|
return {
|
|
24
|
-
body:
|
|
25
|
-
contentType: contentTypeOverride ?? input.type ??
|
|
39
|
+
body: bytes,
|
|
40
|
+
contentType: contentTypeOverride ?? input.type ?? responseContentType
|
|
26
41
|
};
|
|
27
42
|
}
|
|
28
43
|
//# sourceMappingURL=mediaInput.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediaInput.js","sourceRoot":"","sources":["../../../src/lib/mediaInput.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC;AACrD,CAAC;AAOD
|
|
1
|
+
{"version":3,"file":"mediaInput.js","sourceRoot":"","sources":["../../../src/lib/mediaInput.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC;AACrD,CAAC;AAOD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAiB,EACjB,mBAA4B;IAE5B,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,KAA4B,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC;IAClF,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,GAAG,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,WAAW,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,qBAAqB,KAAK,CAAC,GAAG,iLAAiL,CAChN,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,mBAAmB,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC;IACzE,OAAO;QACL,IAAI,EAAE,KAA4B;QAClC,WAAW,EAAE,mBAAmB,IAAI,KAAK,CAAC,IAAI,IAAI,mBAAmB;KACtE,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
package/src/Account/index.ts
CHANGED
|
@@ -7,6 +7,8 @@ import {
|
|
|
7
7
|
Balances,
|
|
8
8
|
LoginData,
|
|
9
9
|
MeData,
|
|
10
|
+
SSOLoginParams,
|
|
11
|
+
SSOSignupParams,
|
|
10
12
|
SignupParams,
|
|
11
13
|
emptyAccountSnapshot
|
|
12
14
|
} from './types';
|
|
@@ -105,6 +107,60 @@ class AccountApi extends TypedEventEmitter<AccountEvents> {
|
|
|
105
107
|
return res.data;
|
|
106
108
|
}
|
|
107
109
|
|
|
110
|
+
/**
|
|
111
|
+
* Log in via Google or Apple SSO. Pass the raw id_token from the platform
|
|
112
|
+
* SDK (`expo-auth-session` for Google, `expo-apple-authentication` for
|
|
113
|
+
* Apple). The Sogni server validates the JWT signature against the IDP's
|
|
114
|
+
* public keys, resolves the user's wallet by the IDP subject, and returns
|
|
115
|
+
* Sogni JWTs.
|
|
116
|
+
*
|
|
117
|
+
* Throws `ApiError` with `payload.errorCode === 105` if no account exists
|
|
118
|
+
* for this IDP identity yet — fall back to `signupWithSSO()` in that case.
|
|
119
|
+
*/
|
|
120
|
+
async loginWithSSO(params: SSOLoginParams): Promise<LoginData> {
|
|
121
|
+
const auth = this._client.auth;
|
|
122
|
+
if (!(auth instanceof TokenAuthManager)) {
|
|
123
|
+
throw new Error('loginWithSSO() requires token-based auth (the default)');
|
|
124
|
+
}
|
|
125
|
+
const appSource = params.appSource?.trim() || this._client.appSource;
|
|
126
|
+
const res = await this._client.rest.post<ApiResponse<LoginData>>('/v1/account/sso/login', {
|
|
127
|
+
provider: params.provider,
|
|
128
|
+
idToken: params.idToken,
|
|
129
|
+
rememberMe: params.rememberMe ?? true,
|
|
130
|
+
...(appSource ? { appSource } : {})
|
|
131
|
+
});
|
|
132
|
+
await auth.authenticate({ token: res.data.token, refreshToken: res.data.refreshToken });
|
|
133
|
+
return res.data;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Create a new Sogni account linked to a Google or Apple SSO identity. The
|
|
138
|
+
* server mints a custodial wallet via sogni-keymgr and returns Sogni JWTs;
|
|
139
|
+
* the user is automatically logged in on success.
|
|
140
|
+
*
|
|
141
|
+
* Common pattern: try `loginWithSSO()` first, fall back to this on
|
|
142
|
+
* `ApiError` 105 (account does not exist).
|
|
143
|
+
*/
|
|
144
|
+
async signupWithSSO(params: SSOSignupParams): Promise<LoginData> {
|
|
145
|
+
const auth = this._client.auth;
|
|
146
|
+
if (!(auth instanceof TokenAuthManager)) {
|
|
147
|
+
throw new Error('signupWithSSO() requires token-based auth (the default)');
|
|
148
|
+
}
|
|
149
|
+
const appSource = params.appSource?.trim() || this._client.appSource;
|
|
150
|
+
const res = await this._client.rest.post<ApiResponse<LoginData>>('/v1/account/sso/signup', {
|
|
151
|
+
appid: this._client.appId,
|
|
152
|
+
provider: params.provider,
|
|
153
|
+
idToken: params.idToken,
|
|
154
|
+
username: params.username,
|
|
155
|
+
subscribe: params.subscribe ? 1 : 0,
|
|
156
|
+
...(params.referralCode ? { referralCode: params.referralCode } : {}),
|
|
157
|
+
rememberMe: params.rememberMe ?? true,
|
|
158
|
+
...(appSource ? { appSource } : {})
|
|
159
|
+
});
|
|
160
|
+
await auth.authenticate({ token: res.data.token, refreshToken: res.data.refreshToken });
|
|
161
|
+
return res.data;
|
|
162
|
+
}
|
|
163
|
+
|
|
108
164
|
/**
|
|
109
165
|
* Create a new account. Derives the user's wallet on-device, signs the
|
|
110
166
|
* EIP-712 signup payload, and exchanges it for JWT tokens (the user is
|
|
@@ -155,7 +211,9 @@ class AccountApi extends TypedEventEmitter<AccountEvents> {
|
|
|
155
211
|
this._update({
|
|
156
212
|
username: res.data.username,
|
|
157
213
|
email: res.data.currentEmail,
|
|
158
|
-
walletAddress: res.data.walletAddress
|
|
214
|
+
walletAddress: res.data.walletAddress,
|
|
215
|
+
// Legacy password accounts may omit the `auth` field; treat as 'password'.
|
|
216
|
+
authMethod: res.data.auth ?? 'password'
|
|
159
217
|
});
|
|
160
218
|
return res.data;
|
|
161
219
|
}
|
package/src/Account/types.ts
CHANGED
|
@@ -3,6 +3,12 @@ import { SupernetType } from '../ApiClient/WebSocketClient/types';
|
|
|
3
3
|
|
|
4
4
|
export type { Balances };
|
|
5
5
|
|
|
6
|
+
/** How the user originally authenticated. Drives feature gating on SSO accounts. */
|
|
7
|
+
export type AuthMethod = 'password' | 'sso-google' | 'sso-apple';
|
|
8
|
+
|
|
9
|
+
/** SSO identity providers supported by the Sogni API. */
|
|
10
|
+
export type SSOProvider = 'google' | 'apple';
|
|
11
|
+
|
|
6
12
|
export interface MeData {
|
|
7
13
|
currentEmail: string;
|
|
8
14
|
username: string;
|
|
@@ -13,6 +19,15 @@ export interface MeData {
|
|
|
13
19
|
discordServerMember?: boolean;
|
|
14
20
|
discordUsername?: string;
|
|
15
21
|
requestedUpdatedEmail?: string;
|
|
22
|
+
/**
|
|
23
|
+
* How the user originally authenticated.
|
|
24
|
+
*
|
|
25
|
+
* Legacy password accounts may omit this field — treat missing as
|
|
26
|
+
* `'password'`. Use this to hide UI that doesn't apply to SSO users (e.g.,
|
|
27
|
+
* "Change Email", "Withdraw to Wallet") since their wallet is custodial and
|
|
28
|
+
* their email is managed by the IDP.
|
|
29
|
+
*/
|
|
30
|
+
auth?: AuthMethod;
|
|
16
31
|
}
|
|
17
32
|
|
|
18
33
|
export interface LoginData {
|
|
@@ -35,6 +50,48 @@ export interface SignupParams {
|
|
|
35
50
|
appSource?: string;
|
|
36
51
|
}
|
|
37
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Parameters for `account.loginWithSSO()`. Pass the raw `idToken` JWT exactly
|
|
55
|
+
* as the Google or Apple SDK returned it — do NOT decode it client-side. The
|
|
56
|
+
* Sogni server validates the JWT signature against the IDP's public keys.
|
|
57
|
+
*/
|
|
58
|
+
export interface SSOLoginParams {
|
|
59
|
+
provider: SSOProvider;
|
|
60
|
+
/** Raw id_token JWT from the Google or Apple SDK. */
|
|
61
|
+
idToken: string;
|
|
62
|
+
/**
|
|
63
|
+
* Whether to mint a long-lived refresh token. Mobile apps usually want
|
|
64
|
+
* `true` so the user stays logged in after backgrounding. Default true.
|
|
65
|
+
*/
|
|
66
|
+
rememberMe?: boolean;
|
|
67
|
+
/** Optional app source label for analytics. */
|
|
68
|
+
appSource?: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Parameters for `account.signupWithSSO()` — first-time SSO account creation.
|
|
73
|
+
* On success the server mints a custodial wallet via sogni-keymgr and the
|
|
74
|
+
* user is automatically logged in.
|
|
75
|
+
*/
|
|
76
|
+
export interface SSOSignupParams {
|
|
77
|
+
provider: SSOProvider;
|
|
78
|
+
/** Raw id_token JWT from the Google or Apple SDK. */
|
|
79
|
+
idToken: string;
|
|
80
|
+
/**
|
|
81
|
+
* Desired username (4-20 chars). Same validation rules as
|
|
82
|
+
* password-based signup. Lowercased server-side for indexing.
|
|
83
|
+
*/
|
|
84
|
+
username: string;
|
|
85
|
+
/** Subscribe to product updates / newsletter. Default false. */
|
|
86
|
+
subscribe?: boolean;
|
|
87
|
+
/** Optional referral code from another Sogni user. */
|
|
88
|
+
referralCode?: string;
|
|
89
|
+
/** See SSOLoginParams.rememberMe. */
|
|
90
|
+
rememberMe?: boolean;
|
|
91
|
+
/** Optional app source label. */
|
|
92
|
+
appSource?: string;
|
|
93
|
+
}
|
|
94
|
+
|
|
38
95
|
export interface AccountSnapshot {
|
|
39
96
|
authenticated: boolean;
|
|
40
97
|
networkStatus: 'connected' | 'disconnected' | 'connecting';
|
|
@@ -43,6 +100,11 @@ export interface AccountSnapshot {
|
|
|
43
100
|
walletAddress: string | null;
|
|
44
101
|
username: string | null;
|
|
45
102
|
email: string | null;
|
|
103
|
+
/**
|
|
104
|
+
* How the current user authenticated, populated after `account.me()`. Null
|
|
105
|
+
* until me() resolves. Use this to gate UI for SSO accounts.
|
|
106
|
+
*/
|
|
107
|
+
authMethod: AuthMethod | null;
|
|
46
108
|
}
|
|
47
109
|
|
|
48
110
|
export function emptyAccountSnapshot(): AccountSnapshot {
|
|
@@ -56,6 +118,7 @@ export function emptyAccountSnapshot(): AccountSnapshot {
|
|
|
56
118
|
},
|
|
57
119
|
walletAddress: null,
|
|
58
120
|
username: null,
|
|
59
|
-
email: null
|
|
121
|
+
email: null,
|
|
122
|
+
authMethod: null
|
|
60
123
|
};
|
|
61
124
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import AccountApi from './Account';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
AccountSnapshot,
|
|
4
|
+
AuthMethod,
|
|
5
|
+
Balances,
|
|
6
|
+
LoginData,
|
|
7
|
+
MeData,
|
|
8
|
+
SignupParams,
|
|
9
|
+
SSOLoginParams,
|
|
10
|
+
SSOProvider,
|
|
11
|
+
SSOSignupParams
|
|
12
|
+
} from './Account/types';
|
|
3
13
|
import ChatApi from './Chat';
|
|
4
14
|
import ChatStream from './Chat/ChatStream';
|
|
5
15
|
import { parseToolCallArguments } from './Chat/tools';
|
|
@@ -85,12 +95,16 @@ export type {
|
|
|
85
95
|
JobErrorReason,
|
|
86
96
|
JobStatus,
|
|
87
97
|
LLMModelInfo,
|
|
98
|
+
AuthMethod,
|
|
88
99
|
LoginData,
|
|
89
100
|
Logger,
|
|
90
101
|
LogLevel,
|
|
91
102
|
MediaInput,
|
|
92
103
|
MeData,
|
|
93
104
|
SignupParams,
|
|
105
|
+
SSOLoginParams,
|
|
106
|
+
SSOProvider,
|
|
107
|
+
SSOSignupParams,
|
|
94
108
|
Project,
|
|
95
109
|
ProjectParams,
|
|
96
110
|
ProjectStatus,
|
package/src/lib/mediaInput.ts
CHANGED
|
@@ -28,12 +28,22 @@ export interface MediaInputBody {
|
|
|
28
28
|
/**
|
|
29
29
|
* Convert a MediaInput into a fetch body for upload to a presigned PUT URL.
|
|
30
30
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
31
|
+
* Reads the URI via `fetch(uri).arrayBuffer()` and hands back a `Uint8Array`.
|
|
32
|
+
* We deliberately avoid `res.blob()` here for two reasons:
|
|
33
33
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
34
|
+
* 1. React Native's `Blob` is a minimal polyfill without `.text()` or
|
|
35
|
+
* `.arrayBuffer()` (see `Libraries/Blob/Blob.js`), so working with the
|
|
36
|
+
* raw bytes is more portable than rolling with a Blob whose surface
|
|
37
|
+
* depends on platform version.
|
|
38
|
+
* 2. On iOS PhotoKit (`ph://`) URIs, `res.blob()` has been observed to
|
|
39
|
+
* silently return a 0-byte blob — we'd PUT an empty body and the server
|
|
40
|
+
* would store a corrupted image. Reading as an ArrayBuffer makes the
|
|
41
|
+
* byte count visible and lets us throw on empty input.
|
|
42
|
+
*
|
|
43
|
+
* For very large files (videos, raw audio), this buffers the whole payload
|
|
44
|
+
* in JS memory. Acceptable for typical image / short audio reference
|
|
45
|
+
* uploads. If you have raw bytes already (e.g. from `expo-file-system`),
|
|
46
|
+
* pass `Uint8Array` directly to skip the fetch.
|
|
37
47
|
*/
|
|
38
48
|
export async function toFetchBody(
|
|
39
49
|
input: MediaInput,
|
|
@@ -46,9 +56,16 @@ export async function toFetchBody(
|
|
|
46
56
|
if (!res.ok) {
|
|
47
57
|
throw new Error(`Failed to read media at ${input.uri}: HTTP ${res.status}`);
|
|
48
58
|
}
|
|
49
|
-
const
|
|
59
|
+
const arrayBuffer = await res.arrayBuffer();
|
|
60
|
+
if (arrayBuffer.byteLength === 0) {
|
|
61
|
+
throw new Error(
|
|
62
|
+
`Read 0 bytes from ${input.uri}. On iOS, ph:// PhotoKit URIs sometimes return empty bodies — copy the asset to a file:// path first (e.g. via expo-image-picker with allowsEditing or expo-image-manipulator).`
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
const bytes = new Uint8Array(arrayBuffer);
|
|
66
|
+
const responseContentType = res.headers.get('content-type') ?? undefined;
|
|
50
67
|
return {
|
|
51
|
-
body:
|
|
52
|
-
contentType: contentTypeOverride ?? input.type ??
|
|
68
|
+
body: bytes as unknown as BodyInit,
|
|
69
|
+
contentType: contentTypeOverride ?? input.type ?? responseContentType
|
|
53
70
|
};
|
|
54
71
|
}
|