@nekutima/provili-sdk 0.2.0
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/LICENSE +21 -0
- package/README.md +57 -0
- package/dist/core/http-client.d.ts +84 -0
- package/dist/core/http-client.d.ts.map +1 -0
- package/dist/core/http-client.js +177 -0
- package/dist/core/http-client.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/rate-limiter.d.ts +40 -0
- package/dist/core/rate-limiter.d.ts.map +1 -0
- package/dist/core/rate-limiter.js +65 -0
- package/dist/core/rate-limiter.js.map +1 -0
- package/dist/generated/api-types.d.ts +1742 -0
- package/dist/generated/api-types.d.ts.map +1 -0
- package/dist/generated/api-types.js +7 -0
- package/dist/generated/api-types.js.map +1 -0
- package/dist/index.d.ts +92 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +129 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-engines/adapters.d.ts +26 -0
- package/dist/llm-engines/adapters.d.ts.map +1 -0
- package/dist/llm-engines/adapters.js +121 -0
- package/dist/llm-engines/adapters.js.map +1 -0
- package/dist/llm-engines/client.d.ts +12 -0
- package/dist/llm-engines/client.d.ts.map +1 -0
- package/dist/llm-engines/client.js +138 -0
- package/dist/llm-engines/client.js.map +1 -0
- package/dist/llm-engines/descriptors.d.ts +24 -0
- package/dist/llm-engines/descriptors.d.ts.map +1 -0
- package/dist/llm-engines/descriptors.js +192 -0
- package/dist/llm-engines/descriptors.js.map +1 -0
- package/dist/llm-engines/endpoint.d.ts +5 -0
- package/dist/llm-engines/endpoint.d.ts.map +1 -0
- package/dist/llm-engines/endpoint.js +19 -0
- package/dist/llm-engines/endpoint.js.map +1 -0
- package/dist/llm-engines/errors.d.ts +16 -0
- package/dist/llm-engines/errors.d.ts.map +1 -0
- package/dist/llm-engines/errors.js +72 -0
- package/dist/llm-engines/errors.js.map +1 -0
- package/dist/llm-engines/index.d.ts +7 -0
- package/dist/llm-engines/index.d.ts.map +1 -0
- package/dist/llm-engines/index.js +10 -0
- package/dist/llm-engines/index.js.map +1 -0
- package/dist/llm-engines/types.d.ts +130 -0
- package/dist/llm-engines/types.d.ts.map +1 -0
- package/dist/llm-engines/types.js +32 -0
- package/dist/llm-engines/types.js.map +1 -0
- package/dist/mcp/host.d.ts +13 -0
- package/dist/mcp/host.d.ts.map +1 -0
- package/dist/mcp/host.js +72 -0
- package/dist/mcp/host.js.map +1 -0
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +7 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcp.service.d.ts +21 -0
- package/dist/mcp/mcp.service.d.ts.map +1 -0
- package/dist/mcp/mcp.service.js +35 -0
- package/dist/mcp/mcp.service.js.map +1 -0
- package/dist/mcp/types.d.ts +60 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +7 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/models/agent.model.d.ts +62 -0
- package/dist/models/agent.model.d.ts.map +1 -0
- package/dist/models/agent.model.js +3 -0
- package/dist/models/agent.model.js.map +1 -0
- package/dist/models/ai-chat.model.d.ts +27 -0
- package/dist/models/ai-chat.model.d.ts.map +1 -0
- package/dist/models/ai-chat.model.js +3 -0
- package/dist/models/ai-chat.model.js.map +1 -0
- package/dist/models/api-error.model.d.ts +33 -0
- package/dist/models/api-error.model.d.ts.map +1 -0
- package/dist/models/api-error.model.js +59 -0
- package/dist/models/api-error.model.js.map +1 -0
- package/dist/models/api-response.model.d.ts +52 -0
- package/dist/models/api-response.model.d.ts.map +1 -0
- package/dist/models/api-response.model.js +78 -0
- package/dist/models/api-response.model.js.map +1 -0
- package/dist/models/auth.model.d.ts +25 -0
- package/dist/models/auth.model.d.ts.map +1 -0
- package/dist/models/auth.model.js +6 -0
- package/dist/models/auth.model.js.map +1 -0
- package/dist/models/backup.model.d.ts +34 -0
- package/dist/models/backup.model.d.ts.map +1 -0
- package/dist/models/backup.model.js +3 -0
- package/dist/models/backup.model.js.map +1 -0
- package/dist/models/chat.model.d.ts +87 -0
- package/dist/models/chat.model.d.ts.map +1 -0
- package/dist/models/chat.model.js +7 -0
- package/dist/models/chat.model.js.map +1 -0
- package/dist/models/file.model.d.ts +50 -0
- package/dist/models/file.model.d.ts.map +1 -0
- package/dist/models/file.model.js +7 -0
- package/dist/models/file.model.js.map +1 -0
- package/dist/models/index.d.ts +17 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +20 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/knowledge.model.d.ts +63 -0
- package/dist/models/knowledge.model.d.ts.map +1 -0
- package/dist/models/knowledge.model.js +3 -0
- package/dist/models/knowledge.model.js.map +1 -0
- package/dist/models/llm-engine.model.d.ts +25 -0
- package/dist/models/llm-engine.model.d.ts.map +1 -0
- package/dist/models/llm-engine.model.js +3 -0
- package/dist/models/llm-engine.model.js.map +1 -0
- package/dist/models/prompt.model.d.ts +30 -0
- package/dist/models/prompt.model.d.ts.map +1 -0
- package/dist/models/prompt.model.js +3 -0
- package/dist/models/prompt.model.js.map +1 -0
- package/dist/models/role.model.d.ts +19 -0
- package/dist/models/role.model.d.ts.map +1 -0
- package/dist/models/role.model.js +3 -0
- package/dist/models/role.model.js.map +1 -0
- package/dist/models/streaming.model.d.ts +27 -0
- package/dist/models/streaming.model.d.ts.map +1 -0
- package/dist/models/streaming.model.js +3 -0
- package/dist/models/streaming.model.js.map +1 -0
- package/dist/models/update.model.d.ts +16 -0
- package/dist/models/update.model.d.ts.map +1 -0
- package/dist/models/update.model.js +3 -0
- package/dist/models/update.model.js.map +1 -0
- package/dist/models/usb-patch.model.d.ts +13 -0
- package/dist/models/usb-patch.model.d.ts.map +1 -0
- package/dist/models/usb-patch.model.js +3 -0
- package/dist/models/usb-patch.model.js.map +1 -0
- package/dist/models/user.model.d.ts +64 -0
- package/dist/models/user.model.d.ts.map +1 -0
- package/dist/models/user.model.js +3 -0
- package/dist/models/user.model.js.map +1 -0
- package/dist/services/agent.service.d.ts +45 -0
- package/dist/services/agent.service.d.ts.map +1 -0
- package/dist/services/agent.service.js +91 -0
- package/dist/services/agent.service.js.map +1 -0
- package/dist/services/ai-chat.service.d.ts +12 -0
- package/dist/services/ai-chat.service.d.ts.map +1 -0
- package/dist/services/ai-chat.service.js +116 -0
- package/dist/services/ai-chat.service.js.map +1 -0
- package/dist/services/auth.service.d.ts +25 -0
- package/dist/services/auth.service.d.ts.map +1 -0
- package/dist/services/auth.service.js +76 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/chat.service.d.ts +90 -0
- package/dist/services/chat.service.d.ts.map +1 -0
- package/dist/services/chat.service.js +240 -0
- package/dist/services/chat.service.js.map +1 -0
- package/dist/services/index.d.ts +12 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +16 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/knowledge.service.d.ts +18 -0
- package/dist/services/knowledge.service.d.ts.map +1 -0
- package/dist/services/knowledge.service.js +33 -0
- package/dist/services/knowledge.service.js.map +1 -0
- package/dist/services/llm-engines.service.d.ts +12 -0
- package/dist/services/llm-engines.service.d.ts.map +1 -0
- package/dist/services/llm-engines.service.js +26 -0
- package/dist/services/llm-engines.service.js.map +1 -0
- package/dist/services/prompts.service.d.ts +16 -0
- package/dist/services/prompts.service.d.ts.map +1 -0
- package/dist/services/prompts.service.js +31 -0
- package/dist/services/prompts.service.js.map +1 -0
- package/dist/services/role.service.d.ts +12 -0
- package/dist/services/role.service.d.ts.map +1 -0
- package/dist/services/role.service.js +29 -0
- package/dist/services/role.service.js.map +1 -0
- package/dist/services/streaming.service.d.ts +18 -0
- package/dist/services/streaming.service.d.ts.map +1 -0
- package/dist/services/streaming.service.js +103 -0
- package/dist/services/streaming.service.js.map +1 -0
- package/dist/services/usb-patches.service.d.ts +9 -0
- package/dist/services/usb-patches.service.d.ts.map +1 -0
- package/dist/services/usb-patches.service.js +16 -0
- package/dist/services/usb-patches.service.js.map +1 -0
- package/dist/services/user.service.d.ts +15 -0
- package/dist/services/user.service.d.ts.map +1 -0
- package/dist/services/user.service.js +40 -0
- package/dist/services/user.service.js.map +1 -0
- package/package.json +93 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Nekutima
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# @nekutima/provili-sdk
|
|
2
|
+
|
|
3
|
+
Nekutima's AI SDK. It provides two things:
|
|
4
|
+
|
|
5
|
+
1. **LLM Engine access layer** — a vendor-neutral, isomorphic (browser + Node) way to talk to an LLM provider. Configure an engine once and use the same `chat` / `chatStream` / `embed` / `health` surface regardless of vendor.
|
|
6
|
+
2. **Pro.vi.li platform client** — typed client for the Pro.vi.li backend (chat, sessions, agents, knowledge/RAG, prompts, users, roles, MCP).
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
npm install @nekutima/provili-sdk
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## LLM Engines
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
import { createEngineClient, validateEngineConfig } from '@nekutima/provili-sdk/llm-engines';
|
|
18
|
+
|
|
19
|
+
const engine = { type: 'deepseek' as const, apiKey: process.env.DEEPSEEK_API_KEY, model: 'deepseek-chat' };
|
|
20
|
+
|
|
21
|
+
const errors = validateEngineConfig(engine); // [] when valid
|
|
22
|
+
if (errors.length) throw new Error(errors.map((e) => e.message).join(', '));
|
|
23
|
+
|
|
24
|
+
const client = createEngineClient(engine);
|
|
25
|
+
|
|
26
|
+
const health = await client.health(); // { ok, latencyMs, category? }
|
|
27
|
+
const answer = await client.chat([{ role: 'user', content: 'Hello' }]);
|
|
28
|
+
|
|
29
|
+
for await (const delta of client.chatStream([{ role: 'user', content: 'Tell me a story' }])) {
|
|
30
|
+
process.stdout.write(delta);
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Supported types: `ollama`, `deepseek`, `openai`, `anthropic`, `gemini`, `xai`, `openrouter`, `custom`
|
|
35
|
+
(any OpenAI-compatible endpoint). Each type declares its own minimal configuration via
|
|
36
|
+
`ENGINE_TYPE_DESCRIPTORS`; vendor URL/auth/streaming differences are handled inside the SDK.
|
|
37
|
+
|
|
38
|
+
The layer is isomorphic: it uses the global `fetch` (injectable via `createEngineClient(config, { fetch })`)
|
|
39
|
+
and never touches Node-only APIs, so the same code runs in a browser or on a server.
|
|
40
|
+
|
|
41
|
+
## Platform client
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
import { createProviliSDK } from '@nekutima/provili-sdk';
|
|
45
|
+
|
|
46
|
+
const sdk = createProviliSDK({ baseURL: 'https://your-provili-host/api' });
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Building
|
|
50
|
+
|
|
51
|
+
```sh
|
|
52
|
+
npm run build:sdk # from the repo root
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## License
|
|
56
|
+
|
|
57
|
+
MIT — see [LICENSE](./LICENSE).
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { AxiosRequestConfig } from "axios";
|
|
2
|
+
import { AuthConfig } from "../models/auth.model";
|
|
3
|
+
import { RateLimitConfig } from "./rate-limiter";
|
|
4
|
+
export interface ProviliConfig {
|
|
5
|
+
baseURL: string;
|
|
6
|
+
timeout?: number;
|
|
7
|
+
headers?: Record<string, string>;
|
|
8
|
+
withCredentials?: boolean;
|
|
9
|
+
auth?: AuthConfig;
|
|
10
|
+
rateLimit?: RateLimitConfig;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* HTTP client for Pro.vi.li SDK
|
|
14
|
+
* Based on Biome SDK patterns with axios integration
|
|
15
|
+
*/
|
|
16
|
+
export declare class ProviliHttpClient {
|
|
17
|
+
private config;
|
|
18
|
+
static onAuthExpired: (() => void) | null;
|
|
19
|
+
private readonly axiosInstance;
|
|
20
|
+
private currentAuth?;
|
|
21
|
+
private rateLimiter?;
|
|
22
|
+
/**
|
|
23
|
+
* Get the base URL configured for this client
|
|
24
|
+
*/
|
|
25
|
+
get baseURL(): string;
|
|
26
|
+
constructor(config: ProviliConfig);
|
|
27
|
+
/**
|
|
28
|
+
* Perform GET request
|
|
29
|
+
*/
|
|
30
|
+
get<T>(url: string, config?: AxiosRequestConfig): Promise<T>;
|
|
31
|
+
/**
|
|
32
|
+
* Perform POST request
|
|
33
|
+
*/
|
|
34
|
+
post<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>;
|
|
35
|
+
/**
|
|
36
|
+
* Perform PUT request
|
|
37
|
+
*/
|
|
38
|
+
put<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>;
|
|
39
|
+
/**
|
|
40
|
+
* Perform PATCH request
|
|
41
|
+
*/
|
|
42
|
+
patch<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>;
|
|
43
|
+
/**
|
|
44
|
+
* Perform DELETE request
|
|
45
|
+
*/
|
|
46
|
+
delete<T = void>(url: string, config?: AxiosRequestConfig): Promise<T>;
|
|
47
|
+
/**
|
|
48
|
+
* Set default headers
|
|
49
|
+
*/
|
|
50
|
+
setHeader(name: string, value: string): void;
|
|
51
|
+
/**
|
|
52
|
+
* Remove default header
|
|
53
|
+
*/
|
|
54
|
+
removeHeader(name: string): void;
|
|
55
|
+
/**
|
|
56
|
+
* Set authentication
|
|
57
|
+
*/
|
|
58
|
+
setAuth(auth: AuthConfig): void;
|
|
59
|
+
/**
|
|
60
|
+
* Get current authentication config
|
|
61
|
+
*/
|
|
62
|
+
getAuth(): AuthConfig | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Clear authentication
|
|
65
|
+
*/
|
|
66
|
+
clearAuth(): void;
|
|
67
|
+
/**
|
|
68
|
+
* Apply current authentication to headers
|
|
69
|
+
*/
|
|
70
|
+
private applyAuth;
|
|
71
|
+
/**
|
|
72
|
+
* Get rate limiter status
|
|
73
|
+
*/
|
|
74
|
+
getRateLimitStatus(): {
|
|
75
|
+
availableTokens: number;
|
|
76
|
+
maxTokens: number;
|
|
77
|
+
timeUntilNextToken: number;
|
|
78
|
+
} | undefined;
|
|
79
|
+
/**
|
|
80
|
+
* Setup request and response interceptors
|
|
81
|
+
*/
|
|
82
|
+
private setupInterceptors;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/core/http-client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAiB,kBAAkB,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAe,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED;;;GAGG;AACH,qBAAa,iBAAiB;IAcd,OAAO,CAAC,MAAM;IAb1B,MAAM,CAAC,aAAa,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAQ;IAEjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,WAAW,CAAC,CAAc;IAElC;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAEpB;gBAEmB,MAAM,EAAE,aAAa;IAoBzC;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKlE;;OAEG;IACG,IAAI,CAAC,CAAC,EACR,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,GAAG,EACV,MAAM,CAAC,EAAE,kBAAkB,GAC5B,OAAO,CAAC,CAAC,CAAC;IAKb;;OAEG;IACG,GAAG,CAAC,CAAC,EACP,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,GAAG,EACV,MAAM,CAAC,EAAE,kBAAkB,GAC5B,OAAO,CAAC,CAAC,CAAC;IAKb;;OAEG;IACG,KAAK,CAAC,CAAC,EACT,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,GAAG,EACV,MAAM,CAAC,EAAE,kBAAkB,GAC5B,OAAO,CAAC,CAAC,CAAC;IAKb;;OAEG;IACG,MAAM,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAK5E;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI5C;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAK/B;;OAEG;IACH,OAAO,IAAI,UAAU,GAAG,SAAS;IAIjC;;OAEG;IACH,SAAS,IAAI,IAAI;IAMjB;;OAEG;IACH,OAAO,CAAC,SAAS;IAejB;;OAEG;IACH,kBAAkB;;;;;IAIlB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAuD5B"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProviliHttpClient = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const axios_1 = tslib_1.__importDefault(require("axios"));
|
|
6
|
+
const rate_limiter_1 = require("./rate-limiter");
|
|
7
|
+
/**
|
|
8
|
+
* HTTP client for Pro.vi.li SDK
|
|
9
|
+
* Based on Biome SDK patterns with axios integration
|
|
10
|
+
*/
|
|
11
|
+
class ProviliHttpClient {
|
|
12
|
+
/**
|
|
13
|
+
* Get the base URL configured for this client
|
|
14
|
+
*/
|
|
15
|
+
get baseURL() {
|
|
16
|
+
return this.config.baseURL;
|
|
17
|
+
}
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.config = config;
|
|
20
|
+
this.currentAuth = config.auth;
|
|
21
|
+
if (config.rateLimit) {
|
|
22
|
+
this.rateLimiter = new rate_limiter_1.RateLimiter(config.rateLimit);
|
|
23
|
+
}
|
|
24
|
+
this.axiosInstance = axios_1.default.create({
|
|
25
|
+
baseURL: config.baseURL,
|
|
26
|
+
timeout: config.timeout || 30000,
|
|
27
|
+
headers: {
|
|
28
|
+
...config.headers,
|
|
29
|
+
},
|
|
30
|
+
withCredentials: config.withCredentials !== undefined ? config.withCredentials : true,
|
|
31
|
+
});
|
|
32
|
+
this.setupInterceptors();
|
|
33
|
+
this.applyAuth();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Perform GET request
|
|
37
|
+
*/
|
|
38
|
+
async get(url, config) {
|
|
39
|
+
const response = await this.axiosInstance.get(url, config);
|
|
40
|
+
return response.data;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Perform POST request
|
|
44
|
+
*/
|
|
45
|
+
async post(url, data, config) {
|
|
46
|
+
const response = await this.axiosInstance.post(url, data, config);
|
|
47
|
+
return response.data;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Perform PUT request
|
|
51
|
+
*/
|
|
52
|
+
async put(url, data, config) {
|
|
53
|
+
const response = await this.axiosInstance.put(url, data, config);
|
|
54
|
+
return response.data;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Perform PATCH request
|
|
58
|
+
*/
|
|
59
|
+
async patch(url, data, config) {
|
|
60
|
+
const response = await this.axiosInstance.patch(url, data, config);
|
|
61
|
+
return response.data;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Perform DELETE request
|
|
65
|
+
*/
|
|
66
|
+
async delete(url, config) {
|
|
67
|
+
const response = await this.axiosInstance.delete(url, config);
|
|
68
|
+
return response.data;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Set default headers
|
|
72
|
+
*/
|
|
73
|
+
setHeader(name, value) {
|
|
74
|
+
this.axiosInstance.defaults.headers.common[name] = value;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Remove default header
|
|
78
|
+
*/
|
|
79
|
+
removeHeader(name) {
|
|
80
|
+
delete this.axiosInstance.defaults.headers.common[name];
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Set authentication
|
|
84
|
+
*/
|
|
85
|
+
setAuth(auth) {
|
|
86
|
+
this.currentAuth = auth;
|
|
87
|
+
this.applyAuth();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get current authentication config
|
|
91
|
+
*/
|
|
92
|
+
getAuth() {
|
|
93
|
+
return this.currentAuth;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Clear authentication
|
|
97
|
+
*/
|
|
98
|
+
clearAuth() {
|
|
99
|
+
this.currentAuth = undefined;
|
|
100
|
+
this.removeHeader('Authorization');
|
|
101
|
+
this.removeHeader('X-API-Key');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Apply current authentication to headers
|
|
105
|
+
*/
|
|
106
|
+
applyAuth() {
|
|
107
|
+
if (!this.currentAuth) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (this.currentAuth.method === 'api-key') {
|
|
111
|
+
// Use HTTP Basic auth for API keys
|
|
112
|
+
const credentials = btoa(`${this.currentAuth.apiKey}:`);
|
|
113
|
+
this.setHeader('Authorization', `Basic ${credentials}`);
|
|
114
|
+
}
|
|
115
|
+
else if (this.currentAuth.method === 'jwt') {
|
|
116
|
+
// Use Bearer token for JWT
|
|
117
|
+
this.setHeader('Authorization', `Bearer ${this.currentAuth.token}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get rate limiter status
|
|
122
|
+
*/
|
|
123
|
+
getRateLimitStatus() {
|
|
124
|
+
return this.rateLimiter?.getStatus();
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Setup request and response interceptors
|
|
128
|
+
*/
|
|
129
|
+
setupInterceptors() {
|
|
130
|
+
// Request interceptor
|
|
131
|
+
this.axiosInstance.interceptors.request.use((config) => {
|
|
132
|
+
// Ensure config has headers
|
|
133
|
+
if (!config.headers) {
|
|
134
|
+
config.headers = {};
|
|
135
|
+
}
|
|
136
|
+
// Check rate limit before making request
|
|
137
|
+
if (this.rateLimiter) {
|
|
138
|
+
const canProceed = this.rateLimiter.consumeToken();
|
|
139
|
+
if (!canProceed) {
|
|
140
|
+
const waitTime = this.rateLimiter.getTimeUntilNextToken();
|
|
141
|
+
throw new Error(`Rate limit exceeded. Try again in ${Math.ceil(waitTime / 1000)} seconds.`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Ensure auth headers are set
|
|
145
|
+
if (this.currentAuth) {
|
|
146
|
+
if (this.currentAuth.method === 'api-key') {
|
|
147
|
+
const credentials = btoa(`${this.currentAuth.apiKey}:`);
|
|
148
|
+
config.headers.Authorization = `Basic ${credentials}`;
|
|
149
|
+
}
|
|
150
|
+
else if (this.currentAuth.method === 'jwt') {
|
|
151
|
+
config.headers.Authorization = `Bearer ${this.currentAuth.token}`;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Ensure proper content type for non-FormData requests
|
|
155
|
+
if (config.data && !(config.data instanceof FormData)) {
|
|
156
|
+
config.headers['Content-Type'] = 'application/json';
|
|
157
|
+
}
|
|
158
|
+
return config;
|
|
159
|
+
}, (error) => Promise.reject(error));
|
|
160
|
+
// Response interceptor for error handling
|
|
161
|
+
this.axiosInstance.interceptors.response.use((response) => response, (error) => {
|
|
162
|
+
// Handle rate limit responses from server
|
|
163
|
+
if (error.response?.status === 429) {
|
|
164
|
+
// Server rate limit - could implement backoff here
|
|
165
|
+
}
|
|
166
|
+
// Handle common error scenarios
|
|
167
|
+
if (error.response?.status === 401) {
|
|
168
|
+
this.clearAuth();
|
|
169
|
+
ProviliHttpClient.onAuthExpired?.();
|
|
170
|
+
}
|
|
171
|
+
return Promise.reject(error);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
exports.ProviliHttpClient = ProviliHttpClient;
|
|
176
|
+
ProviliHttpClient.onAuthExpired = null;
|
|
177
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/core/http-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
// Core infrastructure
|
|
5
|
+
tslib_1.__exportStar(require("./http-client"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./rate-limiter"), exports);
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;AAAA,sBAAsB;AACtB,wDAA8B;AAC9B,yDAA+B"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate limiter for Pro.vi.li SDK
|
|
3
|
+
* Implements token bucket algorithm for request rate limiting
|
|
4
|
+
*/
|
|
5
|
+
export interface RateLimitConfig {
|
|
6
|
+
requestsPerMinute: number;
|
|
7
|
+
burstLimit?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare class RateLimiter {
|
|
10
|
+
private tokens;
|
|
11
|
+
private lastRefill;
|
|
12
|
+
private readonly maxTokens;
|
|
13
|
+
private readonly refillRate;
|
|
14
|
+
constructor(config: RateLimitConfig);
|
|
15
|
+
/**
|
|
16
|
+
* Check if a request can be made
|
|
17
|
+
*/
|
|
18
|
+
canMakeRequest(): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Consume a token for a request
|
|
21
|
+
*/
|
|
22
|
+
consumeToken(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Get time until next token is available (in milliseconds)
|
|
25
|
+
*/
|
|
26
|
+
getTimeUntilNextToken(): number;
|
|
27
|
+
/**
|
|
28
|
+
* Refill tokens based on elapsed time
|
|
29
|
+
*/
|
|
30
|
+
private refillTokens;
|
|
31
|
+
/**
|
|
32
|
+
* Get current status
|
|
33
|
+
*/
|
|
34
|
+
getStatus(): {
|
|
35
|
+
availableTokens: number;
|
|
36
|
+
maxTokens: number;
|
|
37
|
+
timeUntilNextToken: number;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/core/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,EAAE,eAAe;IAOnC;;OAEG;IACH,cAAc,IAAI,OAAO;IAKzB;;OAEG;IACH,YAAY,IAAI,OAAO;IAQvB;;OAEG;IACH,qBAAqB,IAAI,MAAM;IAQ/B;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,SAAS;;;;;CAQZ"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Rate limiter for Pro.vi.li SDK
|
|
4
|
+
* Implements token bucket algorithm for request rate limiting
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RateLimiter = void 0;
|
|
8
|
+
class RateLimiter {
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.maxTokens = config.burstLimit || config.requestsPerMinute;
|
|
11
|
+
this.tokens = this.maxTokens;
|
|
12
|
+
this.lastRefill = Date.now();
|
|
13
|
+
this.refillRate = config.requestsPerMinute / 60000; // tokens per millisecond
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Check if a request can be made
|
|
17
|
+
*/
|
|
18
|
+
canMakeRequest() {
|
|
19
|
+
this.refillTokens();
|
|
20
|
+
return this.tokens >= 1;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Consume a token for a request
|
|
24
|
+
*/
|
|
25
|
+
consumeToken() {
|
|
26
|
+
if (!this.canMakeRequest()) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
this.tokens -= 1;
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get time until next token is available (in milliseconds)
|
|
34
|
+
*/
|
|
35
|
+
getTimeUntilNextToken() {
|
|
36
|
+
if (this.tokens >= 1) {
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
const tokensNeeded = 1 - this.tokens;
|
|
40
|
+
return tokensNeeded / this.refillRate;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Refill tokens based on elapsed time
|
|
44
|
+
*/
|
|
45
|
+
refillTokens() {
|
|
46
|
+
const now = Date.now();
|
|
47
|
+
const elapsed = now - this.lastRefill;
|
|
48
|
+
const tokensToAdd = elapsed * this.refillRate;
|
|
49
|
+
this.tokens = Math.min(this.maxTokens, this.tokens + tokensToAdd);
|
|
50
|
+
this.lastRefill = now;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get current status
|
|
54
|
+
*/
|
|
55
|
+
getStatus() {
|
|
56
|
+
this.refillTokens();
|
|
57
|
+
return {
|
|
58
|
+
availableTokens: Math.floor(this.tokens),
|
|
59
|
+
maxTokens: this.maxTokens,
|
|
60
|
+
timeUntilNextToken: this.getTimeUntilNextToken()
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.RateLimiter = RateLimiter;
|
|
65
|
+
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/core/rate-limiter.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAOH,MAAa,WAAW;IAMpB,YAAY,MAAuB;QAC/B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,iBAAiB,CAAC;QAC/D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,iBAAiB,GAAG,KAAK,CAAC,CAAC,yBAAyB;IACjF,CAAC;IAED;;OAEG;IACH,cAAc;QACV,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,YAAY;QACR,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,qBAAqB;QACjB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,CAAC;QACb,CAAC;QACD,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACrC,OAAO,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC;IAC1C,CAAC;IAED;;OAEG;IACK,YAAY;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;QACtC,MAAM,WAAW,GAAG,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;QAE9C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;QAClE,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,SAAS;QACL,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO;YACH,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;YACxC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,kBAAkB,EAAE,IAAI,CAAC,qBAAqB,EAAE;SACnD,CAAC;IACN,CAAC;CACJ;AAlED,kCAkEC"}
|