@sogni-ai/expo-client 1.0.0-alpha.10

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.
Files changed (262) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/README.md +411 -0
  3. package/dist/cjs/Account/index.d.ts +60 -0
  4. package/dist/cjs/Account/index.d.ts.map +1 -0
  5. package/dist/cjs/Account/index.js +188 -0
  6. package/dist/cjs/Account/index.js.map +1 -0
  7. package/dist/cjs/Account/types.d.ts +43 -0
  8. package/dist/cjs/Account/types.d.ts.map +1 -0
  9. package/dist/cjs/Account/types.js +18 -0
  10. package/dist/cjs/Account/types.js.map +1 -0
  11. package/dist/cjs/ApiClient/WebSocketClient/events.d.ts +139 -0
  12. package/dist/cjs/ApiClient/WebSocketClient/events.d.ts.map +1 -0
  13. package/dist/cjs/ApiClient/WebSocketClient/events.js +3 -0
  14. package/dist/cjs/ApiClient/WebSocketClient/events.js.map +1 -0
  15. package/dist/cjs/ApiClient/WebSocketClient/index.d.ts +45 -0
  16. package/dist/cjs/ApiClient/WebSocketClient/index.d.ts.map +1 -0
  17. package/dist/cjs/ApiClient/WebSocketClient/index.js +283 -0
  18. package/dist/cjs/ApiClient/WebSocketClient/index.js.map +1 -0
  19. package/dist/cjs/ApiClient/WebSocketClient/normalize.d.ts +45 -0
  20. package/dist/cjs/ApiClient/WebSocketClient/normalize.d.ts.map +1 -0
  21. package/dist/cjs/ApiClient/WebSocketClient/normalize.js +245 -0
  22. package/dist/cjs/ApiClient/WebSocketClient/normalize.js.map +1 -0
  23. package/dist/cjs/ApiClient/WebSocketClient/types.d.ts +9 -0
  24. package/dist/cjs/ApiClient/WebSocketClient/types.d.ts.map +1 -0
  25. package/dist/cjs/ApiClient/WebSocketClient/types.js +3 -0
  26. package/dist/cjs/ApiClient/WebSocketClient/types.js.map +1 -0
  27. package/dist/cjs/ApiClient/WebSocketClient/wireTypes.d.ts +161 -0
  28. package/dist/cjs/ApiClient/WebSocketClient/wireTypes.d.ts.map +1 -0
  29. package/dist/cjs/ApiClient/WebSocketClient/wireTypes.js +11 -0
  30. package/dist/cjs/ApiClient/WebSocketClient/wireTypes.js.map +1 -0
  31. package/dist/cjs/ApiClient/index.d.ts +60 -0
  32. package/dist/cjs/ApiClient/index.d.ts.map +1 -0
  33. package/dist/cjs/ApiClient/index.js +87 -0
  34. package/dist/cjs/ApiClient/index.js.map +1 -0
  35. package/dist/cjs/Chat/ChatStream.d.ts +42 -0
  36. package/dist/cjs/Chat/ChatStream.d.ts.map +1 -0
  37. package/dist/cjs/Chat/ChatStream.js +146 -0
  38. package/dist/cjs/Chat/ChatStream.js.map +1 -0
  39. package/dist/cjs/Chat/index.d.ts +61 -0
  40. package/dist/cjs/Chat/index.d.ts.map +1 -0
  41. package/dist/cjs/Chat/index.js +179 -0
  42. package/dist/cjs/Chat/index.js.map +1 -0
  43. package/dist/cjs/Chat/tools.d.ts +13 -0
  44. package/dist/cjs/Chat/tools.d.ts.map +1 -0
  45. package/dist/cjs/Chat/tools.js +22 -0
  46. package/dist/cjs/Chat/tools.js.map +1 -0
  47. package/dist/cjs/Chat/types.d.ts +153 -0
  48. package/dist/cjs/Chat/types.d.ts.map +1 -0
  49. package/dist/cjs/Chat/types.js +3 -0
  50. package/dist/cjs/Chat/types.js.map +1 -0
  51. package/dist/cjs/Projects/ControlNet.d.ts +30 -0
  52. package/dist/cjs/Projects/ControlNet.d.ts.map +1 -0
  53. package/dist/cjs/Projects/ControlNet.js +45 -0
  54. package/dist/cjs/Projects/ControlNet.js.map +1 -0
  55. package/dist/cjs/Projects/createJobRequestMessage.d.ts +11 -0
  56. package/dist/cjs/Projects/createJobRequestMessage.d.ts.map +1 -0
  57. package/dist/cjs/Projects/createJobRequestMessage.js +239 -0
  58. package/dist/cjs/Projects/createJobRequestMessage.js.map +1 -0
  59. package/dist/cjs/Projects/index.d.ts +96 -0
  60. package/dist/cjs/Projects/index.d.ts.map +1 -0
  61. package/dist/cjs/Projects/index.js +536 -0
  62. package/dist/cjs/Projects/index.js.map +1 -0
  63. package/dist/cjs/Projects/restNormalize.d.ts +60 -0
  64. package/dist/cjs/Projects/restNormalize.d.ts.map +1 -0
  65. package/dist/cjs/Projects/restNormalize.js +89 -0
  66. package/dist/cjs/Projects/restNormalize.js.map +1 -0
  67. package/dist/cjs/Projects/types.d.ts +233 -0
  68. package/dist/cjs/Projects/types.d.ts.map +1 -0
  69. package/dist/cjs/Projects/types.js +3 -0
  70. package/dist/cjs/Projects/types.js.map +1 -0
  71. package/dist/cjs/Projects/utils.d.ts +23 -0
  72. package/dist/cjs/Projects/utils.d.ts.map +1 -0
  73. package/dist/cjs/Projects/utils.js +65 -0
  74. package/dist/cjs/Projects/utils.js.map +1 -0
  75. package/dist/cjs/index.d.ts +63 -0
  76. package/dist/cjs/index.d.ts.map +1 -0
  77. package/dist/cjs/index.js +116 -0
  78. package/dist/cjs/index.js.map +1 -0
  79. package/dist/cjs/lib/AuthManager/ApiKeyAuthManager.d.ts +15 -0
  80. package/dist/cjs/lib/AuthManager/ApiKeyAuthManager.d.ts.map +1 -0
  81. package/dist/cjs/lib/AuthManager/ApiKeyAuthManager.js +47 -0
  82. package/dist/cjs/lib/AuthManager/ApiKeyAuthManager.js.map +1 -0
  83. package/dist/cjs/lib/AuthManager/AuthManagerBase.d.ts +23 -0
  84. package/dist/cjs/lib/AuthManager/AuthManagerBase.d.ts.map +1 -0
  85. package/dist/cjs/lib/AuthManager/AuthManagerBase.js +14 -0
  86. package/dist/cjs/lib/AuthManager/AuthManagerBase.js.map +1 -0
  87. package/dist/cjs/lib/AuthManager/AuthStorage.d.ts +11 -0
  88. package/dist/cjs/lib/AuthManager/AuthStorage.d.ts.map +1 -0
  89. package/dist/cjs/lib/AuthManager/AuthStorage.js +50 -0
  90. package/dist/cjs/lib/AuthManager/AuthStorage.js.map +1 -0
  91. package/dist/cjs/lib/AuthManager/TokenAuthManager.d.ts +35 -0
  92. package/dist/cjs/lib/AuthManager/TokenAuthManager.d.ts.map +1 -0
  93. package/dist/cjs/lib/AuthManager/TokenAuthManager.js +164 -0
  94. package/dist/cjs/lib/AuthManager/TokenAuthManager.js.map +1 -0
  95. package/dist/cjs/lib/AuthManager/index.d.ts +7 -0
  96. package/dist/cjs/lib/AuthManager/index.d.ts.map +1 -0
  97. package/dist/cjs/lib/AuthManager/index.js +13 -0
  98. package/dist/cjs/lib/AuthManager/index.js.map +1 -0
  99. package/dist/cjs/lib/Cache.d.ts +12 -0
  100. package/dist/cjs/lib/Cache.d.ts.map +1 -0
  101. package/dist/cjs/lib/Cache.js +36 -0
  102. package/dist/cjs/lib/Cache.js.map +1 -0
  103. package/dist/cjs/lib/DefaultLogger.d.ts +17 -0
  104. package/dist/cjs/lib/DefaultLogger.d.ts.map +1 -0
  105. package/dist/cjs/lib/DefaultLogger.js +36 -0
  106. package/dist/cjs/lib/DefaultLogger.js.map +1 -0
  107. package/dist/cjs/lib/RestClient.d.ts +18 -0
  108. package/dist/cjs/lib/RestClient.d.ts.map +1 -0
  109. package/dist/cjs/lib/RestClient.js +67 -0
  110. package/dist/cjs/lib/RestClient.js.map +1 -0
  111. package/dist/cjs/lib/TypedEventEmitter.d.ts +16 -0
  112. package/dist/cjs/lib/TypedEventEmitter.d.ts.map +1 -0
  113. package/dist/cjs/lib/TypedEventEmitter.js +46 -0
  114. package/dist/cjs/lib/TypedEventEmitter.js.map +1 -0
  115. package/dist/cjs/lib/base64.d.ts +3 -0
  116. package/dist/cjs/lib/base64.d.ts.map +1 -0
  117. package/dist/cjs/lib/base64.js +21 -0
  118. package/dist/cjs/lib/base64.js.map +1 -0
  119. package/dist/cjs/lib/getUUID.d.ts +12 -0
  120. package/dist/cjs/lib/getUUID.d.ts.map +1 -0
  121. package/dist/cjs/lib/getUUID.js +29 -0
  122. package/dist/cjs/lib/getUUID.js.map +1 -0
  123. package/dist/cjs/lib/mediaInput.d.ts +33 -0
  124. package/dist/cjs/lib/mediaInput.d.ts.map +1 -0
  125. package/dist/cjs/lib/mediaInput.js +32 -0
  126. package/dist/cjs/lib/mediaInput.js.map +1 -0
  127. package/dist/cjs/lib/utils.d.ts +10 -0
  128. package/dist/cjs/lib/utils.d.ts.map +1 -0
  129. package/dist/cjs/lib/utils.js +24 -0
  130. package/dist/cjs/lib/utils.js.map +1 -0
  131. package/dist/cjs/types/ErrorData.d.ts +7 -0
  132. package/dist/cjs/types/ErrorData.d.ts.map +1 -0
  133. package/dist/cjs/types/ErrorData.js +3 -0
  134. package/dist/cjs/types/ErrorData.js.map +1 -0
  135. package/dist/cjs/types/json.d.ts +6 -0
  136. package/dist/cjs/types/json.d.ts.map +1 -0
  137. package/dist/cjs/types/json.js +3 -0
  138. package/dist/cjs/types/json.js.map +1 -0
  139. package/dist/cjs/types/token.d.ts +2 -0
  140. package/dist/cjs/types/token.d.ts.map +1 -0
  141. package/dist/cjs/types/token.js +3 -0
  142. package/dist/cjs/types/token.js.map +1 -0
  143. package/dist/cjs/version.d.ts +2 -0
  144. package/dist/cjs/version.d.ts.map +1 -0
  145. package/dist/cjs/version.js +5 -0
  146. package/dist/cjs/version.js.map +1 -0
  147. package/dist/cjs/wallet.d.ts +59 -0
  148. package/dist/cjs/wallet.d.ts.map +1 -0
  149. package/dist/cjs/wallet.js +125 -0
  150. package/dist/cjs/wallet.js.map +1 -0
  151. package/dist/esm/Account/index.js +183 -0
  152. package/dist/esm/Account/index.js.map +1 -0
  153. package/dist/esm/Account/types.js +15 -0
  154. package/dist/esm/Account/types.js.map +1 -0
  155. package/dist/esm/ApiClient/WebSocketClient/events.js +2 -0
  156. package/dist/esm/ApiClient/WebSocketClient/events.js.map +1 -0
  157. package/dist/esm/ApiClient/WebSocketClient/index.js +278 -0
  158. package/dist/esm/ApiClient/WebSocketClient/index.js.map +1 -0
  159. package/dist/esm/ApiClient/WebSocketClient/normalize.js +229 -0
  160. package/dist/esm/ApiClient/WebSocketClient/normalize.js.map +1 -0
  161. package/dist/esm/ApiClient/WebSocketClient/types.js +2 -0
  162. package/dist/esm/ApiClient/WebSocketClient/types.js.map +1 -0
  163. package/dist/esm/ApiClient/WebSocketClient/wireTypes.js +10 -0
  164. package/dist/esm/ApiClient/WebSocketClient/wireTypes.js.map +1 -0
  165. package/dist/esm/ApiClient/index.js +80 -0
  166. package/dist/esm/ApiClient/index.js.map +1 -0
  167. package/dist/esm/Chat/ChatStream.js +144 -0
  168. package/dist/esm/Chat/ChatStream.js.map +1 -0
  169. package/dist/esm/Chat/index.js +174 -0
  170. package/dist/esm/Chat/index.js.map +1 -0
  171. package/dist/esm/Chat/tools.js +19 -0
  172. package/dist/esm/Chat/tools.js.map +1 -0
  173. package/dist/esm/Chat/types.js +2 -0
  174. package/dist/esm/Chat/types.js.map +1 -0
  175. package/dist/esm/Projects/ControlNet.js +41 -0
  176. package/dist/esm/Projects/ControlNet.js.map +1 -0
  177. package/dist/esm/Projects/createJobRequestMessage.js +236 -0
  178. package/dist/esm/Projects/createJobRequestMessage.js.map +1 -0
  179. package/dist/esm/Projects/index.js +531 -0
  180. package/dist/esm/Projects/index.js.map +1 -0
  181. package/dist/esm/Projects/restNormalize.js +86 -0
  182. package/dist/esm/Projects/restNormalize.js.map +1 -0
  183. package/dist/esm/Projects/types.js +2 -0
  184. package/dist/esm/Projects/types.js.map +1 -0
  185. package/dist/esm/Projects/utils.js +55 -0
  186. package/dist/esm/Projects/utils.js.map +1 -0
  187. package/dist/esm/index.js +72 -0
  188. package/dist/esm/index.js.map +1 -0
  189. package/dist/esm/lib/AuthManager/ApiKeyAuthManager.js +42 -0
  190. package/dist/esm/lib/AuthManager/ApiKeyAuthManager.js.map +1 -0
  191. package/dist/esm/lib/AuthManager/AuthManagerBase.js +9 -0
  192. package/dist/esm/lib/AuthManager/AuthManagerBase.js.map +1 -0
  193. package/dist/esm/lib/AuthManager/AuthStorage.js +13 -0
  194. package/dist/esm/lib/AuthManager/AuthStorage.js.map +1 -0
  195. package/dist/esm/lib/AuthManager/TokenAuthManager.js +159 -0
  196. package/dist/esm/lib/AuthManager/TokenAuthManager.js.map +1 -0
  197. package/dist/esm/lib/AuthManager/index.js +5 -0
  198. package/dist/esm/lib/AuthManager/index.js.map +1 -0
  199. package/dist/esm/lib/Cache.js +33 -0
  200. package/dist/esm/lib/Cache.js.map +1 -0
  201. package/dist/esm/lib/DefaultLogger.js +32 -0
  202. package/dist/esm/lib/DefaultLogger.js.map +1 -0
  203. package/dist/esm/lib/RestClient.js +62 -0
  204. package/dist/esm/lib/RestClient.js.map +1 -0
  205. package/dist/esm/lib/TypedEventEmitter.js +44 -0
  206. package/dist/esm/lib/TypedEventEmitter.js.map +1 -0
  207. package/dist/esm/lib/base64.js +17 -0
  208. package/dist/esm/lib/base64.js.map +1 -0
  209. package/dist/esm/lib/getUUID.js +26 -0
  210. package/dist/esm/lib/getUUID.js.map +1 -0
  211. package/dist/esm/lib/mediaInput.js +28 -0
  212. package/dist/esm/lib/mediaInput.js.map +1 -0
  213. package/dist/esm/lib/utils.js +19 -0
  214. package/dist/esm/lib/utils.js.map +1 -0
  215. package/dist/esm/types/ErrorData.js +2 -0
  216. package/dist/esm/types/ErrorData.js.map +1 -0
  217. package/dist/esm/types/json.js +2 -0
  218. package/dist/esm/types/json.js.map +1 -0
  219. package/dist/esm/types/token.js +2 -0
  220. package/dist/esm/types/token.js.map +1 -0
  221. package/dist/esm/version.js +2 -0
  222. package/dist/esm/version.js.map +1 -0
  223. package/dist/esm/wallet.js +117 -0
  224. package/dist/esm/wallet.js.map +1 -0
  225. package/package.json +92 -0
  226. package/src/Account/index.ts +214 -0
  227. package/src/Account/types.ts +61 -0
  228. package/src/ApiClient/WebSocketClient/events.ts +168 -0
  229. package/src/ApiClient/WebSocketClient/index.ts +345 -0
  230. package/src/ApiClient/WebSocketClient/normalize.ts +287 -0
  231. package/src/ApiClient/WebSocketClient/types.ts +10 -0
  232. package/src/ApiClient/WebSocketClient/wireTypes.ts +183 -0
  233. package/src/ApiClient/index.ts +147 -0
  234. package/src/Chat/ChatStream.ts +164 -0
  235. package/src/Chat/index.ts +224 -0
  236. package/src/Chat/tools.ts +23 -0
  237. package/src/Chat/types.ts +165 -0
  238. package/src/Projects/ControlNet.ts +84 -0
  239. package/src/Projects/createJobRequestMessage.ts +241 -0
  240. package/src/Projects/index.ts +608 -0
  241. package/src/Projects/restNormalize.ts +154 -0
  242. package/src/Projects/types.ts +266 -0
  243. package/src/Projects/utils.ts +60 -0
  244. package/src/index.ts +217 -0
  245. package/src/lib/AuthManager/ApiKeyAuthManager.ts +52 -0
  246. package/src/lib/AuthManager/AuthManagerBase.ts +35 -0
  247. package/src/lib/AuthManager/AuthStorage.ts +21 -0
  248. package/src/lib/AuthManager/TokenAuthManager.ts +179 -0
  249. package/src/lib/AuthManager/index.ts +8 -0
  250. package/src/lib/Cache.ts +45 -0
  251. package/src/lib/DefaultLogger.ts +47 -0
  252. package/src/lib/RestClient.ts +77 -0
  253. package/src/lib/TypedEventEmitter.ts +52 -0
  254. package/src/lib/base64.ts +17 -0
  255. package/src/lib/getUUID.ts +27 -0
  256. package/src/lib/mediaInput.ts +54 -0
  257. package/src/lib/utils.ts +21 -0
  258. package/src/types/ErrorData.ts +7 -0
  259. package/src/types/json.ts +5 -0
  260. package/src/types/token.ts +1 -0
  261. package/src/version.ts +1 -0
  262. package/src/wallet.ts +158 -0
