@space-ai/contracts 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -17
- package/dist/axios.js +2 -1
- package/dist/axios.js.map +1 -1
- package/dist/core/auth.d.ts +12 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +12 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/axios-instance.d.ts.map +1 -1
- package/dist/core/axios-instance.js +8 -6
- package/dist/core/axios-instance.js.map +1 -1
- package/dist/core/create-axios-instance.d.ts +4 -0
- package/dist/core/create-axios-instance.d.ts.map +1 -0
- package/dist/core/create-axios-instance.js +63 -0
- package/dist/core/create-axios-instance.js.map +1 -0
- package/dist/core/init.d.ts.map +1 -1
- package/dist/core/init.js +5 -3
- package/dist/core/init.js.map +1 -1
- package/dist/core/runtime.d.ts +7 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +20 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/setup-api-client.d.ts.map +1 -1
- package/dist/core/setup-api-client.js +13 -9
- package/dist/core/setup-api-client.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
npm-пакет с TypeScript-типами и функциями HTTP-запросов к API.
|
|
4
4
|
|
|
5
|
-
Axios устанавливается автоматически как зависимость пакета. Базовый URL API задаётся через
|
|
5
|
+
Axios устанавливается автоматически как зависимость пакета. Базовый URL API задаётся через `BASE_API_URL` на глобальном объекте: **`window`** (браузер) или **`global`** / `globalThis` (Node.js, тесты).
|
|
6
6
|
|
|
7
7
|
## Содержание
|
|
8
8
|
|
|
9
9
|
- [Установка](#установка)
|
|
10
10
|
- [Быстрый старт](#быстрый-старт)
|
|
11
|
-
- [window
|
|
11
|
+
- [BASE_API_URL (window / global)](#base_api_url-window--global)
|
|
12
12
|
- [Способы инициализации](#способы-инициализации)
|
|
13
13
|
- [Использование API-функций](#использование-api-функций)
|
|
14
14
|
- [TypeScript](#typescript)
|
|
@@ -29,10 +29,14 @@ npm install @space-ai/contracts
|
|
|
29
29
|
|
|
30
30
|
## Быстрый старт
|
|
31
31
|
|
|
32
|
-
**1.** Задайте базовый URL API
|
|
32
|
+
**1.** Задайте базовый URL API:
|
|
33
33
|
|
|
34
34
|
```typescript
|
|
35
|
+
// браузер
|
|
35
36
|
window.BASE_API_URL = 'https://api.example.com';
|
|
37
|
+
|
|
38
|
+
// Node.js / тесты
|
|
39
|
+
global.BASE_API_URL = 'http://localhost:3000';
|
|
36
40
|
```
|
|
37
41
|
|
|
38
42
|
**2.** Подключите автоинициализацию axios (один раз в точке входа):
|
|
@@ -49,23 +53,101 @@ import { getUser } from '@space-ai/contracts';
|
|
|
49
53
|
const user = await getUser(1);
|
|
50
54
|
```
|
|
51
55
|
|
|
52
|
-
Axios создаётся с `baseURL:
|
|
56
|
+
Axios создаётся с `baseURL: BASE_API_URL`, сохраняется в `window.axios` / `global.axios` и используется всеми API-функциями.
|
|
53
57
|
|
|
54
58
|
---
|
|
55
59
|
|
|
56
|
-
## window
|
|
60
|
+
## BASE_API_URL (window / global)
|
|
61
|
+
|
|
62
|
+
Пакет читает и пишет одни и те же поля на `globalThis` — в браузере это `window`, в Node.js — `global`.
|
|
57
63
|
|
|
58
64
|
| Свойство | Тип | Описание |
|
|
59
65
|
|----------|-----|----------|
|
|
60
|
-
| `
|
|
61
|
-
| `
|
|
66
|
+
| `BASE_API_URL` | `string` | Базовый URL API → `axios.create({ baseURL })` |
|
|
67
|
+
| `API_PREFIX` | `string` | Опциональный префикс (`api` → `{BASE_API_URL}/api`) |
|
|
68
|
+
| `axios` | `AxiosInstance` | Экземпляр axios (создаётся пакетом) |
|
|
69
|
+
| `CONTRACTS_AUTH` | `AuthProvider` | Провайдер токена (альтернатива `configureAuth`) |
|
|
70
|
+
|
|
71
|
+
Примеры:
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
// браузер
|
|
75
|
+
window.BASE_API_URL = '/api';
|
|
76
|
+
|
|
77
|
+
// Node.js, Vitest, Jest
|
|
78
|
+
global.BASE_API_URL = 'http://localhost:3000';
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Инициализация axios и авторизация
|
|
84
|
+
|
|
85
|
+
Пакет создаёт axios как на фронтенде:
|
|
86
|
+
|
|
87
|
+
- `baseURL` из `BASE_API_URL` + опциональный `API_PREFIX`
|
|
88
|
+
- заголовки `Content-Type` / `Accept: application/json`
|
|
89
|
+
- **request interceptor** — подставляет `Authorization: Bearer <token>`
|
|
90
|
+
- **response interceptor** — проверка статуса и проброс ошибок
|
|
91
|
+
|
|
92
|
+
### Провайдер токена
|
|
93
|
+
|
|
94
|
+
Keycloak, Zustand и прочее остаются в приложении. Пакет не знает про них — вы передаёте `AuthProvider`:
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
import { configureAuth, setupApiClient } from '@space-ai/contracts';
|
|
98
|
+
import { getAccessToken, updateToken } from '@/api/keycloak';
|
|
99
|
+
import { dispatchLogout, useAuth } from '@/stores/auth';
|
|
100
|
+
|
|
101
|
+
configureAuth({
|
|
102
|
+
getAccessToken: () => getAccessToken() ?? useAuth.getState().token ?? null,
|
|
103
|
+
updateToken: (minValiditySeconds = 30) => updateToken(minValiditySeconds),
|
|
104
|
+
onSessionExpired: () => dispatchLogout(),
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
window.BASE_API_URL = import.meta.env.VITE_API_URL;
|
|
108
|
+
window.API_PREFIX = 'api'; // опционально
|
|
62
109
|
|
|
63
|
-
|
|
110
|
+
setupApiClient();
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Логика interceptor (как в `src/api/axios.ts` на фронте):
|
|
114
|
+
|
|
115
|
+
1. `getAccessToken()` — если токена нет, запрос уходит без `Authorization`
|
|
116
|
+
2. `updateToken(30)` — обновление перед запросом; при ошибке → `onSessionExpired()` и `Session expired`
|
|
117
|
+
3. повторный `getAccessToken()` — свежий токен в заголовок
|
|
118
|
+
|
|
119
|
+
### Альтернатива — `global.CONTRACTS_AUTH`
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
global.CONTRACTS_AUTH = {
|
|
123
|
+
getAccessToken: () => getAccessToken() ?? useAuth.getState().token ?? null,
|
|
124
|
+
updateToken,
|
|
125
|
+
onSessionExpired: dispatchLogout,
|
|
126
|
+
};
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Полный пример `main.tsx`
|
|
64
130
|
|
|
65
131
|
```typescript
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
132
|
+
import { configureAuth, setupApiClient } from '@space-ai/contracts';
|
|
133
|
+
import { getAccessToken, updateToken } from '@/api/keycloak';
|
|
134
|
+
import { dispatchLogout, useAuth } from '@/stores/auth';
|
|
135
|
+
|
|
136
|
+
configureAuth({
|
|
137
|
+
getAccessToken: () => getAccessToken() ?? useAuth.getState().token ?? null,
|
|
138
|
+
updateToken: (s = 30) => updateToken(s),
|
|
139
|
+
onSessionExpired: dispatchLogout,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
window.BASE_API_URL = import.meta.env.VITE_API_URL;
|
|
143
|
+
window.API_PREFIX = 'api';
|
|
144
|
+
|
|
145
|
+
setupApiClient();
|
|
146
|
+
|
|
147
|
+
import { createRoot } from 'react-dom/client';
|
|
148
|
+
import App from './App';
|
|
149
|
+
|
|
150
|
+
createRoot(document.getElementById('root')!).render(<App />);
|
|
69
151
|
```
|
|
70
152
|
|
|
71
153
|
---
|
|
@@ -204,7 +286,7 @@ const created = await createUser({
|
|
|
204
286
|
Прямой доступ к axios (после инициализации):
|
|
205
287
|
|
|
206
288
|
```typescript
|
|
207
|
-
const client = window.axios
|
|
289
|
+
const client = globalThis.axios; // window.axios в браузере
|
|
208
290
|
await client.get('/health');
|
|
209
291
|
```
|
|
210
292
|
|
|
@@ -212,12 +294,12 @@ await client.get('/health');
|
|
|
212
294
|
|
|
213
295
|
## TypeScript
|
|
214
296
|
|
|
215
|
-
Пакет расширяет `
|
|
297
|
+
Пакет расширяет глобальную область (`global` / `window`):
|
|
216
298
|
|
|
217
299
|
```typescript
|
|
218
|
-
|
|
219
|
-
BASE_API_URL
|
|
220
|
-
axios
|
|
300
|
+
declare global {
|
|
301
|
+
var BASE_API_URL: string | undefined;
|
|
302
|
+
var axios: import('axios').AxiosInstance | undefined;
|
|
221
303
|
}
|
|
222
304
|
```
|
|
223
305
|
|
|
@@ -272,6 +354,6 @@ CI (`.github/workflows/publish.yml`) выполнит `npm publish` при те
|
|
|
272
354
|
|
|
273
355
|
| Симптом | Решение |
|
|
274
356
|
|---------|---------|
|
|
275
|
-
| `Axios не найден` | Задайте `window
|
|
357
|
+
| `Axios не найден` | Задайте `BASE_API_URL` на `window` / `global`, импортируйте `@space-ai/contracts/axios` или вызовите `setupApiClient()` |
|
|
276
358
|
| Запросы без baseURL | `BASE_API_URL` не был задан до инициализации — используйте **Способ 1** или **Способ 2** |
|
|
277
359
|
| Двойной axios | Не вызывайте и `setupApiClient()`, и `initApiClient()` с разными инстансами без необходимости |
|
package/dist/axios.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { enableAutoInit, setupApiClient } from './core/setup-api-client.js';
|
|
2
|
+
import { getBaseApiUrl } from './core/runtime.js';
|
|
2
3
|
enableAutoInit();
|
|
3
|
-
if (
|
|
4
|
+
if (getBaseApiUrl()) {
|
|
4
5
|
setupApiClient();
|
|
5
6
|
}
|
|
6
7
|
//# sourceMappingURL=axios.js.map
|
package/dist/axios.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axios.js","sourceRoot":"","sources":["../src/axios.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"axios.js","sourceRoot":"","sources":["../src/axios.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,cAAc,EAAE,CAAC;AAEjB,IAAI,aAAa,EAAE,EAAE,CAAC;IACpB,cAAc,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface AuthProvider {
|
|
2
|
+
/** Текущий access token (Keycloak, store и т.д.) */
|
|
3
|
+
getAccessToken(): string | null | undefined;
|
|
4
|
+
/** Обновить токен, если истекает в течение minValiditySeconds */
|
|
5
|
+
updateToken?(minValiditySeconds?: number): Promise<void>;
|
|
6
|
+
/** Сессия невалидна — logout, редирект и т.д. */
|
|
7
|
+
onSessionExpired?(): void;
|
|
8
|
+
}
|
|
9
|
+
export declare function configureAuth(provider: AuthProvider): void;
|
|
10
|
+
export declare function getAuthProvider(): AuthProvider | undefined;
|
|
11
|
+
export declare function resetAuthProvider(): void;
|
|
12
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,cAAc,IAAI,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,iEAAiE;IACjE,WAAW,CAAC,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,iDAAiD;IACjD,gBAAgB,CAAC,IAAI,IAAI,CAAC;CAC3B;AAID,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAE1D;AAED,wBAAgB,eAAe,IAAI,YAAY,GAAG,SAAS,CAE1D;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { getRuntime } from './runtime.js';
|
|
2
|
+
let authProvider = null;
|
|
3
|
+
export function configureAuth(provider) {
|
|
4
|
+
authProvider = provider;
|
|
5
|
+
}
|
|
6
|
+
export function getAuthProvider() {
|
|
7
|
+
return authProvider ?? getRuntime()?.CONTRACTS_AUTH;
|
|
8
|
+
}
|
|
9
|
+
export function resetAuthProvider() {
|
|
10
|
+
authProvider = null;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAW1C,IAAI,YAAY,GAAwB,IAAI,CAAC;AAE7C,MAAM,UAAU,aAAa,CAAC,QAAsB;IAClD,YAAY,GAAG,QAAQ,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,IAAI,UAAU,EAAE,EAAE,cAAc,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axios-instance.d.ts","sourceRoot":"","sources":["../../src/core/axios-instance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"axios-instance.d.ts","sourceRoot":"","sources":["../../src/core/axios-instance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAS3C,wBAAgB,QAAQ,IAAI,aAAa,CAoBxC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEnD;AAED,wBAAgB,UAAU,IAAI,IAAI,CAEjC"}
|
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
import { isAutoInitEnabled, setupApiClient } from './setup-api-client.js';
|
|
2
|
+
import { getBaseApiUrl, getRuntimeAxios } from './runtime.js';
|
|
2
3
|
import { getStoredAxios, resetStoredAxios, setStoredAxios, } from './state.js';
|
|
3
4
|
export function getAxios() {
|
|
4
5
|
let instance = getStoredAxios();
|
|
5
6
|
if (instance)
|
|
6
7
|
return instance;
|
|
7
|
-
if (isAutoInitEnabled() &&
|
|
8
|
+
if (isAutoInitEnabled() && getBaseApiUrl()) {
|
|
8
9
|
setupApiClient();
|
|
9
10
|
instance = getStoredAxios();
|
|
10
11
|
if (instance)
|
|
11
12
|
return instance;
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
const runtimeAxios = getRuntimeAxios();
|
|
15
|
+
if (runtimeAxios) {
|
|
16
|
+
setStoredAxios(runtimeAxios);
|
|
17
|
+
return runtimeAxios;
|
|
16
18
|
}
|
|
17
|
-
throw new Error('Axios не найден. Задайте
|
|
18
|
-
'вызовите setupApiClient() или initApiClient(axios)');
|
|
19
|
+
throw new Error('Axios не найден. Задайте global.BASE_API_URL / window.BASE_API_URL, ' +
|
|
20
|
+
'импортируйте @space-ai/contracts/axios, вызовите setupApiClient() или initApiClient(axios)');
|
|
19
21
|
}
|
|
20
22
|
export function setAxios(axios) {
|
|
21
23
|
setStoredAxios(axios);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axios-instance.js","sourceRoot":"","sources":["../../src/core/axios-instance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,QAAQ;IACtB,IAAI,QAAQ,GAAG,cAAc,EAAE,CAAC;IAChC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,IAAI,iBAAiB,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"axios-instance.js","sourceRoot":"","sources":["../../src/core/axios-instance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,QAAQ;IACtB,IAAI,QAAQ,GAAG,cAAc,EAAE,CAAC;IAChC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,IAAI,iBAAiB,EAAE,IAAI,aAAa,EAAE,EAAE,CAAC;QAC3C,cAAc,EAAE,CAAC;QACjB,QAAQ,GAAG,cAAc,EAAE,CAAC;QAC5B,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,IAAI,YAAY,EAAE,CAAC;QACjB,cAAc,CAAC,YAAY,CAAC,CAAC;QAC7B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,sEAAsE;QACpE,4FAA4F,CAC/F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC3C,cAAc,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,gBAAgB,EAAE,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-axios-instance.d.ts","sourceRoot":"","sources":["../../src/core/create-axios-instance.ts"],"names":[],"mappings":"AAAA,OAAc,EACZ,KAAK,aAAa,EAEnB,MAAM,OAAO,CAAC;AAMf,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAUnD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAWrE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { getAuthProvider } from './auth.js';
|
|
3
|
+
import { getBaseApiUrl, getRuntime } from './runtime.js';
|
|
4
|
+
const INTERCEPTORS_ATTACHED = Symbol('contracts.interceptors');
|
|
5
|
+
export function resolveBaseURL() {
|
|
6
|
+
const base = getBaseApiUrl();
|
|
7
|
+
if (!base)
|
|
8
|
+
return undefined;
|
|
9
|
+
const prefix = getRuntime()?.API_PREFIX;
|
|
10
|
+
if (!prefix)
|
|
11
|
+
return base;
|
|
12
|
+
const normalizedBase = base.replace(/\/$/, '');
|
|
13
|
+
const normalizedPrefix = prefix.replace(/^\//, '').replace(/\/$/, '');
|
|
14
|
+
return `${normalizedBase}/${normalizedPrefix}`;
|
|
15
|
+
}
|
|
16
|
+
export function createConfiguredAxios(baseURL) {
|
|
17
|
+
const instance = axios.create({
|
|
18
|
+
baseURL: baseURL ?? resolveBaseURL(),
|
|
19
|
+
headers: {
|
|
20
|
+
'Content-Type': 'application/json',
|
|
21
|
+
Accept: 'application/json',
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
attachInterceptors(instance);
|
|
25
|
+
return instance;
|
|
26
|
+
}
|
|
27
|
+
function attachInterceptors(instance) {
|
|
28
|
+
const marked = instance;
|
|
29
|
+
if (marked[INTERCEPTORS_ATTACHED])
|
|
30
|
+
return;
|
|
31
|
+
marked[INTERCEPTORS_ATTACHED] = true;
|
|
32
|
+
instance.interceptors.request.use(async (config) => {
|
|
33
|
+
const auth = getAuthProvider();
|
|
34
|
+
if (!auth)
|
|
35
|
+
return config;
|
|
36
|
+
const token = auth.getAccessToken();
|
|
37
|
+
if (!token)
|
|
38
|
+
return config;
|
|
39
|
+
if (auth.updateToken) {
|
|
40
|
+
try {
|
|
41
|
+
await auth.updateToken(30);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
auth.onSessionExpired?.();
|
|
45
|
+
return Promise.reject(new Error('Session expired'));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const fresh = auth.getAccessToken();
|
|
49
|
+
const currentToken = fresh ?? token;
|
|
50
|
+
if (currentToken) {
|
|
51
|
+
config.headers.Authorization = `Bearer ${currentToken}`;
|
|
52
|
+
}
|
|
53
|
+
return config;
|
|
54
|
+
}, (error) => Promise.reject(error));
|
|
55
|
+
instance.interceptors.response.use((res) => {
|
|
56
|
+
if (res.status >= 200 && res.status < 300)
|
|
57
|
+
return res;
|
|
58
|
+
throw new Error(res.data);
|
|
59
|
+
}, (err) => {
|
|
60
|
+
throw new Error(err);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=create-axios-instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-axios-instance.js","sourceRoot":"","sources":["../../src/core/create-axios-instance.ts"],"names":[],"mappings":"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"}
|
package/dist/core/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/core/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/core/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAazD"}
|
package/dist/core/init.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { setAxios } from './axios-instance.js';
|
|
2
|
+
import { getRuntimeAxios } from './runtime.js';
|
|
2
3
|
export function initApiClient(axios) {
|
|
3
4
|
if (axios) {
|
|
4
5
|
setAxios(axios);
|
|
5
6
|
return;
|
|
6
7
|
}
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
const runtimeAxios = getRuntimeAxios();
|
|
9
|
+
if (runtimeAxios) {
|
|
10
|
+
setAxios(runtimeAxios);
|
|
9
11
|
return;
|
|
10
12
|
}
|
|
11
|
-
throw new Error('Не передан axios и нет window.axios');
|
|
13
|
+
throw new Error('Не передан axios и нет global.axios / window.axios');
|
|
12
14
|
}
|
|
13
15
|
//# sourceMappingURL=init.js.map
|
package/dist/core/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/core/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,UAAU,aAAa,CAAC,KAAqB;IACjD,IAAI,KAAK,EAAE,CAAC;QACV,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/core/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,aAAa,CAAC,KAAqB;IACjD,IAAI,KAAK,EAAE,CAAC;QACV,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,CAAC,YAAY,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AxiosInstance } from 'axios';
|
|
2
|
+
/** Браузер (`window`) или Node.js (`global` / `globalThis`). */
|
|
3
|
+
export declare function getRuntime(): typeof globalThis | undefined;
|
|
4
|
+
export declare function getBaseApiUrl(): string | undefined;
|
|
5
|
+
export declare function getRuntimeAxios(): AxiosInstance | undefined;
|
|
6
|
+
export declare function setRuntimeAxios(instance: AxiosInstance): void;
|
|
7
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,gEAAgE;AAChE,wBAAgB,UAAU,IAAI,OAAO,UAAU,GAAG,SAAS,CAK1D;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAElD;AAED,wBAAgB,eAAe,IAAI,aAAa,GAAG,SAAS,CAE3D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAK7D"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Браузер (`window`) или Node.js (`global` / `globalThis`). */
|
|
2
|
+
export function getRuntime() {
|
|
3
|
+
if (typeof globalThis !== 'undefined') {
|
|
4
|
+
return globalThis;
|
|
5
|
+
}
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
export function getBaseApiUrl() {
|
|
9
|
+
return getRuntime()?.BASE_API_URL;
|
|
10
|
+
}
|
|
11
|
+
export function getRuntimeAxios() {
|
|
12
|
+
return getRuntime()?.axios;
|
|
13
|
+
}
|
|
14
|
+
export function setRuntimeAxios(instance) {
|
|
15
|
+
const runtime = getRuntime();
|
|
16
|
+
if (runtime) {
|
|
17
|
+
runtime.axios = instance;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AAEA,gEAAgE;AAChE,MAAM,UAAU,UAAU;IACxB,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;QACtC,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,EAAE,EAAE,YAAY,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,UAAU,EAAE,EAAE,KAAK,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-api-client.d.ts","sourceRoot":"","sources":["../../src/core/setup-api-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup-api-client.d.ts","sourceRoot":"","sources":["../../src/core/setup-api-client.ts"],"names":[],"mappings":"AAaA,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,wBAAgB,cAAc,IAAI,IAAI,CAyBrC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { createConfiguredAxios, resolveBaseURL, } from './create-axios-instance.js';
|
|
2
|
+
import { getRuntime, getRuntimeAxios, setRuntimeAxios, } from './runtime.js';
|
|
2
3
|
import { setStoredAxios } from './state.js';
|
|
3
4
|
let autoInitEnabled = false;
|
|
4
5
|
export function enableAutoInit() {
|
|
@@ -8,20 +9,23 @@ export function isAutoInitEnabled() {
|
|
|
8
9
|
return autoInitEnabled;
|
|
9
10
|
}
|
|
10
11
|
export function setupApiClient() {
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
const runtime = getRuntime();
|
|
13
|
+
const baseURL = resolveBaseURL();
|
|
14
|
+
if (!runtime) {
|
|
15
|
+
setStoredAxios(createConfiguredAxios(baseURL));
|
|
13
16
|
return;
|
|
14
17
|
}
|
|
15
|
-
const baseURL = window.BASE_API_URL;
|
|
16
18
|
if (!baseURL) {
|
|
17
|
-
console.warn('@space-ai/contracts:
|
|
19
|
+
console.warn('@space-ai/contracts: BASE_API_URL не задан (global / window) — axios создаётся без baseURL');
|
|
18
20
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
let instance = getRuntimeAxios();
|
|
22
|
+
if (!instance) {
|
|
23
|
+
instance = createConfiguredAxios(baseURL);
|
|
24
|
+
setRuntimeAxios(instance);
|
|
21
25
|
}
|
|
22
26
|
else if (baseURL) {
|
|
23
|
-
|
|
27
|
+
instance.defaults.baseURL = baseURL;
|
|
24
28
|
}
|
|
25
|
-
setStoredAxios(
|
|
29
|
+
setStoredAxios(instance);
|
|
26
30
|
}
|
|
27
31
|
//# sourceMappingURL=setup-api-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-api-client.js","sourceRoot":"","sources":["../../src/core/setup-api-client.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"setup-api-client.js","sourceRoot":"","sources":["../../src/core/setup-api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,UAAU,EACV,eAAe,EACf,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,IAAI,eAAe,GAAG,KAAK,CAAC;AAE5B,MAAM,UAAU,cAAc;IAC5B,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IAEjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,cAAc,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,4FAA4F,CAC7F,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,GAAG,eAAe,EAAE,CAAC;IAEjC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC1C,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC;QACnB,QAAQ,CAAC,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IACtC,CAAC;IAED,cAAc,CAAC,QAAQ,CAAC,CAAC;AAC3B,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { initApiClient } from './core/init.js';
|
|
2
2
|
export { setupApiClient, enableAutoInit } from './core/setup-api-client.js';
|
|
3
3
|
export { getAxios, resetAxios } from './core/axios-instance.js';
|
|
4
|
+
export { configureAuth, resetAuthProvider, type AuthProvider, } from './core/auth.js';
|
|
5
|
+
export { createConfiguredAxios, resolveBaseURL, } from './core/create-axios-instance.js';
|
|
4
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,KAAK,YAAY,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,cAAc,GACf,MAAM,iCAAiC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { initApiClient } from './core/init.js';
|
|
2
2
|
export { setupApiClient, enableAutoInit } from './core/setup-api-client.js';
|
|
3
3
|
export { getAxios, resetAxios } from './core/axios-instance.js';
|
|
4
|
+
export { configureAuth, resetAuthProvider, } from './core/auth.js';
|
|
5
|
+
export { createConfiguredAxios, resolveBaseURL, } from './core/create-axios-instance.js';
|
|
4
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EACL,aAAa,EACb,iBAAiB,GAElB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,cAAc,GACf,MAAM,iCAAiC,CAAC"}
|