@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,67 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const ApiClient_1 = require("../ApiClient");
7
+ const TypedEventEmitter_1 = __importDefault(require("./TypedEventEmitter"));
8
+ const REQUEST_TIMEOUT_MS = 30000;
9
+ class RestClient extends TypedEventEmitter_1.default {
10
+ constructor(baseUrl, auth, logger) {
11
+ super();
12
+ this.baseUrl = baseUrl;
13
+ this._auth = auth;
14
+ this._logger = logger;
15
+ }
16
+ get auth() {
17
+ return this._auth;
18
+ }
19
+ formatUrl(relativeUrl, query = {}) {
20
+ const url = new URL(relativeUrl, this.baseUrl);
21
+ Object.keys(query).forEach((key) => {
22
+ url.searchParams.append(key, query[key]);
23
+ });
24
+ return url.toString();
25
+ }
26
+ async request(url, options = {}) {
27
+ const init = await this.auth.authenticateRequest(options);
28
+ const controller = new AbortController();
29
+ const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
30
+ try {
31
+ const response = await fetch(url, { ...init, signal: controller.signal });
32
+ return this.processResponse(response);
33
+ }
34
+ finally {
35
+ clearTimeout(timeoutId);
36
+ }
37
+ }
38
+ async processResponse(response) {
39
+ let responseData;
40
+ try {
41
+ responseData = await response.json();
42
+ }
43
+ catch (e) {
44
+ this._logger.error('Failed to parse response:', e);
45
+ throw new Error('Failed to parse response');
46
+ }
47
+ if (response.status === 401 && this.auth.isAuthenticated) {
48
+ this.auth.clear();
49
+ }
50
+ if (!response.ok) {
51
+ throw new ApiClient_1.ApiError(response.status, responseData);
52
+ }
53
+ return responseData;
54
+ }
55
+ get(path, query = {}) {
56
+ return this.request(this.formatUrl(path, query));
57
+ }
58
+ post(path, body = {}) {
59
+ return this.request(this.formatUrl(path), {
60
+ method: 'POST',
61
+ headers: { 'Content-Type': 'application/json' },
62
+ body: JSON.stringify(body)
63
+ });
64
+ }
65
+ }
66
+ exports.default = RestClient;
67
+ //# sourceMappingURL=RestClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RestClient.js","sourceRoot":"","sources":["../../../src/lib/RestClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface EventMap {
2
+ [event: string]: any;
3
+ }
4
+ export type EventListener<D> = (data: D) => void;
5
+ declare abstract class TypedEventEmitter<E extends EventMap> {
6
+ protected listeners: {
7
+ [K in keyof E]?: EventListener<E[K]>[];
8
+ };
9
+ on<T extends keyof E>(event: T, listener: EventListener<E[T]>): () => void;
10
+ once<T extends keyof E>(event: T, listener: EventListener<E[T]>): () => void;
11
+ off<T extends keyof E>(event: T, listener: EventListener<E[T]>): void;
12
+ removeAllListeners<T extends keyof E>(event?: T): void;
13
+ protected emit<T extends keyof E>(event: T, data: E[T]): void;
14
+ }
15
+ export default TypedEventEmitter;
16
+ //# sourceMappingURL=TypedEventEmitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypedEventEmitter.d.ts","sourceRoot":"","sources":["../../../src/lib/TypedEventEmitter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAEjD,uBAAe,iBAAiB,CAAC,CAAC,SAAS,QAAQ;IACjD,SAAS,CAAC,SAAS,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;KAAE,CAAM;IAErE,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAU7D,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAQ/D,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAO9D,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;IAQ/C,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;CAOvD;AAED,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class TypedEventEmitter {
4
+ constructor() {
5
+ this.listeners = {};
6
+ }
7
+ on(event, listener) {
8
+ if (!this.listeners[event]) {
9
+ this.listeners[event] = [];
10
+ }
11
+ this.listeners[event].push(listener);
12
+ return () => {
13
+ this.off(event, listener);
14
+ };
15
+ }
16
+ once(event, listener) {
17
+ const remove = this.on(event, (data) => {
18
+ remove();
19
+ listener(data);
20
+ });
21
+ return remove;
22
+ }
23
+ off(event, listener) {
24
+ if (!this.listeners[event]) {
25
+ return;
26
+ }
27
+ this.listeners[event] = this.listeners[event].filter((l) => l !== listener);
28
+ }
29
+ removeAllListeners(event) {
30
+ if (event) {
31
+ delete this.listeners[event];
32
+ }
33
+ else {
34
+ this.listeners = {};
35
+ }
36
+ }
37
+ emit(event, data) {
38
+ const listeners = this.listeners[event];
39
+ if (!listeners) {
40
+ return;
41
+ }
42
+ listeners.forEach((listener) => listener(data));
43
+ }
44
+ }
45
+ exports.default = TypedEventEmitter;
46
+ //# sourceMappingURL=TypedEventEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypedEventEmitter.js","sourceRoot":"","sources":["../../../src/lib/TypedEventEmitter.ts"],"names":[],"mappings":";;AAMA,MAAe,iBAAiB;IAAhC;QACY,cAAS,GAA+C,EAAE,CAAC;IA0CvE,CAAC;IAxCC,EAAE,CAAoB,KAAQ,EAAE,QAA6B;QAC3D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CAAoB,KAAQ,EAAE,QAA6B;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;YACrC,MAAM,EAAE,CAAC;YACT,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,GAAG,CAAoB,KAAQ,EAAE,QAA6B;QAC5D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;IAC/E,CAAC;IAED,kBAAkB,CAAoB,KAAS;QAC7C,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAES,IAAI,CAAoB,KAAQ,EAAE,IAAU;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;CACF;AAED,kBAAe,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function base64Encode(str: string): string;
2
+ export declare function base64Decode(str: string): string;
3
+ //# sourceMappingURL=base64.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../../src/lib/base64.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAShD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKhD"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.base64Encode = base64Encode;
4
+ exports.base64Decode = base64Decode;
5
+ function base64Encode(str) {
6
+ const encoder = new TextEncoder();
7
+ const uint8Array = encoder.encode(str);
8
+ const chunkSize = 8192;
9
+ let binaryString = '';
10
+ for (let i = 0; i < uint8Array.length; i += chunkSize) {
11
+ binaryString += String.fromCharCode(...uint8Array.subarray(i, i + chunkSize));
12
+ }
13
+ return btoa(binaryString);
14
+ }
15
+ function base64Decode(str) {
16
+ const binaryString = atob(str);
17
+ const binaryArray = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));
18
+ const decoder = new TextDecoder();
19
+ return decoder.decode(binaryArray);
20
+ }
21
+ //# sourceMappingURL=base64.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../../src/lib/base64.ts"],"names":[],"mappings":";;AAAA,oCASC;AAED,oCAKC;AAhBD,SAAgB,YAAY,CAAC,GAAW;IACtC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC;IACvB,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACtD,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC;AAC5B,CAAC;AAED,SAAgB,YAAY,CAAC,GAAW;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,OAAO,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Generate a v4 UUID using crypto.getRandomValues, returned in uppercase form.
3
+ *
4
+ * Mac workers in the Sogni Supernet use uppercase UUIDs; the SDK keeps that
5
+ * convention end-to-end so wire-level comparisons stay simple.
6
+ *
7
+ * Requires `crypto.getRandomValues` (polyfilled in Expo via
8
+ * `expo-standard-web-crypto/polyfill`). SogniClient.create() verifies the
9
+ * polyfill is present and throws a clear error otherwise.
10
+ */
11
+ export default function getUUID(): string;
12
+ //# sourceMappingURL=getUUID.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getUUID.d.ts","sourceRoot":"","sources":["../../../src/lib/getUUID.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,IAAI,MAAM,CAgBxC"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = getUUID;
4
+ /**
5
+ * Generate a v4 UUID using crypto.getRandomValues, returned in uppercase form.
6
+ *
7
+ * Mac workers in the Sogni Supernet use uppercase UUIDs; the SDK keeps that
8
+ * convention end-to-end so wire-level comparisons stay simple.
9
+ *
10
+ * Requires `crypto.getRandomValues` (polyfilled in Expo via
11
+ * `expo-standard-web-crypto/polyfill`). SogniClient.create() verifies the
12
+ * polyfill is present and throws a clear error otherwise.
13
+ */
14
+ function getUUID() {
15
+ const bytes = crypto.getRandomValues(new Uint8Array(16));
16
+ bytes[6] = (bytes[6] & 0x0f) | 0x40;
17
+ bytes[8] = (bytes[8] & 0x3f) | 0x80;
18
+ const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
19
+ return (hex.slice(0, 8) +
20
+ '-' +
21
+ hex.slice(8, 12) +
22
+ '-' +
23
+ hex.slice(12, 16) +
24
+ '-' +
25
+ hex.slice(16, 20) +
26
+ '-' +
27
+ hex.slice(20)).toUpperCase();
28
+ }
29
+ //# sourceMappingURL=getUUID.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getUUID.js","sourceRoot":"","sources":["../../../src/lib/getUUID.ts"],"names":[],"mappings":";;AAUA,0BAgBC;AA1BD;;;;;;;;;GASG;AACH,SAAwB,OAAO;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/E,OAAO,CACL,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACf,GAAG;QACH,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAChB,GAAG;QACH,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC;QACjB,GAAG;QACH,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC;QACjB,GAAG;QACH,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CACd,CAAC,WAAW,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Image / media inputs accepted by the SDK.
3
+ *
4
+ * The `{uri, type, name}` shape matches what `expo-image-picker`,
5
+ * `expo-document-picker`, `react-native-image-picker`, and most other
6
+ * RN media pickers return — pass `result.assets[0]` straight to the SDK.
7
+ *
8
+ * `Uint8Array` is an escape hatch for callers that already have bytes
9
+ * (e.g., from `expo-file-system` or a canvas snapshot).
10
+ */
11
+ export type MediaInput = MediaInputUri | Uint8Array;
12
+ export interface MediaInputUri {
13
+ uri: string;
14
+ type?: string;
15
+ name?: string;
16
+ }
17
+ export declare function isMediaInputUri(input: MediaInput): input is MediaInputUri;
18
+ export interface MediaInputBody {
19
+ body: BodyInit;
20
+ contentType: string | undefined;
21
+ }
22
+ /**
23
+ * Convert a MediaInput into a fetch body for upload to a presigned PUT URL.
24
+ *
25
+ * For URI inputs: reads the file via fetch(uri).blob(), so it works with
26
+ * `file://`, `content://`, `ph://`, and `http(s)://` URIs.
27
+ *
28
+ * For Uint8Array inputs: passes the bytes through. Caller must provide
29
+ * the correct Content-Type via the `contentType` parameter; we cannot
30
+ * reliably detect MIME from raw bytes in all cases.
31
+ */
32
+ export declare function toFetchBody(input: MediaInput, contentTypeOverride?: string): Promise<MediaInputBody>;
33
+ //# sourceMappingURL=mediaInput.d.ts.map
@@ -0,0 +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;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,UAAU,EACjB,mBAAmB,CAAC,EAAE,MAAM,GAC3B,OAAO,CAAC,cAAc,CAAC,CAazB"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isMediaInputUri = isMediaInputUri;
4
+ exports.toFetchBody = toFetchBody;
5
+ function isMediaInputUri(input) {
6
+ return typeof input === 'object' && 'uri' in input;
7
+ }
8
+ /**
9
+ * Convert a MediaInput into a fetch body for upload to a presigned PUT URL.
10
+ *
11
+ * For URI inputs: reads the file via fetch(uri).blob(), so it works with
12
+ * `file://`, `content://`, `ph://`, and `http(s)://` URIs.
13
+ *
14
+ * For Uint8Array inputs: passes the bytes through. Caller must provide
15
+ * the correct Content-Type via the `contentType` parameter; we cannot
16
+ * reliably detect MIME from raw bytes in all cases.
17
+ */
18
+ async function toFetchBody(input, contentTypeOverride) {
19
+ if (input instanceof Uint8Array) {
20
+ return { body: input, contentType: contentTypeOverride };
21
+ }
22
+ const res = await fetch(input.uri);
23
+ if (!res.ok) {
24
+ throw new Error(`Failed to read media at ${input.uri}: HTTP ${res.status}`);
25
+ }
26
+ const blob = await res.blob();
27
+ return {
28
+ body: blob,
29
+ contentType: contentTypeOverride ?? input.type ?? blob.type ?? undefined
30
+ };
31
+ }
32
+ //# sourceMappingURL=mediaInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediaInput.js","sourceRoot":"","sources":["../../../src/lib/mediaInput.ts"],"names":[],"mappings":";;AAkBA,0CAEC;AAiBD,kCAgBC;AAnCD,SAAgB,eAAe,CAAC,KAAiB;IAC/C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC;AACrD,CAAC;AAOD;;;;;;;;;GASG;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,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,10 @@
1
+ export declare function decodeToken(token: string): {
2
+ walletAddress: string;
3
+ expiresAt: Date;
4
+ };
5
+ export declare function decodeRefreshToken(token: string): {
6
+ env: string;
7
+ expiresAt: Date;
8
+ };
9
+ export declare function delay(ms: number): Promise<unknown>;
10
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM;;;EAMxC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM;;;EAM/C;AAED,wBAAsB,KAAK,CAAC,EAAE,EAAE,MAAM,oBAErC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.decodeToken = decodeToken;
4
+ exports.decodeRefreshToken = decodeRefreshToken;
5
+ exports.delay = delay;
6
+ const jwt_decode_1 = require("jwt-decode");
7
+ function decodeToken(token) {
8
+ const data = (0, jwt_decode_1.jwtDecode)(token);
9
+ return {
10
+ walletAddress: data.addr,
11
+ expiresAt: new Date(data.exp * 1000)
12
+ };
13
+ }
14
+ function decodeRefreshToken(token) {
15
+ const data = (0, jwt_decode_1.jwtDecode)(token);
16
+ return {
17
+ env: data.env,
18
+ expiresAt: new Date(data.exp * 1000)
19
+ };
20
+ }
21
+ async function delay(ms) {
22
+ return new Promise((resolve) => setTimeout(resolve, ms));
23
+ }
24
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":";;AAEA,kCAMC;AAED,gDAMC;AAED,sBAEC;AApBD,2CAAuC;AAEvC,SAAgB,WAAW,CAAC,KAAa;IACvC,MAAM,IAAI,GAAG,IAAA,sBAAS,EAA0D,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,SAAgB,kBAAkB,CAAC,KAAa;IAC9C,MAAM,IAAI,GAAG,IAAA,sBAAS,EAA0D,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;AAEM,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,7 @@
1
+ interface ErrorData {
2
+ code: number;
3
+ originalCode?: string;
4
+ message: string;
5
+ }
6
+ export default ErrorData;
7
+ //# sourceMappingURL=ErrorData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorData.d.ts","sourceRoot":"","sources":["../../../src/types/ErrorData.ts"],"names":[],"mappings":"AAAA,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAe,SAAS,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ErrorData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorData.js","sourceRoot":"","sources":["../../../src/types/ErrorData.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export type JSONValue = undefined | null | string | number | boolean | JSONObject | JSONArray;
2
+ export type JSONObject = {
3
+ [x: string]: JSONValue;
4
+ };
5
+ export type JSONArray = Array<JSONValue>;
6
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/types/json.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAE9F,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# 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 type TokenType = 'sogni' | 'spark';
2
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/types/token.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# 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 declare const LIB_VERSION = "0.1.0";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,UAAU,CAAC"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LIB_VERSION = void 0;
4
+ exports.LIB_VERSION = '0.1.0';
5
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG,OAAO,CAAC"}
@@ -0,0 +1,59 @@
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 type { Hex } from 'viem';
15
+ export { LIB_VERSION } from './version';
16
+ /** A Sogni wallet — private key plus its derived Ethereum-style address. */
17
+ export interface Wallet {
18
+ privateKey: Hex;
19
+ address: Hex;
20
+ }
21
+ /** Network the wallet's signatures target. Affects the EIP-712 domain. */
22
+ export type WalletNetwork = 'mainnet' | 'testnet';
23
+ /**
24
+ * Derive a deterministic wallet from a username + password using PBKDF2
25
+ * (10,000 iterations of SHA-256, salt = username, output = 32 bytes).
26
+ *
27
+ * Uses @noble/hashes pure-JS implementation rather than `crypto.subtle`
28
+ * because Hermes / expo-standard-web-crypto don't polyfill subtle. Still
29
+ * async-returning so callers don't depend on the implementation detail.
30
+ *
31
+ * The same credentials always produce the same wallet on every device,
32
+ * which is how Sogni's username+password login works without ever
33
+ * transmitting or storing the password server-side.
34
+ */
35
+ export declare function deriveWallet(input: {
36
+ username: string;
37
+ password: string;
38
+ }): Promise<Wallet>;
39
+ /** Generate a fresh random wallet (uses crypto.getRandomValues internally). */
40
+ export declare function createRandomWallet(): Wallet;
41
+ /**
42
+ * Sign the Authentication EIP-712 message used by `/v1/account/login` and
43
+ * other authenticated REST endpoints.
44
+ */
45
+ export declare function signAuthentication(wallet: Wallet, params: {
46
+ nonce: string;
47
+ }, network?: WalletNetwork): Promise<Hex>;
48
+ /**
49
+ * Sign the Signup EIP-712 message used by `/v1/account/create`. The
50
+ * `subscribe` boolean is encoded as a uint256 (0/1) on the wire.
51
+ */
52
+ export declare function signSignup(wallet: Wallet, params: {
53
+ appid: string;
54
+ username: string;
55
+ email: string;
56
+ subscribe: boolean;
57
+ nonce: string;
58
+ }, network?: WalletNetwork): Promise<Hex>;
59
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/wallet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAEhC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,4EAA4E;AAC5E,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,GAAG,CAAC;IAChB,OAAO,EAAE,GAAG,CAAC;CACd;AAED,0EAA0E;AAC1E,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,CAAC;AA6ClD;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAWjG;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,IAAI,MAAM,CAI3C;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EACzB,OAAO,GAAE,aAAyB,GACjC,OAAO,CAAC,GAAG,CAAC,CAQd;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;IACN,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,EACD,OAAO,GAAE,aAAyB,GACjC,OAAO,CAAC,GAAG,CAAC,CAed"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ /**
3
+ * Wallet creation and EIP-712 signing for Sogni authentication.
4
+ *
5
+ * Importable as a separate entry point so consumers using only API-key auth
6
+ * do not bundle viem:
7
+ *
8
+ * import { deriveWallet, signAuthentication } from '@sogni-ai/expo-client/wallet';
9
+ *
10
+ * Requires `crypto.getRandomValues` (for fresh wallet generation), which the
11
+ * `polyfillWebCrypto()` call from `expo-standard-web-crypto` provides. PBKDF2
12
+ * for username+password derivation is done in pure JS via @noble/hashes, so
13
+ * no `crypto.subtle` is needed (Expo doesn't polyfill it).
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.LIB_VERSION = void 0;
17
+ exports.deriveWallet = deriveWallet;
18
+ exports.createRandomWallet = createRandomWallet;
19
+ exports.signAuthentication = signAuthentication;
20
+ exports.signSignup = signSignup;
21
+ const pbkdf2_1 = require("@noble/hashes/pbkdf2");
22
+ const sha2_1 = require("@noble/hashes/sha2");
23
+ const accounts_1 = require("viem/accounts");
24
+ var version_1 = require("./version");
25
+ Object.defineProperty(exports, "LIB_VERSION", { enumerable: true, get: function () { return version_1.LIB_VERSION; } });
26
+ const PLACEHOLDER_VERIFYING_CONTRACT = '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC';
27
+ function getDomain(network) {
28
+ return network === 'testnet'
29
+ ? {
30
+ name: 'Sogni-testnet',
31
+ version: '1',
32
+ chainId: 84532,
33
+ verifyingContract: PLACEHOLDER_VERIFYING_CONTRACT
34
+ }
35
+ : {
36
+ name: 'Sogni AI',
37
+ version: '1',
38
+ chainId: 8453,
39
+ verifyingContract: PLACEHOLDER_VERIFYING_CONTRACT
40
+ };
41
+ }
42
+ const AUTH_TYPES = {
43
+ Authentication: [
44
+ { name: 'walletAddress', type: 'address' },
45
+ { name: 'nonce', type: 'string' }
46
+ ]
47
+ };
48
+ const SIGNUP_TYPES = {
49
+ Signup: [
50
+ { name: 'appid', type: 'string' },
51
+ { name: 'username', type: 'string' },
52
+ { name: 'email', type: 'string' },
53
+ { name: 'subscribe', type: 'uint256' },
54
+ { name: 'walletAddress', type: 'address' },
55
+ { name: 'nonce', type: 'string' }
56
+ ]
57
+ };
58
+ /**
59
+ * Derive a deterministic wallet from a username + password using PBKDF2
60
+ * (10,000 iterations of SHA-256, salt = username, output = 32 bytes).
61
+ *
62
+ * Uses @noble/hashes pure-JS implementation rather than `crypto.subtle`
63
+ * because Hermes / expo-standard-web-crypto don't polyfill subtle. Still
64
+ * async-returning so callers don't depend on the implementation detail.
65
+ *
66
+ * The same credentials always produce the same wallet on every device,
67
+ * which is how Sogni's username+password login works without ever
68
+ * transmitting or storing the password server-side.
69
+ */
70
+ async function deriveWallet(input) {
71
+ const { username, password } = input;
72
+ if (!username || !password) {
73
+ throw new Error('deriveWallet requires both username and password');
74
+ }
75
+ const passwordBytes = new TextEncoder().encode(password);
76
+ const saltBytes = new TextEncoder().encode(username);
77
+ const bits = (0, pbkdf2_1.pbkdf2)(sha2_1.sha256, passwordBytes, saltBytes, { c: 10000, dkLen: 32 });
78
+ const privateKey = bytesToHex(bits);
79
+ const account = (0, accounts_1.privateKeyToAccount)(privateKey);
80
+ return { privateKey, address: account.address };
81
+ }
82
+ /** Generate a fresh random wallet (uses crypto.getRandomValues internally). */
83
+ function createRandomWallet() {
84
+ const privateKey = (0, accounts_1.generatePrivateKey)();
85
+ const account = (0, accounts_1.privateKeyToAccount)(privateKey);
86
+ return { privateKey, address: account.address };
87
+ }
88
+ /**
89
+ * Sign the Authentication EIP-712 message used by `/v1/account/login` and
90
+ * other authenticated REST endpoints.
91
+ */
92
+ async function signAuthentication(wallet, params, network = 'mainnet') {
93
+ const account = (0, accounts_1.privateKeyToAccount)(wallet.privateKey);
94
+ return account.signTypedData({
95
+ domain: getDomain(network),
96
+ types: AUTH_TYPES,
97
+ primaryType: 'Authentication',
98
+ message: { walletAddress: wallet.address, nonce: params.nonce }
99
+ });
100
+ }
101
+ /**
102
+ * Sign the Signup EIP-712 message used by `/v1/account/create`. The
103
+ * `subscribe` boolean is encoded as a uint256 (0/1) on the wire.
104
+ */
105
+ async function signSignup(wallet, params, network = 'mainnet') {
106
+ const account = (0, accounts_1.privateKeyToAccount)(wallet.privateKey);
107
+ return account.signTypedData({
108
+ domain: getDomain(network),
109
+ types: SIGNUP_TYPES,
110
+ primaryType: 'Signup',
111
+ message: {
112
+ appid: params.appid,
113
+ username: params.username,
114
+ email: params.email,
115
+ subscribe: BigInt(params.subscribe ? 1 : 0),
116
+ walletAddress: wallet.address,
117
+ nonce: params.nonce
118
+ }
119
+ });
120
+ }
121
+ function bytesToHex(bytes) {
122
+ const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
123
+ return `0x${hex}`;
124
+ }
125
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/wallet.ts"],"names":[],"mappings":"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"}