@@ -0,0 +1,28 @@
1
+ export function isMediaInputUri(input) {
2
+ return typeof input === 'object' && 'uri' in input;
3
+ }
4
+ /**
5
+ * Convert a MediaInput into a fetch body for upload to a presigned PUT URL.
6
+ *
7
+ * For URI inputs: reads the file via fetch(uri).blob(), so it works with
8
+ * `file://`, `content://`, `ph://`, and `http(s)://` URIs.
9
+ *
10
+ * For Uint8Array inputs: passes the bytes through. Caller must provide
11
+ * the correct Content-Type via the `contentType` parameter; we cannot
12
+ * reliably detect MIME from raw bytes in all cases.
13
+ */
14
+ export async function toFetchBody(input, contentTypeOverride) {
15
+ if (input instanceof Uint8Array) {
16
+ return { body: input, contentType: contentTypeOverride };
17
+ }
18
+ const res = await fetch(input.uri);
19
+ if (!res.ok) {
20
+ throw new Error(`Failed to read media at ${input.uri}: HTTP ${res.status}`);
21
+ }
22
+ const blob = await res.blob();
23
+ return {
24
+ body: blob,
25
+ contentType: contentTypeOverride ?? input.type ?? blob.type ?? undefined
26
+ };
27
+ }
28
+ //# sourceMappingURL=mediaInput.js.map
@@ -0,0 +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;;;;;;;;;GASG;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,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,OAAO;QACL,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,mBAAmB,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,SAAS;KACzE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { jwtDecode } from 'jwt-decode';
2
+ export function decodeToken(token) {
3
+ const data = jwtDecode(token);
4
+ return {
5
+ walletAddress: data.addr,
6
+ expiresAt: new Date(data.exp * 1000)
7
+ };
8
+ }
9
+ export function decodeRefreshToken(token) {
10
+ const data = jwtDecode(token);
11
+ return {
12
+ env: data.env,
13
+ expiresAt: new Date(data.exp * 1000)
14
+ };
15
+ }
16
+ export async function delay(ms) {
17
+ return new Promise((resolve) => setTimeout(resolve, ms));
18
+ }
19
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,IAAI,GAAG,SAAS,CAA0D,KAAK,CAAC,CAAC;IACvF,OAAO;QACL,aAAa,EAAE,IAAI,CAAC,IAAI;QACxB,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,IAAI,GAAG,SAAS,CAA0D,KAAK,CAAC,CAAC;IACvF,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,EAAU;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ErrorData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorData.js","sourceRoot":"","sources":["../../../src/types/ErrorData.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/types/json.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/types/token.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export const LIB_VERSION = '0.1.0';
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Wallet creation and EIP-712 signing for Sogni authentication.
3
+ *
4
+ * Importable as a separate entry point so consumers using only API-key auth
5
+ * do not bundle viem:
6
+ *
7
+ * import { deriveWallet, signAuthentication } from '@sogni-ai/expo-client/wallet';
8
+ *
9
+ * Requires `crypto.getRandomValues` (for fresh wallet generation), which the
10
+ * `polyfillWebCrypto()` call from `expo-standard-web-crypto` provides. PBKDF2
11
+ * for username+password derivation is done in pure JS via @noble/hashes, so
12
+ * no `crypto.subtle` is needed (Expo doesn't polyfill it).
13
+ */
14
+ import { pbkdf2 } from '@noble/hashes/pbkdf2';
15
+ import { sha256 } from '@noble/hashes/sha2';
16
+ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
17
+ export { LIB_VERSION } from './version';
18
+ const PLACEHOLDER_VERIFYING_CONTRACT = '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC';
19
+ function getDomain(network) {
20
+ return network === 'testnet'
21
+ ? {
22
+ name: 'Sogni-testnet',
23
+ version: '1',
24
+ chainId: 84532,
25
+ verifyingContract: PLACEHOLDER_VERIFYING_CONTRACT
26
+ }
27
+ : {
28
+ name: 'Sogni AI',
29
+ version: '1',
30
+ chainId: 8453,
31
+ verifyingContract: PLACEHOLDER_VERIFYING_CONTRACT
32
+ };
33
+ }
34
+ const AUTH_TYPES = {
35
+ Authentication: [
36
+ { name: 'walletAddress', type: 'address' },
37
+ { name: 'nonce', type: 'string' }
38
+ ]
39
+ };
40
+ const SIGNUP_TYPES = {
41
+ Signup: [
42
+ { name: 'appid', type: 'string' },
43
+ { name: 'username', type: 'string' },
44
+ { name: 'email', type: 'string' },
45
+ { name: 'subscribe', type: 'uint256' },
46
+ { name: 'walletAddress', type: 'address' },
47
+ { name: 'nonce', type: 'string' }
48
+ ]
49
+ };
50
+ /**
51
+ * Derive a deterministic wallet from a username + password using PBKDF2
52
+ * (10,000 iterations of SHA-256, salt = username, output = 32 bytes).
53
+ *
54
+ * Uses @noble/hashes pure-JS implementation rather than `crypto.subtle`
55
+ * because Hermes / expo-standard-web-crypto don't polyfill subtle. Still
56
+ * async-returning so callers don't depend on the implementation detail.
57
+ *
58
+ * The same credentials always produce the same wallet on every device,
59
+ * which is how Sogni's username+password login works without ever
60
+ * transmitting or storing the password server-side.
61
+ */
62
+ export async function deriveWallet(input) {
63
+ const { username, password } = input;
64
+ if (!username || !password) {
65
+ throw new Error('deriveWallet requires both username and password');
66
+ }
67
+ const passwordBytes = new TextEncoder().encode(password);
68
+ const saltBytes = new TextEncoder().encode(username);
69
+ const bits = pbkdf2(sha256, passwordBytes, saltBytes, { c: 10000, dkLen: 32 });
70
+ const privateKey = bytesToHex(bits);
71
+ const account = privateKeyToAccount(privateKey);
72
+ return { privateKey, address: account.address };
73
+ }
74
+ /** Generate a fresh random wallet (uses crypto.getRandomValues internally). */
75
+ export function createRandomWallet() {
76
+ const privateKey = generatePrivateKey();
77
+ const account = privateKeyToAccount(privateKey);
78
+ return { privateKey, address: account.address };
79
+ }
80
+ /**
81
+ * Sign the Authentication EIP-712 message used by `/v1/account/login` and
82
+ * other authenticated REST endpoints.
83
+ */
84
+ export async function signAuthentication(wallet, params, network = 'mainnet') {
85
+ const account = privateKeyToAccount(wallet.privateKey);
86
+ return account.signTypedData({
87
+ domain: getDomain(network),
88
+ types: AUTH_TYPES,
89
+ primaryType: 'Authentication',
90
+ message: { walletAddress: wallet.address, nonce: params.nonce }
91
+ });
92
+ }
93
+ /**
94
+ * Sign the Signup EIP-712 message used by `/v1/account/create`. The
95
+ * `subscribe` boolean is encoded as a uint256 (0/1) on the wire.
96
+ */
97
+ export async function signSignup(wallet, params, network = 'mainnet') {
98
+ const account = privateKeyToAccount(wallet.privateKey);
99
+ return account.signTypedData({
100
+ domain: getDomain(network),
101
+ types: SIGNUP_TYPES,
102
+ primaryType: 'Signup',
103
+ message: {
104
+ appid: params.appid,
105
+ username: params.username,
106
+ email: params.email,
107
+ subscribe: BigInt(params.subscribe ? 1 : 0),
108
+ walletAddress: wallet.address,
109
+ nonce: params.nonce
110
+ }
111
+ });
112
+ }
113
+ function bytesToHex(bytes) {
114
+ const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
115
+ return `0x${hex}`;
116
+ }
117
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/wallet.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,92 @@
1
+ {
2
+ "name": "@sogni-ai/expo-client",
3
+ "version": "1.0.0-alpha.10",
4
+ "description": "Sogni SDK for Expo/React Native - AI image, video & audio generation plus LLM chat via the Sogni Supernet",
5
+ "keywords": [
6
+ "sogni",
7
+ "expo",
8
+ "react-native",
9
+ "ai",
10
+ "image-generation",
11
+ "video-generation",
12
+ "stable-diffusion",
13
+ "flux",
14
+ "wan",
15
+ "ltx",
16
+ "text-to-image",
17
+ "text-to-video",
18
+ "generative-ai",
19
+ "llm",
20
+ "supernet"
21
+ ],
22
+ "main": "./dist/cjs/index.js",
23
+ "module": "./dist/esm/index.js",
24
+ "types": "./dist/cjs/index.d.ts",
25
+ "exports": {
26
+ ".": {
27
+ "import": "./dist/esm/index.js",
28
+ "require": "./dist/cjs/index.js",
29
+ "types": "./dist/cjs/index.d.ts"
30
+ },
31
+ "./wallet": {
32
+ "import": "./dist/esm/wallet.js",
33
+ "require": "./dist/cjs/wallet.js",
34
+ "types": "./dist/cjs/wallet.d.ts"
35
+ },
36
+ "./package.json": "./package.json"
37
+ },
38
+ "files": [
39
+ "dist/",
40
+ "src/",
41
+ "README.md",
42
+ "CHANGELOG.md"
43
+ ],
44
+ "scripts": {
45
+ "clean": "rimraf ./dist",
46
+ "build": "npm run clean && npm run build:cjs && npm run build:esm",
47
+ "build:cjs": "tsc --project tsconfig.json",
48
+ "build:esm": "tsc --project tsconfig.esm.json",
49
+ "watch": "tsc --watch --project tsconfig.json",
50
+ "prepublishOnly": "npm run build",
51
+ "prettier": "prettier --check ./src",
52
+ "prettier:fix": "prettier --write ./src",
53
+ "release": "semantic-release",
54
+ "prepare": "husky"
55
+ },
56
+ "repository": {
57
+ "type": "git",
58
+ "url": "git+https://github.com/Sogni-AI/expo-client.git"
59
+ },
60
+ "homepage": "https://github.com/Sogni-AI/expo-client#readme",
61
+ "bugs": {
62
+ "url": "https://github.com/Sogni-AI/expo-client/issues"
63
+ },
64
+ "author": "Sogni AI",
65
+ "license": "ISC",
66
+ "publishConfig": {
67
+ "access": "public"
68
+ },
69
+ "dependencies": {
70
+ "@noble/hashes": "^2.2.0",
71
+ "jwt-decode": "^4.0.0",
72
+ "viem": "^2.21.0"
73
+ },
74
+ "peerDependencies": {
75
+ "expo": ">=50.0.0",
76
+ "expo-secure-store": ">=12.0.0",
77
+ "expo-standard-web-crypto": ">=2.0.0",
78
+ "react-native": ">=0.73.0"
79
+ },
80
+ "devDependencies": {
81
+ "@commitlint/cli": "^19.0.0",
82
+ "@commitlint/config-conventional": "^19.0.0",
83
+ "@semantic-release/changelog": "^6.0.3",
84
+ "@semantic-release/git": "^10.0.1",
85
+ "expo-secure-store": "^55.0.13",
86
+ "husky": "^9.1.7",
87
+ "prettier": "^3.3.3",
88
+ "rimraf": "^6.0.1",
89
+ "semantic-release": "^24.2.1",
90
+ "typescript": "^5.5.3"
91
+ }
92
+ }
@@ -0,0 +1,214 @@
1
+ import ApiClient, { ApiError, ApiResponse } from '../ApiClient';
2
+ import TypedEventEmitter from '../lib/TypedEventEmitter';
3
+ import { TokenAuthManager } from '../lib/AuthManager';
4
+ import { deriveWallet, signAuthentication, signSignup, WalletNetwork } from '../wallet';
5
+ import {
6
+ AccountSnapshot,
7
+ Balances,
8
+ LoginData,
9
+ MeData,
10
+ SignupParams,
11
+ emptyAccountSnapshot
12
+ } from './types';
13
+
14
+ interface AccountEvents {
15
+ change: AccountSnapshot;
16
+ }
17
+
18
+ /**
19
+ * Account API: authentication, current-user info, balance.
20
+ *
21
+ * login() and signup() derive a deterministic wallet from username + password
22
+ * via PBKDF2(password, username, 10000 iter, SHA-256, 32 bytes), then sign an
23
+ * EIP-712 authentication or signup message with that wallet. The wallet
24
+ * private key never leaves the device.
25
+ *
26
+ * login()/signup() require token-based auth (the default). For API-key auth,
27
+ * use the apiKey config option in SogniClient.create() instead.
28
+ */
29
+ class AccountApi extends TypedEventEmitter<AccountEvents> {
30
+ private _client: ApiClient;
31
+ private _snapshot: AccountSnapshot;
32
+ private _walletNetwork: WalletNetwork;
33
+
34
+ constructor(client: ApiClient, options: { testnet?: boolean } = {}) {
35
+ super();
36
+ this._client = client;
37
+ this._snapshot = emptyAccountSnapshot();
38
+ this._walletNetwork = options.testnet ? 'testnet' : 'mainnet';
39
+
40
+ client.socket.on('connected', ({ network }) => {
41
+ this._update({ networkStatus: 'connected', network });
42
+ });
43
+ client.socket.on('disconnected', () => {
44
+ this._update({ networkStatus: 'disconnected', network: null });
45
+ });
46
+ client.socket.on('authenticated', (e) => {
47
+ this._update({
48
+ authenticated: true,
49
+ username: e.username,
50
+ walletAddress: e.walletAddress,
51
+ balance: e.balance
52
+ });
53
+ });
54
+ client.socket.on('balanceUpdate', (e) => {
55
+ this._update({ balance: e.balance });
56
+ });
57
+ client.socket.on('changeNetwork', (e) => {
58
+ this._update({ network: e.network });
59
+ });
60
+ client.on('authUpdated', (authenticated) => {
61
+ if (!authenticated) {
62
+ this._update(emptyAccountSnapshot());
63
+ }
64
+ });
65
+ }
66
+
67
+ /** Read-only snapshot of the current account state. */
68
+ get current(): Readonly<AccountSnapshot> {
69
+ return this._snapshot;
70
+ }
71
+
72
+ /** Subscribe to account state changes. Returns an unsubscribe function. */
73
+ onChange(listener: (snapshot: AccountSnapshot) => void): () => void {
74
+ return this.on('change', listener);
75
+ }
76
+
77
+ /**
78
+ * Log in with username + password. Derives the user's wallet on-device,
79
+ * signs an EIP-712 authentication message, and exchanges it for JWT tokens
80
+ * which are then persisted to SecureStore.
81
+ */
82
+ async login(
83
+ username: string,
84
+ password: string,
85
+ options: { appSource?: string } = {}
86
+ ): Promise<LoginData> {
87
+ const auth = this._client.auth;
88
+ if (!(auth instanceof TokenAuthManager)) {
89
+ throw new Error('login() requires token-based auth (the default)');
90
+ }
91
+ const wallet = await deriveWallet({ username, password });
92
+ const nonce = await this._getNonce(wallet.address);
93
+ const signature = await signAuthentication(wallet, { nonce }, this._walletNetwork);
94
+ const appSource = options.appSource?.trim() || this._client.appSource;
95
+ const res = await this._client.rest.post<ApiResponse<LoginData>>('/v1/account/login', {
96
+ walletAddress: wallet.address,
97
+ signature,
98
+ ...(appSource ? { appSource } : {}),
99
+ rememberMe: false
100
+ });
101
+ await auth.authenticate({
102
+ token: res.data.token,
103
+ refreshToken: res.data.refreshToken
104
+ });
105
+ return res.data;
106
+ }
107
+
108
+ /**
109
+ * Create a new account. Derives the user's wallet on-device, signs the
110
+ * EIP-712 signup payload, and exchanges it for JWT tokens (the user is
111
+ * automatically logged in on success).
112
+ */
113
+ async signup(params: SignupParams): Promise<LoginData> {
114
+ const auth = this._client.auth;
115
+ if (!(auth instanceof TokenAuthManager)) {
116
+ throw new Error('signup() requires token-based auth (the default)');
117
+ }
118
+ const wallet = await deriveWallet({
119
+ username: params.username,
120
+ password: params.password
121
+ });
122
+ const nonce = await this._getNonce(wallet.address);
123
+ const signature = await signSignup(
124
+ wallet,
125
+ {
126
+ appid: this._client.appId,
127
+ username: params.username,
128
+ email: params.email,
129
+ subscribe: !!params.subscribe,
130
+ nonce
131
+ },
132
+ this._walletNetwork
133
+ );
134
+ const appSource = params.appSource?.trim() || this._client.appSource;
135
+ const res = await this._client.rest.post<ApiResponse<LoginData>>('/v1/account/create', {
136
+ walletAddress: wallet.address,
137
+ username: params.username,
138
+ email: params.email,
139
+ subscribe: !!params.subscribe,
140
+ turnstileToken: params.turnstileToken,
141
+ ...(params.referralCode ? { referralCode: params.referralCode } : {}),
142
+ ...(appSource ? { appSource } : {}),
143
+ signature
144
+ });
145
+ await auth.authenticate({
146
+ token: res.data.token,
147
+ refreshToken: res.data.refreshToken
148
+ });
149
+ return res.data;
150
+ }
151
+
152
+ /** Fetch the current user's profile data from REST. Updates the snapshot. */
153
+ async me(): Promise<MeData> {
154
+ const res = await this._client.rest.get<ApiResponse<MeData>>('/v1/account/me');
155
+ this._update({
156
+ username: res.data.username,
157
+ email: res.data.currentEmail,
158
+ walletAddress: res.data.walletAddress
159
+ });
160
+ return res.data;
161
+ }
162
+
163
+ /**
164
+ * Force-refresh the current user's balance from REST. Balance also updates
165
+ * automatically via socket events — call this only when you need a synchronous
166
+ * fetch (e.g., on screen mount before the socket has reconnected).
167
+ */
168
+ async refreshBalance(): Promise<Balances> {
169
+ const res = await this._client.rest.get<ApiResponse<Balances>>('/v4/account/balance');
170
+ this._update({ balance: res.data });
171
+ return res.data;
172
+ }
173
+
174
+ /**
175
+ * Log out and clear all auth state. Closes the WebSocket and removes any
176
+ * persisted tokens. Safe to call even if not authenticated.
177
+ */
178
+ async logout(): Promise<void> {
179
+ try {
180
+ await this._client.rest.post('/v1/account/logout');
181
+ } catch (e) {
182
+ if (e instanceof ApiError && e.status === 401) {
183
+ this._client.logger.warn('Logout call rejected — probably already logged out');
184
+ } else {
185
+ throw e;
186
+ }
187
+ }
188
+ this._client.auth.clear();
189
+ }
190
+
191
+ private async _getNonce(walletAddress: string): Promise<string> {
192
+ const res = await this._client.rest.post<ApiResponse<{ nonce: string }>>('/v1/account/nonce', {
193
+ walletAddress
194
+ });
195
+ return res.data.nonce;
196
+ }
197
+
198
+ private _update(partial: Partial<AccountSnapshot>) {
199
+ const next: AccountSnapshot = { ...this._snapshot, ...partial };
200
+ if (shallowEqual(next, this._snapshot)) return;
201
+ this._snapshot = next;
202
+ this.emit('change', this._snapshot);
203
+ }
204
+ }
205
+
206
+ function shallowEqual<T extends object>(a: T, b: T): boolean {
207
+ const keys = Object.keys(a) as (keyof T)[];
208
+ for (const k of keys) {
209
+ if (a[k] !== b[k]) return false;
210
+ }
211
+ return true;
212
+ }
213
+
214
+ export default AccountApi;
@@ -0,0 +1,61 @@
1
+ import { Balances } from '../ApiClient/WebSocketClient/events';
2
+ import { SupernetType } from '../ApiClient/WebSocketClient/types';
3
+
4
+ export type { Balances };
5
+
6
+ export interface MeData {
7
+ currentEmail: string;
8
+ username: string;
9
+ walletAddress: string;
10
+ emailVerified?: boolean;
11
+ discord2FA?: boolean;
12
+ discordLinked?: boolean;
13
+ discordServerMember?: boolean;
14
+ discordUsername?: string;
15
+ requestedUpdatedEmail?: string;
16
+ }
17
+
18
+ export interface LoginData {
19
+ token: string;
20
+ refreshToken: string;
21
+ username: string;
22
+ }
23
+
24
+ export interface SignupParams {
25
+ username: string;
26
+ email: string;
27
+ password: string;
28
+ /** Subscribe to product updates / newsletter. */
29
+ subscribe?: boolean;
30
+ /** Optional referral code provided to the user. */
31
+ referralCode?: string;
32
+ /** Optional Cloudflare Turnstile captcha token, required by the server. */
33
+ turnstileToken: string;
34
+ /** Optional app source label for signup attribution. */
35
+ appSource?: string;
36
+ }
37
+
38
+ export interface AccountSnapshot {
39
+ authenticated: boolean;
40
+ networkStatus: 'connected' | 'disconnected' | 'connecting';
41
+ network: SupernetType | null;
42
+ balance: Balances;
43
+ walletAddress: string | null;
44
+ username: string | null;
45
+ email: string | null;
46
+ }
47
+
48
+ export function emptyAccountSnapshot(): AccountSnapshot {
49
+ return {
50
+ authenticated: false,
51
+ networkStatus: 'disconnected',
52
+ network: null,
53
+ balance: {
54
+ sogni: { settled: '0', credit: '0', debit: '0', net: '0' },
55
+ spark: { settled: '0', credit: '0', debit: '0', net: '0', premiumCredit: '0' }
56
+ },
57
+ walletAddress: null,
58
+ username: null,
59
+ email: null
60
+ };
61
+ }