@sogni-ai/expo-client 1.0.0-alpha.2
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 +13 -0
- package/README.md +87 -0
- package/dist/cjs/Account/index.d.ts +39 -0
- package/dist/cjs/Account/index.d.ts.map +1 -0
- package/dist/cjs/Account/index.js +111 -0
- package/dist/cjs/Account/index.js.map +1 -0
- package/dist/cjs/Account/types.d.ts +25 -0
- package/dist/cjs/Account/types.d.ts.map +1 -0
- package/dist/cjs/Account/types.js +18 -0
- package/dist/cjs/Account/types.js.map +1 -0
- package/dist/cjs/ApiClient/WebSocketClient/events.d.ts +51 -0
- package/dist/cjs/ApiClient/WebSocketClient/events.d.ts.map +1 -0
- package/dist/cjs/ApiClient/WebSocketClient/events.js +3 -0
- package/dist/cjs/ApiClient/WebSocketClient/events.js.map +1 -0
- package/dist/cjs/ApiClient/WebSocketClient/index.d.ts +34 -0
- package/dist/cjs/ApiClient/WebSocketClient/index.d.ts.map +1 -0
- package/dist/cjs/ApiClient/WebSocketClient/index.js +183 -0
- package/dist/cjs/ApiClient/WebSocketClient/index.js.map +1 -0
- package/dist/cjs/ApiClient/WebSocketClient/normalize.d.ts +24 -0
- package/dist/cjs/ApiClient/WebSocketClient/normalize.d.ts.map +1 -0
- package/dist/cjs/ApiClient/WebSocketClient/normalize.js +87 -0
- package/dist/cjs/ApiClient/WebSocketClient/normalize.js.map +1 -0
- package/dist/cjs/ApiClient/WebSocketClient/types.d.ts +9 -0
- package/dist/cjs/ApiClient/WebSocketClient/types.d.ts.map +1 -0
- package/dist/cjs/ApiClient/WebSocketClient/types.js +3 -0
- package/dist/cjs/ApiClient/WebSocketClient/types.js.map +1 -0
- package/dist/cjs/ApiClient/WebSocketClient/wireTypes.d.ts +61 -0
- package/dist/cjs/ApiClient/WebSocketClient/wireTypes.d.ts.map +1 -0
- package/dist/cjs/ApiClient/WebSocketClient/wireTypes.js +11 -0
- package/dist/cjs/ApiClient/WebSocketClient/wireTypes.js.map +1 -0
- package/dist/cjs/ApiClient/index.d.ts +57 -0
- package/dist/cjs/ApiClient/index.d.ts.map +1 -0
- package/dist/cjs/ApiClient/index.js +75 -0
- package/dist/cjs/ApiClient/index.js.map +1 -0
- package/dist/cjs/index.d.ts +55 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +108 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lib/AuthManager/ApiKeyAuthManager.d.ts +15 -0
- package/dist/cjs/lib/AuthManager/ApiKeyAuthManager.d.ts.map +1 -0
- package/dist/cjs/lib/AuthManager/ApiKeyAuthManager.js +47 -0
- package/dist/cjs/lib/AuthManager/ApiKeyAuthManager.js.map +1 -0
- package/dist/cjs/lib/AuthManager/AuthManagerBase.d.ts +23 -0
- package/dist/cjs/lib/AuthManager/AuthManagerBase.d.ts.map +1 -0
- package/dist/cjs/lib/AuthManager/AuthManagerBase.js +14 -0
- package/dist/cjs/lib/AuthManager/AuthManagerBase.js.map +1 -0
- package/dist/cjs/lib/AuthManager/AuthStorage.d.ts +11 -0
- package/dist/cjs/lib/AuthManager/AuthStorage.d.ts.map +1 -0
- package/dist/cjs/lib/AuthManager/AuthStorage.js +50 -0
- package/dist/cjs/lib/AuthManager/AuthStorage.js.map +1 -0
- package/dist/cjs/lib/AuthManager/TokenAuthManager.d.ts +35 -0
- package/dist/cjs/lib/AuthManager/TokenAuthManager.d.ts.map +1 -0
- package/dist/cjs/lib/AuthManager/TokenAuthManager.js +164 -0
- package/dist/cjs/lib/AuthManager/TokenAuthManager.js.map +1 -0
- package/dist/cjs/lib/AuthManager/index.d.ts +7 -0
- package/dist/cjs/lib/AuthManager/index.d.ts.map +1 -0
- package/dist/cjs/lib/AuthManager/index.js +13 -0
- package/dist/cjs/lib/AuthManager/index.js.map +1 -0
- package/dist/cjs/lib/Cache.d.ts +12 -0
- package/dist/cjs/lib/Cache.d.ts.map +1 -0
- package/dist/cjs/lib/Cache.js +36 -0
- package/dist/cjs/lib/Cache.js.map +1 -0
- package/dist/cjs/lib/DefaultLogger.d.ts +17 -0
- package/dist/cjs/lib/DefaultLogger.d.ts.map +1 -0
- package/dist/cjs/lib/DefaultLogger.js +36 -0
- package/dist/cjs/lib/DefaultLogger.js.map +1 -0
- package/dist/cjs/lib/RestClient.d.ts +18 -0
- package/dist/cjs/lib/RestClient.d.ts.map +1 -0
- package/dist/cjs/lib/RestClient.js +67 -0
- package/dist/cjs/lib/RestClient.js.map +1 -0
- package/dist/cjs/lib/TypedEventEmitter.d.ts +16 -0
- package/dist/cjs/lib/TypedEventEmitter.d.ts.map +1 -0
- package/dist/cjs/lib/TypedEventEmitter.js +46 -0
- package/dist/cjs/lib/TypedEventEmitter.js.map +1 -0
- package/dist/cjs/lib/base64.d.ts +3 -0
- package/dist/cjs/lib/base64.d.ts.map +1 -0
- package/dist/cjs/lib/base64.js +21 -0
- package/dist/cjs/lib/base64.js.map +1 -0
- package/dist/cjs/lib/getUUID.d.ts +12 -0
- package/dist/cjs/lib/getUUID.d.ts.map +1 -0
- package/dist/cjs/lib/getUUID.js +29 -0
- package/dist/cjs/lib/getUUID.js.map +1 -0
- package/dist/cjs/lib/utils.d.ts +10 -0
- package/dist/cjs/lib/utils.d.ts.map +1 -0
- package/dist/cjs/lib/utils.js +24 -0
- package/dist/cjs/lib/utils.js.map +1 -0
- package/dist/cjs/types/ErrorData.d.ts +7 -0
- package/dist/cjs/types/ErrorData.d.ts.map +1 -0
- package/dist/cjs/types/ErrorData.js +3 -0
- package/dist/cjs/types/ErrorData.js.map +1 -0
- package/dist/cjs/types/json.d.ts +6 -0
- package/dist/cjs/types/json.d.ts.map +1 -0
- package/dist/cjs/types/json.js +3 -0
- package/dist/cjs/types/json.js.map +1 -0
- package/dist/cjs/types/token.d.ts +2 -0
- package/dist/cjs/types/token.d.ts.map +1 -0
- package/dist/cjs/types/token.js +3 -0
- package/dist/cjs/types/token.js.map +1 -0
- package/dist/cjs/version.d.ts +2 -0
- package/dist/cjs/version.d.ts.map +1 -0
- package/dist/cjs/version.js +5 -0
- package/dist/cjs/version.js.map +1 -0
- package/dist/cjs/wallet.d.ts +6 -0
- package/dist/cjs/wallet.d.ts.map +1 -0
- package/dist/cjs/wallet.js +6 -0
- package/dist/cjs/wallet.js.map +1 -0
- package/dist/esm/Account/index.js +106 -0
- package/dist/esm/Account/index.js.map +1 -0
- package/dist/esm/Account/types.js +15 -0
- package/dist/esm/Account/types.js.map +1 -0
- package/dist/esm/ApiClient/WebSocketClient/events.js +2 -0
- package/dist/esm/ApiClient/WebSocketClient/events.js.map +1 -0
- package/dist/esm/ApiClient/WebSocketClient/index.js +178 -0
- package/dist/esm/ApiClient/WebSocketClient/index.js.map +1 -0
- package/dist/esm/ApiClient/WebSocketClient/normalize.js +81 -0
- package/dist/esm/ApiClient/WebSocketClient/normalize.js.map +1 -0
- package/dist/esm/ApiClient/WebSocketClient/types.js +2 -0
- package/dist/esm/ApiClient/WebSocketClient/types.js.map +1 -0
- package/dist/esm/ApiClient/WebSocketClient/wireTypes.js +10 -0
- package/dist/esm/ApiClient/WebSocketClient/wireTypes.js.map +1 -0
- package/dist/esm/ApiClient/index.js +68 -0
- package/dist/esm/ApiClient/index.js.map +1 -0
- package/dist/esm/index.js +66 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/AuthManager/ApiKeyAuthManager.js +42 -0
- package/dist/esm/lib/AuthManager/ApiKeyAuthManager.js.map +1 -0
- package/dist/esm/lib/AuthManager/AuthManagerBase.js +9 -0
- package/dist/esm/lib/AuthManager/AuthManagerBase.js.map +1 -0
- package/dist/esm/lib/AuthManager/AuthStorage.js +13 -0
- package/dist/esm/lib/AuthManager/AuthStorage.js.map +1 -0
- package/dist/esm/lib/AuthManager/TokenAuthManager.js +159 -0
- package/dist/esm/lib/AuthManager/TokenAuthManager.js.map +1 -0
- package/dist/esm/lib/AuthManager/index.js +5 -0
- package/dist/esm/lib/AuthManager/index.js.map +1 -0
- package/dist/esm/lib/Cache.js +33 -0
- package/dist/esm/lib/Cache.js.map +1 -0
- package/dist/esm/lib/DefaultLogger.js +32 -0
- package/dist/esm/lib/DefaultLogger.js.map +1 -0
- package/dist/esm/lib/RestClient.js +62 -0
- package/dist/esm/lib/RestClient.js.map +1 -0
- package/dist/esm/lib/TypedEventEmitter.js +44 -0
- package/dist/esm/lib/TypedEventEmitter.js.map +1 -0
- package/dist/esm/lib/base64.js +17 -0
- package/dist/esm/lib/base64.js.map +1 -0
- package/dist/esm/lib/getUUID.js +26 -0
- package/dist/esm/lib/getUUID.js.map +1 -0
- package/dist/esm/lib/utils.js +19 -0
- package/dist/esm/lib/utils.js.map +1 -0
- package/dist/esm/types/ErrorData.js +2 -0
- package/dist/esm/types/ErrorData.js.map +1 -0
- package/dist/esm/types/json.js +2 -0
- package/dist/esm/types/json.js.map +1 -0
- package/dist/esm/types/token.js +2 -0
- package/dist/esm/types/token.js.map +1 -0
- package/dist/esm/version.js +2 -0
- package/dist/esm/version.js.map +1 -0
- package/dist/esm/wallet.js +2 -0
- package/dist/esm/wallet.js.map +1 -0
- package/package.json +91 -0
- package/src/Account/index.ts +118 -0
- package/src/Account/types.ts +41 -0
- package/src/ApiClient/WebSocketClient/events.ts +60 -0
- package/src/ApiClient/WebSocketClient/index.ts +224 -0
- package/src/ApiClient/WebSocketClient/normalize.ts +104 -0
- package/src/ApiClient/WebSocketClient/types.ts +10 -0
- package/src/ApiClient/WebSocketClient/wireTypes.ts +63 -0
- package/src/ApiClient/index.ts +134 -0
- package/src/index.ts +141 -0
- package/src/lib/AuthManager/ApiKeyAuthManager.ts +52 -0
- package/src/lib/AuthManager/AuthManagerBase.ts +35 -0
- package/src/lib/AuthManager/AuthStorage.ts +21 -0
- package/src/lib/AuthManager/TokenAuthManager.ts +179 -0
- package/src/lib/AuthManager/index.ts +8 -0
- package/src/lib/Cache.ts +45 -0
- package/src/lib/DefaultLogger.ts +47 -0
- package/src/lib/RestClient.ts +77 -0
- package/src/lib/TypedEventEmitter.ts +52 -0
- package/src/lib/base64.ts +17 -0
- package/src/lib/getUUID.ts +27 -0
- package/src/lib/utils.ts +21 -0
- package/src/types/ErrorData.ts +7 -0
- package/src/types/json.ts +5 -0
- package/src/types/token.ts +1 -0
- package/src/version.ts +1 -0
- package/src/wallet.ts +6 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# [1.0.0-alpha.2](https://github.com/Sogni-AI/expo-client/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (2026-05-12)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* add WebSocket client and AccountApi ([b58b3ae](https://github.com/Sogni-AI/expo-client/commit/b58b3aed2fe55a27e3f01bee8c6df1e0e186af58))
|
|
7
|
+
|
|
8
|
+
# 1.0.0-alpha.1 (2026-05-12)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* add authentication, REST client, and core lib utilities ([23053b5](https://github.com/Sogni-AI/expo-client/commit/23053b52430122bf04a812aef8cf25e7c01a73dd))
|
package/README.md
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# @sogni-ai/expo-client
|
|
2
|
+
|
|
3
|
+
Expo / React Native SDK for the [Sogni Supernet](https://sogni.ai) — AI image, video & audio generation plus LLM chat over WebSocket.
|
|
4
|
+
|
|
5
|
+
> **Status:** Early development. Public API is unstable until 1.0. Published to npm under the `alpha` dist-tag.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx expo install @sogni-ai/expo-client@alpha expo-secure-store expo-standard-web-crypto
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
|
|
15
|
+
Add the Web Crypto polyfill at your app entry point (e.g. `app/_layout.tsx` for Expo Router or `App.tsx` for classic Expo):
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import 'expo-standard-web-crypto/polyfill';
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
This is required for cryptographic operations used by authentication and (optionally) wallet-based signup.
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
### Create a client with an API key
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
import { SogniClient } from '@sogni-ai/expo-client';
|
|
29
|
+
|
|
30
|
+
const sogni = await SogniClient.create({
|
|
31
|
+
appId: 'my-app',
|
|
32
|
+
apiKey: 'sk_...'
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Authenticated — fetch profile
|
|
36
|
+
const me = await sogni.account.me();
|
|
37
|
+
|
|
38
|
+
// Subscribe to account state changes (balance, network, etc.)
|
|
39
|
+
const unsubscribe = sogni.account.onChange((snapshot) => {
|
|
40
|
+
console.log(snapshot);
|
|
41
|
+
});
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Token-based session (auto-restored from secure storage)
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
const sogni = await SogniClient.create({ appId: 'my-app' });
|
|
48
|
+
|
|
49
|
+
if (sogni.isAuthenticated) {
|
|
50
|
+
// Tokens were restored from previous session
|
|
51
|
+
await sogni.account.me();
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
`login()` / `signup()` flows that derive a wallet from username + password are coming in a later release.
|
|
56
|
+
|
|
57
|
+
## Account snapshot shape
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
interface AccountSnapshot {
|
|
61
|
+
authenticated: boolean;
|
|
62
|
+
networkStatus: 'connected' | 'disconnected' | 'connecting';
|
|
63
|
+
network: 'fast' | 'relaxed' | null;
|
|
64
|
+
balance: Balances;
|
|
65
|
+
walletAddress: string | null;
|
|
66
|
+
username: string | null;
|
|
67
|
+
email: string | null;
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Snapshots are plain data — drop them straight into Redux/Zustand/MMKV without conversion.
|
|
72
|
+
|
|
73
|
+
## Imports
|
|
74
|
+
|
|
75
|
+
| Path | Purpose |
|
|
76
|
+
| --- | --- |
|
|
77
|
+
| `@sogni-ai/expo-client` | Main SDK |
|
|
78
|
+
| `@sogni-ai/expo-client/wallet` | Wallet creation & EIP-712 signing (tree-shakable; only pulled in if you use it) |
|
|
79
|
+
|
|
80
|
+
## Requirements
|
|
81
|
+
|
|
82
|
+
- Expo SDK 50 or newer
|
|
83
|
+
- React Native 0.73 or newer
|
|
84
|
+
|
|
85
|
+
## License
|
|
86
|
+
|
|
87
|
+
ISC
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import ApiClient from '../ApiClient';
|
|
2
|
+
import TypedEventEmitter from '../lib/TypedEventEmitter';
|
|
3
|
+
import { AccountSnapshot, Balances, MeData } from './types';
|
|
4
|
+
interface AccountEvents {
|
|
5
|
+
change: AccountSnapshot;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Account API: current-user info, balance, logout.
|
|
9
|
+
*
|
|
10
|
+
* Phase 2 surface — `login()` and `signup()` are deferred to Phase 4
|
|
11
|
+
* because they require deterministic wallet derivation (Phase 4 wallet
|
|
12
|
+
* helper). For Phase 2, authenticate via API key in `SogniClient.create()`
|
|
13
|
+
* or pre-obtained tokens via `sogni.setTokens(...)`.
|
|
14
|
+
*/
|
|
15
|
+
declare class AccountApi extends TypedEventEmitter<AccountEvents> {
|
|
16
|
+
private _client;
|
|
17
|
+
private _snapshot;
|
|
18
|
+
constructor(client: ApiClient);
|
|
19
|
+
/** Read-only snapshot of the current account state. */
|
|
20
|
+
get current(): Readonly<AccountSnapshot>;
|
|
21
|
+
/** Subscribe to account state changes. Returns an unsubscribe function. */
|
|
22
|
+
onChange(listener: (snapshot: AccountSnapshot) => void): () => void;
|
|
23
|
+
/** Fetch the current user's profile data from REST. Updates the snapshot. */
|
|
24
|
+
me(): Promise<MeData>;
|
|
25
|
+
/**
|
|
26
|
+
* Force-refresh the current user's balance from REST. Balance also updates
|
|
27
|
+
* automatically via socket events — call this only when you need a synchronous
|
|
28
|
+
* fetch (e.g., on screen mount before the socket has reconnected).
|
|
29
|
+
*/
|
|
30
|
+
refreshBalance(): Promise<Balances>;
|
|
31
|
+
/**
|
|
32
|
+
* Log out and clear all auth state. Closes the WebSocket and removes any
|
|
33
|
+
* persisted tokens. Safe to call even if not authenticated.
|
|
34
|
+
*/
|
|
35
|
+
logout(): Promise<void>;
|
|
36
|
+
private _update;
|
|
37
|
+
}
|
|
38
|
+
export default AccountApi;
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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;AACzD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAwB,MAAM,SAAS,CAAC;AAElF,UAAU,aAAa;IACrB,MAAM,EAAE,eAAe,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,cAAM,UAAW,SAAQ,iBAAiB,CAAC,aAAa,CAAC;IACvD,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,SAAS,CAAkB;gBAEvB,MAAM,EAAE,SAAS;IAgC7B,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,6EAA6E;IACvE,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC;IAU3B;;;;OAIG;IACG,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC;IAMzC;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAa7B,OAAO,CAAC,OAAO;CAMhB;AAUD,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
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("../lib/TypedEventEmitter"));
|
|
8
|
+
const types_1 = require("./types");
|
|
9
|
+
/**
|
|
10
|
+
* Account API: current-user info, balance, logout.
|
|
11
|
+
*
|
|
12
|
+
* Phase 2 surface — `login()` and `signup()` are deferred to Phase 4
|
|
13
|
+
* because they require deterministic wallet derivation (Phase 4 wallet
|
|
14
|
+
* helper). For Phase 2, authenticate via API key in `SogniClient.create()`
|
|
15
|
+
* or pre-obtained tokens via `sogni.setTokens(...)`.
|
|
16
|
+
*/
|
|
17
|
+
class AccountApi extends TypedEventEmitter_1.default {
|
|
18
|
+
constructor(client) {
|
|
19
|
+
super();
|
|
20
|
+
this._client = client;
|
|
21
|
+
this._snapshot = (0, types_1.emptyAccountSnapshot)();
|
|
22
|
+
client.socket.on('connected', ({ network }) => {
|
|
23
|
+
this._update({ networkStatus: 'connected', network });
|
|
24
|
+
});
|
|
25
|
+
client.socket.on('disconnected', () => {
|
|
26
|
+
this._update({ networkStatus: 'disconnected', network: null });
|
|
27
|
+
});
|
|
28
|
+
client.socket.on('authenticated', (e) => {
|
|
29
|
+
this._update({
|
|
30
|
+
authenticated: true,
|
|
31
|
+
username: e.username,
|
|
32
|
+
walletAddress: e.walletAddress,
|
|
33
|
+
balance: e.balance
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
client.socket.on('balanceUpdate', (e) => {
|
|
37
|
+
this._update({ balance: e.balance });
|
|
38
|
+
});
|
|
39
|
+
client.socket.on('changeNetwork', (e) => {
|
|
40
|
+
this._update({ network: e.network });
|
|
41
|
+
});
|
|
42
|
+
client.on('authUpdated', (authenticated) => {
|
|
43
|
+
if (!authenticated) {
|
|
44
|
+
this._update((0, types_1.emptyAccountSnapshot)());
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** Read-only snapshot of the current account state. */
|
|
49
|
+
get current() {
|
|
50
|
+
return this._snapshot;
|
|
51
|
+
}
|
|
52
|
+
/** Subscribe to account state changes. Returns an unsubscribe function. */
|
|
53
|
+
onChange(listener) {
|
|
54
|
+
return this.on('change', listener);
|
|
55
|
+
}
|
|
56
|
+
/** Fetch the current user's profile data from REST. Updates the snapshot. */
|
|
57
|
+
async me() {
|
|
58
|
+
const res = await this._client.rest.get('/v1/account/me');
|
|
59
|
+
this._update({
|
|
60
|
+
username: res.data.username,
|
|
61
|
+
email: res.data.currentEmail,
|
|
62
|
+
walletAddress: res.data.walletAddress
|
|
63
|
+
});
|
|
64
|
+
return res.data;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Force-refresh the current user's balance from REST. Balance also updates
|
|
68
|
+
* automatically via socket events — call this only when you need a synchronous
|
|
69
|
+
* fetch (e.g., on screen mount before the socket has reconnected).
|
|
70
|
+
*/
|
|
71
|
+
async refreshBalance() {
|
|
72
|
+
const res = await this._client.rest.get('/v4/account/balance');
|
|
73
|
+
this._update({ balance: res.data });
|
|
74
|
+
return res.data;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Log out and clear all auth state. Closes the WebSocket and removes any
|
|
78
|
+
* persisted tokens. Safe to call even if not authenticated.
|
|
79
|
+
*/
|
|
80
|
+
async logout() {
|
|
81
|
+
try {
|
|
82
|
+
await this._client.rest.post('/v1/account/logout');
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
if (e instanceof ApiClient_1.ApiError && e.status === 401) {
|
|
86
|
+
this._client.logger.warn('Logout call rejected — probably already logged out');
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
throw e;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
this._client.auth.clear();
|
|
93
|
+
}
|
|
94
|
+
_update(partial) {
|
|
95
|
+
const next = { ...this._snapshot, ...partial };
|
|
96
|
+
if (shallowEqual(next, this._snapshot))
|
|
97
|
+
return;
|
|
98
|
+
this._snapshot = next;
|
|
99
|
+
this.emit('change', this._snapshot);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function shallowEqual(a, b) {
|
|
103
|
+
const keys = Object.keys(a);
|
|
104
|
+
for (const k of keys) {
|
|
105
|
+
if (a[k] !== b[k])
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
exports.default = AccountApi;
|
|
111
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Account/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Balances } from '../ApiClient/WebSocketClient/events';
|
|
2
|
+
import { SupernetType } from '../ApiClient/WebSocketClient/types';
|
|
3
|
+
export type { Balances };
|
|
4
|
+
export interface MeData {
|
|
5
|
+
currentEmail: string;
|
|
6
|
+
username: string;
|
|
7
|
+
walletAddress: string;
|
|
8
|
+
emailVerified?: boolean;
|
|
9
|
+
discord2FA?: boolean;
|
|
10
|
+
discordLinked?: boolean;
|
|
11
|
+
discordServerMember?: boolean;
|
|
12
|
+
discordUsername?: string;
|
|
13
|
+
requestedUpdatedEmail?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface AccountSnapshot {
|
|
16
|
+
authenticated: boolean;
|
|
17
|
+
networkStatus: 'connected' | 'disconnected' | 'connecting';
|
|
18
|
+
network: SupernetType | null;
|
|
19
|
+
balance: Balances;
|
|
20
|
+
walletAddress: string | null;
|
|
21
|
+
username: string | null;
|
|
22
|
+
email: string | null;
|
|
23
|
+
}
|
|
24
|
+
export declare function emptyAccountSnapshot(): AccountSnapshot;
|
|
25
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +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;CAChC;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;CACtB;AAED,wBAAgB,oBAAoB,IAAI,eAAe,CAatD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.emptyAccountSnapshot = emptyAccountSnapshot;
|
|
4
|
+
function emptyAccountSnapshot() {
|
|
5
|
+
return {
|
|
6
|
+
authenticated: false,
|
|
7
|
+
networkStatus: 'disconnected',
|
|
8
|
+
network: null,
|
|
9
|
+
balance: {
|
|
10
|
+
sogni: { settled: '0', credit: '0', debit: '0', net: '0' },
|
|
11
|
+
spark: { settled: '0', credit: '0', debit: '0', net: '0', premiumCredit: '0' }
|
|
12
|
+
},
|
|
13
|
+
walletAddress: null,
|
|
14
|
+
username: null,
|
|
15
|
+
email: null
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/Account/types.ts"],"names":[],"mappings":";;AA2BA,oDAaC;AAbD,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;KACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { SupernetType } from './types';
|
|
2
|
+
export interface BalanceData {
|
|
3
|
+
settled: string;
|
|
4
|
+
credit: string;
|
|
5
|
+
debit: string;
|
|
6
|
+
net: string;
|
|
7
|
+
}
|
|
8
|
+
export interface SparkBalanceData extends BalanceData {
|
|
9
|
+
premiumCredit: string;
|
|
10
|
+
}
|
|
11
|
+
export interface Balances {
|
|
12
|
+
sogni: BalanceData;
|
|
13
|
+
spark: SparkBalanceData;
|
|
14
|
+
}
|
|
15
|
+
export interface AuthenticatedEvent {
|
|
16
|
+
username: string;
|
|
17
|
+
walletAddress: string;
|
|
18
|
+
balance: Balances;
|
|
19
|
+
isMainnet: boolean;
|
|
20
|
+
accountWasMigrated: boolean;
|
|
21
|
+
hasUnclaimedAirdrop: boolean;
|
|
22
|
+
firstLoginAfterMigration: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface BalanceUpdateEvent {
|
|
25
|
+
balance: Balances;
|
|
26
|
+
}
|
|
27
|
+
export interface ChangeNetworkEvent {
|
|
28
|
+
network: SupernetType;
|
|
29
|
+
}
|
|
30
|
+
export interface ConnectedEvent {
|
|
31
|
+
network: SupernetType;
|
|
32
|
+
}
|
|
33
|
+
export interface DisconnectedEvent {
|
|
34
|
+
code?: number;
|
|
35
|
+
reason?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface ToastMessageEvent {
|
|
38
|
+
level: 'info' | 'success' | 'warning' | 'error';
|
|
39
|
+
message: string;
|
|
40
|
+
stickyID?: string;
|
|
41
|
+
}
|
|
42
|
+
/** Public event map for WebSocketClient. */
|
|
43
|
+
export interface SocketEventMap {
|
|
44
|
+
connected: ConnectedEvent;
|
|
45
|
+
disconnected: DisconnectedEvent;
|
|
46
|
+
authenticated: AuthenticatedEvent;
|
|
47
|
+
balanceUpdate: BalanceUpdateEvent;
|
|
48
|
+
changeNetwork: ChangeNetworkEvent;
|
|
49
|
+
toastMessage: ToastMessageEvent;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../../src/ApiClient/WebSocketClient/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,QAAQ,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,wBAAwB,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,QAAQ,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,cAAc,CAAC;IAC1B,YAAY,EAAE,iBAAiB,CAAC;IAChC,aAAa,EAAE,kBAAkB,CAAC;IAClC,aAAa,EAAE,kBAAkB,CAAC;IAClC,aAAa,EAAE,kBAAkB,CAAC;IAClC,YAAY,EAAE,iBAAiB,CAAC;CACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../src/ApiClient/WebSocketClient/events.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import TypedEventEmitter from '../../lib/TypedEventEmitter';
|
|
2
|
+
import { Logger } from '../../lib/DefaultLogger';
|
|
3
|
+
import { AuthManager } from '../../lib/AuthManager';
|
|
4
|
+
import { ConnectionStatus, SupernetType } from './types';
|
|
5
|
+
import { SocketEventMap } from './events';
|
|
6
|
+
declare class WebSocketClient extends TypedEventEmitter<SocketEventMap> {
|
|
7
|
+
readonly appId: string;
|
|
8
|
+
readonly appSource?: string;
|
|
9
|
+
readonly baseUrl: string;
|
|
10
|
+
protected _logger: Logger;
|
|
11
|
+
private _auth;
|
|
12
|
+
private _supernetType;
|
|
13
|
+
private socket;
|
|
14
|
+
private _status;
|
|
15
|
+
private _reconnectAttempts;
|
|
16
|
+
private _wantConnected;
|
|
17
|
+
constructor(baseUrl: string, auth: AuthManager, appId: string, supernetType: SupernetType, logger: Logger, appSource?: string);
|
|
18
|
+
get supernetType(): SupernetType;
|
|
19
|
+
get isConnected(): boolean;
|
|
20
|
+
get status(): ConnectionStatus;
|
|
21
|
+
connect(): Promise<void>;
|
|
22
|
+
disconnect(): void;
|
|
23
|
+
switchNetwork(target: SupernetType): Promise<SupernetType>;
|
|
24
|
+
send(messageType: string, data: unknown): Promise<void>;
|
|
25
|
+
private _handleOpen;
|
|
26
|
+
private _handleClose;
|
|
27
|
+
private _handleError;
|
|
28
|
+
private _scheduleReconnect;
|
|
29
|
+
private _cleanupSocket;
|
|
30
|
+
private _handleMessage;
|
|
31
|
+
private _dispatch;
|
|
32
|
+
}
|
|
33
|
+
export default WebSocketClient;
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ApiClient/WebSocketClient/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAqB1C,cAAM,eAAgB,SAAQ,iBAAiB,CAAC,cAAc,CAAC;IAC7D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,cAAc,CAAS;gBAG7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM;IAWpB,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,MAAM,IAAI,gBAAgB,CAE7B;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoC9B,UAAU,IAAI,IAAI;IAcZ,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAU1D,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7D,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,SAAS;CAoBlB;AASD,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,183 @@
|
|
|
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 TypedEventEmitter_1 = __importDefault(require("../../lib/TypedEventEmitter"));
|
|
7
|
+
const base64_1 = require("../../lib/base64");
|
|
8
|
+
const version_1 = require("../../version");
|
|
9
|
+
const normalize_1 = require("./normalize");
|
|
10
|
+
const PROTOCOL_VERSION = '3.0.0';
|
|
11
|
+
const RECONNECT_DELAY_MS = 1000;
|
|
12
|
+
const MAX_RECONNECT_ATTEMPTS = 5;
|
|
13
|
+
class WebSocketClient extends TypedEventEmitter_1.default {
|
|
14
|
+
constructor(baseUrl, auth, appId, supernetType, logger, appSource) {
|
|
15
|
+
super();
|
|
16
|
+
this.socket = null;
|
|
17
|
+
this._status = 'disconnected';
|
|
18
|
+
this._reconnectAttempts = 0;
|
|
19
|
+
this._wantConnected = false;
|
|
20
|
+
this.baseUrl = normalizeBaseUrl(baseUrl);
|
|
21
|
+
this._auth = auth;
|
|
22
|
+
this.appId = appId;
|
|
23
|
+
this.appSource = appSource?.trim() || undefined;
|
|
24
|
+
this._supernetType = supernetType;
|
|
25
|
+
this._logger = logger;
|
|
26
|
+
}
|
|
27
|
+
get supernetType() {
|
|
28
|
+
return this._supernetType;
|
|
29
|
+
}
|
|
30
|
+
get isConnected() {
|
|
31
|
+
return this._status === 'connected';
|
|
32
|
+
}
|
|
33
|
+
get status() {
|
|
34
|
+
return this._status;
|
|
35
|
+
}
|
|
36
|
+
async connect() {
|
|
37
|
+
this._wantConnected = true;
|
|
38
|
+
if (this.socket) {
|
|
39
|
+
this._cleanupSocket();
|
|
40
|
+
}
|
|
41
|
+
this._status = 'connecting';
|
|
42
|
+
const userAgent = `Sogni/${PROTOCOL_VERSION} (sogni-expo-client) ${version_1.LIB_VERSION}`;
|
|
43
|
+
const url = new URL(this.baseUrl);
|
|
44
|
+
url.protocol = url.protocol === 'https:' || url.protocol === 'wss:' ? 'wss:' : 'ws:';
|
|
45
|
+
url.searchParams.set('appId', this.appId);
|
|
46
|
+
if (this.appSource)
|
|
47
|
+
url.searchParams.set('appSource', this.appSource);
|
|
48
|
+
url.searchParams.set('clientName', userAgent);
|
|
49
|
+
url.searchParams.set('clientType', 'artist');
|
|
50
|
+
url.searchParams.set('forceWorkerId', this._supernetType === 'fast' ? 'fast' : '');
|
|
51
|
+
const auth = await this._auth.socketAuth();
|
|
52
|
+
if (auth.queryParams) {
|
|
53
|
+
for (const [k, v] of Object.entries(auth.queryParams)) {
|
|
54
|
+
url.searchParams.set(k, v);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const options = auth.headers ? { headers: auth.headers } : undefined;
|
|
58
|
+
const Ctor = globalThis.WebSocket;
|
|
59
|
+
if (!Ctor) {
|
|
60
|
+
throw new Error('No global WebSocket available — are you running outside of React Native?');
|
|
61
|
+
}
|
|
62
|
+
const socket = new Ctor(url.toString(), undefined, options);
|
|
63
|
+
this.socket = socket;
|
|
64
|
+
socket.onopen = () => this._handleOpen();
|
|
65
|
+
socket.onmessage = (e) => this._handleMessage(e);
|
|
66
|
+
socket.onclose = (e) => this._handleClose(e);
|
|
67
|
+
socket.onerror = (e) => this._handleError(e);
|
|
68
|
+
}
|
|
69
|
+
disconnect() {
|
|
70
|
+
this._wantConnected = false;
|
|
71
|
+
if (!this.socket)
|
|
72
|
+
return;
|
|
73
|
+
const socket = this.socket;
|
|
74
|
+
this._cleanupSocket();
|
|
75
|
+
try {
|
|
76
|
+
socket.close(1000, 'Client disconnected');
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
this._logger.warn('Error closing socket:', e);
|
|
80
|
+
}
|
|
81
|
+
this._status = 'disconnected';
|
|
82
|
+
this.emit('disconnected', { code: 1000, reason: 'Client disconnected' });
|
|
83
|
+
}
|
|
84
|
+
async switchNetwork(target) {
|
|
85
|
+
return new Promise((resolve) => {
|
|
86
|
+
this.once('changeNetwork', ({ network }) => {
|
|
87
|
+
this._supernetType = network;
|
|
88
|
+
resolve(network);
|
|
89
|
+
});
|
|
90
|
+
void this.send('changeNetwork', target);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
async send(messageType, data) {
|
|
94
|
+
if (!this.socket || this._status !== 'connected') {
|
|
95
|
+
throw new Error(`Cannot send ${messageType}: socket not connected`);
|
|
96
|
+
}
|
|
97
|
+
const envelope = JSON.stringify({
|
|
98
|
+
type: messageType,
|
|
99
|
+
data: (0, base64_1.base64Encode)(JSON.stringify(data))
|
|
100
|
+
});
|
|
101
|
+
this._logger.debug('WebSocket send:', messageType, data);
|
|
102
|
+
this.socket.send(envelope);
|
|
103
|
+
}
|
|
104
|
+
_handleOpen() {
|
|
105
|
+
this._status = 'connected';
|
|
106
|
+
this._reconnectAttempts = 0;
|
|
107
|
+
this.emit('connected', { network: this._supernetType });
|
|
108
|
+
}
|
|
109
|
+
_handleClose(e) {
|
|
110
|
+
const wasConnected = this._status === 'connected';
|
|
111
|
+
this._status = 'disconnected';
|
|
112
|
+
this._cleanupSocket();
|
|
113
|
+
this.emit('disconnected', { code: e.code, reason: e.reason });
|
|
114
|
+
if (this._wantConnected && wasConnected && e.code !== 1000) {
|
|
115
|
+
this._scheduleReconnect();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
_handleError(e) {
|
|
119
|
+
this._logger.error('WebSocket error:', e);
|
|
120
|
+
}
|
|
121
|
+
_scheduleReconnect() {
|
|
122
|
+
if (this._reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
|
|
123
|
+
this._logger.warn('WebSocket reconnect attempts exhausted');
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
this._reconnectAttempts++;
|
|
127
|
+
setTimeout(() => {
|
|
128
|
+
if (this._wantConnected) {
|
|
129
|
+
void this.connect();
|
|
130
|
+
}
|
|
131
|
+
}, RECONNECT_DELAY_MS);
|
|
132
|
+
}
|
|
133
|
+
_cleanupSocket() {
|
|
134
|
+
if (!this.socket)
|
|
135
|
+
return;
|
|
136
|
+
const s = this.socket;
|
|
137
|
+
s.onopen = null;
|
|
138
|
+
s.onmessage = null;
|
|
139
|
+
s.onclose = null;
|
|
140
|
+
s.onerror = null;
|
|
141
|
+
this.socket = null;
|
|
142
|
+
}
|
|
143
|
+
_handleMessage(e) {
|
|
144
|
+
Promise.resolve(typeof e.data === 'string' ? e.data : e.data.text())
|
|
145
|
+
.then((str) => {
|
|
146
|
+
const envelope = JSON.parse(str);
|
|
147
|
+
const payload = envelope.data ? JSON.parse((0, base64_1.base64Decode)(envelope.data)) : null;
|
|
148
|
+
this._logger.debug('WebSocket recv:', envelope.type, payload);
|
|
149
|
+
this._dispatch(envelope.type, payload);
|
|
150
|
+
})
|
|
151
|
+
.catch((err) => this._logger.error('Failed to parse WebSocket message:', err));
|
|
152
|
+
}
|
|
153
|
+
_dispatch(type, payload) {
|
|
154
|
+
switch (type) {
|
|
155
|
+
case 'authenticated':
|
|
156
|
+
this.emit('authenticated', (0, normalize_1.normalizeAuthenticated)(payload));
|
|
157
|
+
break;
|
|
158
|
+
case 'balanceUpdate':
|
|
159
|
+
this.emit('balanceUpdate', (0, normalize_1.normalizeBalanceUpdate)(payload));
|
|
160
|
+
break;
|
|
161
|
+
case 'changeNetwork':
|
|
162
|
+
this.emit('changeNetwork', (0, normalize_1.normalizeChangeNetwork)(payload));
|
|
163
|
+
break;
|
|
164
|
+
case 'toastMessage':
|
|
165
|
+
this.emit('toastMessage', (0, normalize_1.normalizeToastMessage)(payload));
|
|
166
|
+
break;
|
|
167
|
+
default:
|
|
168
|
+
// Phase 2 only handles a subset; later phases will add jobState, jobProgress, etc.
|
|
169
|
+
this._logger.debug('Unhandled WebSocket message type:', type);
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function normalizeBaseUrl(url) {
|
|
175
|
+
const u = new URL(url);
|
|
176
|
+
if (u.protocol === 'http:' || u.protocol === 'ws:')
|
|
177
|
+
u.protocol = 'http:';
|
|
178
|
+
else
|
|
179
|
+
u.protocol = 'https:';
|
|
180
|
+
return u.toString();
|
|
181
|
+
}
|
|
182
|
+
exports.default = WebSocketClient;
|
|
183
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ApiClient/WebSocketClient/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ONLY place where wire-level message shapes are translated into clean
|
|
3
|
+
* public types. Every quirk in the sogni-socket protocol gets masked here so
|
|
4
|
+
* the rest of the SDK and downstream apps never see them.
|
|
5
|
+
*
|
|
6
|
+
* Authoritative wire source:
|
|
7
|
+
* ../sogni-socket/controllers/jobsController.js
|
|
8
|
+
* ../sogni-socket/controllers/websocketsController.js
|
|
9
|
+
*
|
|
10
|
+
* Known quirks masked (catalog grows as later phases add events):
|
|
11
|
+
* - `jobID` on the wire is actually the PROJECT id (Phase 3)
|
|
12
|
+
* - `imgID` on the wire is actually the JOB id (Phase 3)
|
|
13
|
+
* - `error_message` is snake_case in an otherwise camelCase API (Phase 3)
|
|
14
|
+
* - `balanceUpdate` arrives in two shapes (v1 flat, v2 nested) — always
|
|
15
|
+
* normalized to v2 here.
|
|
16
|
+
* - `authenticated.tokens` similarly v1/v2 — normalized to v2.
|
|
17
|
+
*/
|
|
18
|
+
import { AuthenticatedEvent, BalanceUpdateEvent, ChangeNetworkEvent, ToastMessageEvent } from './events';
|
|
19
|
+
import { RawAuthenticated, RawBalanceUpdate, RawChangeNetwork, RawToastMessage } from './wireTypes';
|
|
20
|
+
export declare function normalizeAuthenticated(raw: RawAuthenticated): AuthenticatedEvent;
|
|
21
|
+
export declare function normalizeBalanceUpdate(raw: RawBalanceUpdate): BalanceUpdateEvent;
|
|
22
|
+
export declare function normalizeChangeNetwork(raw: RawChangeNetwork): ChangeNetworkEvent;
|
|
23
|
+
export declare function normalizeToastMessage(raw: RawToastMessage): ToastMessageEvent;
|
|
24
|
+
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../../src/ApiClient/WebSocketClient/normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAElB,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAGhB,gBAAgB,EAChB,eAAe,EAChB,MAAM,aAAa,CAAC;AA6CrB,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,GAAG,kBAAkB,CAUhF;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,GAAG,kBAAkB,CAEhF;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,GAAG,kBAAkB,CAEhF;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,iBAAiB,CAM7E"}
|