@thewhateverapp/platform 0.0.1
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 +223 -0
- package/dist/ai/mock.d.ts +14 -0
- package/dist/ai/mock.d.ts.map +1 -0
- package/dist/ai/mock.js +38 -0
- package/dist/ai/mock.js.map +1 -0
- package/dist/ai/production.d.ts +17 -0
- package/dist/ai/production.d.ts.map +1 -0
- package/dist/ai/production.js +41 -0
- package/dist/ai/production.js.map +1 -0
- package/dist/analytics/client.d.ts +21 -0
- package/dist/analytics/client.d.ts.map +1 -0
- package/dist/analytics/client.js +60 -0
- package/dist/analytics/client.js.map +1 -0
- package/dist/assets/client.d.ts +23 -0
- package/dist/assets/client.d.ts.map +1 -0
- package/dist/assets/client.js +105 -0
- package/dist/assets/client.js.map +1 -0
- package/dist/auth/client.d.ts +20 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +53 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/types.d.ts +50 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +5 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/db/mock.d.ts +43 -0
- package/dist/db/mock.d.ts.map +1 -0
- package/dist/db/mock.js +343 -0
- package/dist/db/mock.js.map +1 -0
- package/dist/db/production.d.ts +16 -0
- package/dist/db/production.d.ts.map +1 -0
- package/dist/db/production.js +77 -0
- package/dist/db/production.js.map +1 -0
- package/dist/edge/database/index.d.ts +46 -0
- package/dist/edge/database/index.d.ts.map +1 -0
- package/dist/edge/database/index.js +82 -0
- package/dist/edge/database/index.js.map +1 -0
- package/dist/edge/database/providers/flex-db.d.ts +22 -0
- package/dist/edge/database/providers/flex-db.d.ts.map +1 -0
- package/dist/edge/database/providers/flex-db.js +351 -0
- package/dist/edge/database/providers/flex-db.js.map +1 -0
- package/dist/edge/database/providers/index.d.ts +7 -0
- package/dist/edge/database/providers/index.d.ts.map +1 -0
- package/dist/edge/database/providers/index.js +11 -0
- package/dist/edge/database/providers/index.js.map +1 -0
- package/dist/edge/database/types.d.ts +148 -0
- package/dist/edge/database/types.d.ts.map +1 -0
- package/dist/edge/database/types.js +8 -0
- package/dist/edge/database/types.js.map +1 -0
- package/dist/edge/index.d.ts +12 -0
- package/dist/edge/index.d.ts.map +1 -0
- package/dist/edge/index.js +12 -0
- package/dist/edge/index.js.map +1 -0
- package/dist/edge/kv/index.d.ts +50 -0
- package/dist/edge/kv/index.d.ts.map +1 -0
- package/dist/edge/kv/index.js +83 -0
- package/dist/edge/kv/index.js.map +1 -0
- package/dist/edge/kv/providers/cloudflare-kv.d.ts +31 -0
- package/dist/edge/kv/providers/cloudflare-kv.d.ts.map +1 -0
- package/dist/edge/kv/providers/cloudflare-kv.js +115 -0
- package/dist/edge/kv/providers/cloudflare-kv.js.map +1 -0
- package/dist/edge/kv/providers/index.d.ts +7 -0
- package/dist/edge/kv/providers/index.d.ts.map +1 -0
- package/dist/edge/kv/providers/index.js +10 -0
- package/dist/edge/kv/providers/index.js.map +1 -0
- package/dist/edge/kv/types.d.ts +155 -0
- package/dist/edge/kv/types.d.ts.map +1 -0
- package/dist/edge/kv/types.js +8 -0
- package/dist/edge/kv/types.js.map +1 -0
- package/dist/edge/storage/index.d.ts +50 -0
- package/dist/edge/storage/index.d.ts.map +1 -0
- package/dist/edge/storage/index.js +83 -0
- package/dist/edge/storage/index.js.map +1 -0
- package/dist/edge/storage/providers/cloudflare-r2.d.ts +28 -0
- package/dist/edge/storage/providers/cloudflare-r2.d.ts.map +1 -0
- package/dist/edge/storage/providers/cloudflare-r2.js +178 -0
- package/dist/edge/storage/providers/cloudflare-r2.js.map +1 -0
- package/dist/edge/storage/providers/index.d.ts +7 -0
- package/dist/edge/storage/providers/index.d.ts.map +1 -0
- package/dist/edge/storage/providers/index.js +10 -0
- package/dist/edge/storage/providers/index.js.map +1 -0
- package/dist/edge/storage/types.d.ts +305 -0
- package/dist/edge/storage/types.d.ts.map +1 -0
- package/dist/edge/storage/types.js +8 -0
- package/dist/edge/storage/types.js.map +1 -0
- package/dist/identity/client.d.ts +20 -0
- package/dist/identity/client.d.ts.map +1 -0
- package/dist/identity/client.js +40 -0
- package/dist/identity/client.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/notifications/client.d.ts +20 -0
- package/dist/notifications/client.d.ts.map +1 -0
- package/dist/notifications/client.js +38 -0
- package/dist/notifications/client.js.map +1 -0
- package/dist/payments/client.d.ts +21 -0
- package/dist/payments/client.d.ts.map +1 -0
- package/dist/payments/client.js +52 -0
- package/dist/payments/client.js.map +1 -0
- package/dist/platform.d.ts +65 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +254 -0
- package/dist/platform.js.map +1 -0
- package/dist/social/client.d.ts +29 -0
- package/dist/social/client.d.ts.map +1 -0
- package/dist/social/client.js +83 -0
- package/dist/social/client.js.map +1 -0
- package/dist/storage/mock.d.ts +27 -0
- package/dist/storage/mock.d.ts.map +1 -0
- package/dist/storage/mock.js +102 -0
- package/dist/storage/mock.js.map +1 -0
- package/dist/storage/production.d.ts +28 -0
- package/dist/storage/production.d.ts.map +1 -0
- package/dist/storage/production.js +75 -0
- package/dist/storage/production.js.map +1 -0
- package/dist/types.d.ts +399 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +51 -0
package/README.md
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# @thewhateverapp/platform
|
|
2
|
+
|
|
3
|
+
> ⚠️ **Beta Release (v0.0.1)**: This package is in early preview. Backend platform API is in development. Use `mock: true` mode for local development and testing. Production mode will be available when the platform API is deployed.
|
|
4
|
+
|
|
5
|
+
Universal SDK for building apps on The Whatever App platform. Provides domain-specific services for storage, AI, database, analytics, identity, and more.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **Auth Service**: OAuth-like permission system for app access to user data
|
|
10
|
+
- **Storage Service**: Persistent KV storage scoped per app
|
|
11
|
+
- **Database Service**: MongoDB-compatible document storage
|
|
12
|
+
- **AI Service**: Multi-provider AI access (Claude, GPT, Gemini)
|
|
13
|
+
- **Analytics Service**: Event tracking and metrics
|
|
14
|
+
- **Identity Service**: User authentication across apps
|
|
15
|
+
- **Assets Service**: File storage with CDN delivery
|
|
16
|
+
- **Social Service**: Comments, likes, shares across apps
|
|
17
|
+
|
|
18
|
+
### Coming Soon
|
|
19
|
+
|
|
20
|
+
- **Payments Service**: Accept payments (Stripe + crypto) - _Feature gated_
|
|
21
|
+
- **Notifications Service**: Email, push, and in-app notifications - _Feature gated_
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install @thewhateverapp/platform
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Quick Start
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { createPlatform } from '@thewhateverapp/platform';
|
|
33
|
+
|
|
34
|
+
// In your app's worker
|
|
35
|
+
export default {
|
|
36
|
+
async fetch(request, env, ctx) {
|
|
37
|
+
const platform = createPlatform({
|
|
38
|
+
env,
|
|
39
|
+
request,
|
|
40
|
+
waitUntil: ctx.waitUntil
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const { storage, db, ai, analytics } = platform.getServices();
|
|
44
|
+
|
|
45
|
+
// Use services
|
|
46
|
+
await storage.set('user:123', { score: 100 });
|
|
47
|
+
const user = await db.collection('users').findOne({ _id: '123' });
|
|
48
|
+
const response = await ai.ask('Generate a greeting');
|
|
49
|
+
await analytics.track('page_view', { path: '/home' });
|
|
50
|
+
|
|
51
|
+
return new Response('Hello from Whatever!');
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Architecture
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
App Code (using @thewhateverapp/platform)
|
|
60
|
+
↓
|
|
61
|
+
WhateverPlatform Container (DI)
|
|
62
|
+
↓
|
|
63
|
+
7 Services (abstracted)
|
|
64
|
+
↓
|
|
65
|
+
Platform API (platform.thewhatever.app)
|
|
66
|
+
↓
|
|
67
|
+
Backend Microservices (Kubernetes)
|
|
68
|
+
↓
|
|
69
|
+
MongoDB + Cloudflare
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Services
|
|
73
|
+
|
|
74
|
+
### Auth Service
|
|
75
|
+
|
|
76
|
+
OAuth-like permission system where apps start with minimal access (user ID only) and request additional permissions.
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
import { AuthAPI } from '@thewhateverapp/platform';
|
|
80
|
+
|
|
81
|
+
const auth = new AuthAPI({
|
|
82
|
+
apiUrl: 'https://platform.thewhatever.app',
|
|
83
|
+
apiKey: env.PLATFORM_API_KEY
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// Verify user access token from tile SDK
|
|
87
|
+
const payload = await auth.verifyUserToken(token);
|
|
88
|
+
console.log(payload.userId, payload.scopes);
|
|
89
|
+
|
|
90
|
+
// Get user context with granted scopes
|
|
91
|
+
const user = await auth.getUserContext(userId, ['profile', 'email']);
|
|
92
|
+
console.log(user.username, user.email);
|
|
93
|
+
|
|
94
|
+
// Check what permissions user granted
|
|
95
|
+
const perms = await auth.checkPermissions(userId, appId, ['email', 'wallet']);
|
|
96
|
+
console.log(perms.granted, perms.pending, perms.denied);
|
|
97
|
+
|
|
98
|
+
// Grant permissions (called by parent window)
|
|
99
|
+
await auth.grantPermissions(userId, appId, ['profile', 'email']);
|
|
100
|
+
|
|
101
|
+
// Revoke app permissions
|
|
102
|
+
await auth.revokePermissions(userId, appId);
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Permission Scopes:**
|
|
106
|
+
- `id` - User ID (always granted)
|
|
107
|
+
- `profile` - Username, avatar, display name
|
|
108
|
+
- `email` - Email address
|
|
109
|
+
- `wallet` - Wallet addresses
|
|
110
|
+
- `analytics:read` - View user analytics
|
|
111
|
+
- `analytics:write` - Track analytics (auto-granted)
|
|
112
|
+
- `storage:read` - Read storage (auto-granted)
|
|
113
|
+
- `storage:write` - Write storage (auto-granted)
|
|
114
|
+
|
|
115
|
+
### Storage Service
|
|
116
|
+
```typescript
|
|
117
|
+
await storage.set('key', value, { ttl: 3600 });
|
|
118
|
+
const data = await storage.get('key');
|
|
119
|
+
await storage.delete('key');
|
|
120
|
+
const keys = await storage.list({ prefix: 'user:' });
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Database Service
|
|
124
|
+
```typescript
|
|
125
|
+
const users = db.collection('users');
|
|
126
|
+
await users.insertOne({ name: 'Alice', score: 100 });
|
|
127
|
+
const user = await users.findOne({ name: 'Alice' });
|
|
128
|
+
await users.updateOne({ name: 'Alice' }, { $inc: { score: 50 } });
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### AI Service
|
|
132
|
+
```typescript
|
|
133
|
+
const response = await ai.ask('What is the meaning of life?', {
|
|
134
|
+
provider: 'anthropic',
|
|
135
|
+
maxTokens: 500
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const result = await ai.prompt({
|
|
139
|
+
prompt: 'Analyze this image',
|
|
140
|
+
capabilities: ['vision'],
|
|
141
|
+
images: [{ type: 'url', data: 'https://...' }]
|
|
142
|
+
});
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Analytics Service
|
|
146
|
+
```typescript
|
|
147
|
+
await analytics.track('button_click', { button: 'submit' });
|
|
148
|
+
await analytics.pageView('/home');
|
|
149
|
+
const metrics = await analytics.getMetrics('7d');
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Identity Service
|
|
153
|
+
```typescript
|
|
154
|
+
const { userId, isNew } = await identity.resolve({
|
|
155
|
+
email: 'user@example.com'
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
await identity.link(userId, { walletAddress: '0x...' });
|
|
159
|
+
const user = await identity.getUser(userId);
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Assets Service
|
|
163
|
+
```typescript
|
|
164
|
+
const result = await assets.upload('images/avatar.jpg', buffer, {
|
|
165
|
+
contentType: 'image/jpeg'
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
const url = assets.getUrl('images/avatar.jpg');
|
|
169
|
+
await assets.delete('images/avatar.jpg');
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Payments Service
|
|
173
|
+
```typescript
|
|
174
|
+
const session = await payments.createCheckout({
|
|
175
|
+
amount: 999, // cents
|
|
176
|
+
currency: 'USD',
|
|
177
|
+
description: 'Premium feature'
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
const status = await payments.getStatus(session.id);
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Notifications Service
|
|
184
|
+
```typescript
|
|
185
|
+
await notifications.send({
|
|
186
|
+
userId: 'user_123',
|
|
187
|
+
channel: 'email',
|
|
188
|
+
template: 'welcome',
|
|
189
|
+
data: { name: 'Alice' }
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
await notifications.schedule({
|
|
193
|
+
userId: 'user_123',
|
|
194
|
+
channel: 'push',
|
|
195
|
+
message: 'Your report is ready',
|
|
196
|
+
scheduledFor: '2025-12-25T10:00:00Z'
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Social Service
|
|
201
|
+
```typescript
|
|
202
|
+
await social.addComment({
|
|
203
|
+
entityId: 'post_123',
|
|
204
|
+
userId: 'user_456',
|
|
205
|
+
content: 'Great post!'
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
await social.like('post_123', 'user_456');
|
|
209
|
+
const likes = await social.getLikes('post_123');
|
|
210
|
+
const comments = await social.getComments('post_123');
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Security
|
|
214
|
+
|
|
215
|
+
- All services are automatically scoped by app ID
|
|
216
|
+
- Rate limiting enforced per app
|
|
217
|
+
- API keys never exposed to client
|
|
218
|
+
- All data isolated between apps
|
|
219
|
+
- Type-safe APIs with full TypeScript support
|
|
220
|
+
|
|
221
|
+
## License
|
|
222
|
+
|
|
223
|
+
Proprietary - All rights reserved
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock AI service
|
|
3
|
+
*/
|
|
4
|
+
import type { AIService, AskOptions, PromptRequest, PromptResponse } from '../types';
|
|
5
|
+
export declare class MockAI implements AIService {
|
|
6
|
+
private debug;
|
|
7
|
+
constructor(config?: {
|
|
8
|
+
debug?: boolean;
|
|
9
|
+
});
|
|
10
|
+
private log;
|
|
11
|
+
ask(prompt: string, options?: AskOptions): Promise<string>;
|
|
12
|
+
prompt(request: PromptRequest): Promise<PromptResponse>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/ai/mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,aAAa,EACb,cAAc,EACf,MAAM,UAAU,CAAC;AAElB,qBAAa,MAAO,YAAW,SAAS;IACtC,OAAO,CAAC,KAAK,CAAU;gBAEX,MAAM,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;IAI5C,OAAO,CAAC,GAAG;IAML,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAO1D,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;CAoB9D"}
|
package/dist/ai/mock.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock AI service
|
|
3
|
+
*/
|
|
4
|
+
export class MockAI {
|
|
5
|
+
debug;
|
|
6
|
+
constructor(config = {}) {
|
|
7
|
+
this.debug = config.debug || false;
|
|
8
|
+
}
|
|
9
|
+
log(message, ...args) {
|
|
10
|
+
if (this.debug) {
|
|
11
|
+
console.log(`[MockAI] ${message}`, ...args);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
async ask(prompt, options) {
|
|
15
|
+
this.log('Ask:', { prompt: prompt.substring(0, 100), options });
|
|
16
|
+
// Return a mock response
|
|
17
|
+
return `Mock AI response to: ${prompt.substring(0, 50)}...`;
|
|
18
|
+
}
|
|
19
|
+
async prompt(request) {
|
|
20
|
+
this.log('Prompt:', {
|
|
21
|
+
prompt: request.prompt.substring(0, 100),
|
|
22
|
+
provider: request.provider,
|
|
23
|
+
});
|
|
24
|
+
const text = `Mock AI response to: ${request.prompt.substring(0, 50)}...`;
|
|
25
|
+
return {
|
|
26
|
+
text,
|
|
27
|
+
provider: request.provider || 'mock',
|
|
28
|
+
model: request.model || 'mock-1.0',
|
|
29
|
+
tokensUsed: {
|
|
30
|
+
input: Math.floor(request.prompt.length / 4),
|
|
31
|
+
output: Math.floor(text.length / 4),
|
|
32
|
+
total: Math.floor((request.prompt.length + text.length) / 4),
|
|
33
|
+
},
|
|
34
|
+
cached: false,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/ai/mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,OAAO,MAAM;IACT,KAAK,CAAU;IAEvB,YAAY,SAA8B,EAAE;QAC1C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;IACrC,CAAC;IAEO,GAAG,CAAC,OAAe,EAAE,GAAG,IAAW;QACzC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,OAAoB;QAC5C,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAEhE,yBAAyB;QACzB,OAAO,wBAAwB,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAsB;QACjC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;YACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,wBAAwB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC;QAE1E,OAAO;YACL,IAAI;YACJ,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM;YACpC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,UAAU;YAClC,UAAU,EAAE;gBACV,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC5C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;gBACnC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;aAC7D;YACD,MAAM,EAAE,KAAK;SACd,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Production AI service
|
|
3
|
+
*/
|
|
4
|
+
import type { AIService, AskOptions, PromptRequest, PromptResponse } from '../types';
|
|
5
|
+
interface ProductionAIConfig {
|
|
6
|
+
apiUrl: string;
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class ProductionAI implements AIService {
|
|
10
|
+
private config;
|
|
11
|
+
constructor(config: ProductionAIConfig);
|
|
12
|
+
private request;
|
|
13
|
+
ask(prompt: string, options?: AskOptions): Promise<string>;
|
|
14
|
+
prompt(request: PromptRequest): Promise<PromptResponse>;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=production.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"production.d.ts","sourceRoot":"","sources":["../../src/ai/production.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,aAAa,EACb,cAAc,EACf,MAAM,UAAU,CAAC;AAElB,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAa,YAAW,SAAS;IAChC,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,kBAAkB;YAEhC,OAAO;IAuBf,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAY1D,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;CAG9D"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Production AI service
|
|
3
|
+
*/
|
|
4
|
+
export class ProductionAI {
|
|
5
|
+
config;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
}
|
|
9
|
+
async request(endpoint, body) {
|
|
10
|
+
const headers = {
|
|
11
|
+
'Content-Type': 'application/json',
|
|
12
|
+
};
|
|
13
|
+
if (this.config.apiKey) {
|
|
14
|
+
headers['X-API-Key'] = this.config.apiKey;
|
|
15
|
+
}
|
|
16
|
+
const response = await fetch(`${this.config.apiUrl}/ai${endpoint}`, {
|
|
17
|
+
method: 'POST',
|
|
18
|
+
headers,
|
|
19
|
+
body: JSON.stringify(body),
|
|
20
|
+
});
|
|
21
|
+
if (!response.ok) {
|
|
22
|
+
const error = await response.json().catch(() => ({}));
|
|
23
|
+
throw new Error(error.error || `AI service error: ${response.statusText}`);
|
|
24
|
+
}
|
|
25
|
+
return response.json();
|
|
26
|
+
}
|
|
27
|
+
async ask(prompt, options) {
|
|
28
|
+
const result = await this.prompt({
|
|
29
|
+
prompt,
|
|
30
|
+
provider: options?.provider,
|
|
31
|
+
capabilities: options?.capabilities,
|
|
32
|
+
maxTokens: options?.maxTokens,
|
|
33
|
+
temperature: options?.temperature,
|
|
34
|
+
});
|
|
35
|
+
return result.text;
|
|
36
|
+
}
|
|
37
|
+
async prompt(request) {
|
|
38
|
+
return this.request('/prompt', request);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=production.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"production.js","sourceRoot":"","sources":["../../src/ai/production.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,MAAM,OAAO,YAAY;IACH;IAApB,YAAoB,MAA0B;QAA1B,WAAM,GAAN,MAAM,CAAoB;IAAG,CAAC;IAE1C,KAAK,CAAC,OAAO,CAAI,QAAgB,EAAE,IAAS;QAClD,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAC5C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,MAAM,QAAQ,EAAE,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAuB,CAAC;YAC5E,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,qBAAqB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,OAAoB;QAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;YAC/B,MAAM;YACN,QAAQ,EAAE,OAAO,EAAE,QAAQ;YAC3B,YAAY,EAAE,OAAO,EAAE,YAAY;YACnC,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,WAAW,EAAE,OAAO,EAAE,WAAW;SAClC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAsB;QACjC,OAAO,IAAI,CAAC,OAAO,CAAiB,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics service client
|
|
3
|
+
*/
|
|
4
|
+
import type { AnalyticsService, AnalyticsEvent, MetricsData, EventQueryOptions } from '../types';
|
|
5
|
+
interface AnalyticsConfig {
|
|
6
|
+
apiUrl: string;
|
|
7
|
+
apiKey: string;
|
|
8
|
+
appId: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class AnalyticsAPI implements AnalyticsService {
|
|
11
|
+
private config;
|
|
12
|
+
constructor(config: AnalyticsConfig);
|
|
13
|
+
private request;
|
|
14
|
+
track(event: string, properties?: Record<string, any>): Promise<void>;
|
|
15
|
+
pageView(path: string, properties?: Record<string, any>): Promise<void>;
|
|
16
|
+
identify(userId: string, traits?: Record<string, any>): Promise<void>;
|
|
17
|
+
getMetrics(period: string): Promise<MetricsData>;
|
|
18
|
+
getEvents(options?: EventQueryOptions): Promise<AnalyticsEvent[]>;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/analytics/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,YAAa,YAAW,gBAAgB;IACvC,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;YAE7B,OAAO;IAuBf,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIhD,SAAS,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAUxE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics service client
|
|
3
|
+
*/
|
|
4
|
+
export class AnalyticsAPI {
|
|
5
|
+
config;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
}
|
|
9
|
+
async request(method, path, body) {
|
|
10
|
+
const response = await fetch(`${this.config.apiUrl}/analytics${path}`, {
|
|
11
|
+
method,
|
|
12
|
+
headers: {
|
|
13
|
+
'Content-Type': 'application/json',
|
|
14
|
+
'X-API-Key': this.config.apiKey,
|
|
15
|
+
'X-App-ID': this.config.appId,
|
|
16
|
+
},
|
|
17
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
18
|
+
});
|
|
19
|
+
if (!response.ok) {
|
|
20
|
+
const error = await response.json().catch(() => ({}));
|
|
21
|
+
throw new Error(error.error || `Analytics error: ${response.statusText}`);
|
|
22
|
+
}
|
|
23
|
+
return response.json();
|
|
24
|
+
}
|
|
25
|
+
async track(event, properties) {
|
|
26
|
+
await this.request('POST', '/track', {
|
|
27
|
+
event,
|
|
28
|
+
properties,
|
|
29
|
+
timestamp: new Date().toISOString(),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async pageView(path, properties) {
|
|
33
|
+
await this.track('page_view', { path, ...properties });
|
|
34
|
+
}
|
|
35
|
+
async identify(userId, traits) {
|
|
36
|
+
await this.request('POST', '/identify', {
|
|
37
|
+
userId,
|
|
38
|
+
traits,
|
|
39
|
+
timestamp: new Date().toISOString(),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async getMetrics(period) {
|
|
43
|
+
return this.request('GET', `/metrics?period=${period}`);
|
|
44
|
+
}
|
|
45
|
+
async getEvents(options) {
|
|
46
|
+
const params = new URLSearchParams();
|
|
47
|
+
if (options?.event)
|
|
48
|
+
params.set('event', options.event);
|
|
49
|
+
if (options?.userId)
|
|
50
|
+
params.set('userId', options.userId);
|
|
51
|
+
if (options?.startDate)
|
|
52
|
+
params.set('startDate', options.startDate);
|
|
53
|
+
if (options?.endDate)
|
|
54
|
+
params.set('endDate', options.endDate);
|
|
55
|
+
if (options?.limit)
|
|
56
|
+
params.set('limit', options.limit.toString());
|
|
57
|
+
return this.request('GET', `/events?${params.toString()}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/analytics/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,MAAM,OAAO,YAAY;IACH;IAApB,YAAoB,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IAEvC,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,IAAU;QAEV,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,aAAa,IAAI,EAAE,EAAE;YACrE,MAAM;YACN,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC/B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;aAC9B;YACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAuB,CAAC;YAC5E,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,oBAAoB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,UAAgC;QACzD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE;YACnC,KAAK;YACL,UAAU;YACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,UAAgC;QAC3D,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,MAA4B;QACzD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE;YACtC,MAAM;YACN,MAAM;YACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAA2B;QACzC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,OAAO,EAAE,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,OAAO,EAAE,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,OAAO,EAAE,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,OAAO,EAAE,OAAO;YAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,OAAO,EAAE,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAElE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assets service client for file storage
|
|
3
|
+
*/
|
|
4
|
+
import type { AssetsService, UploadOptions, UploadResult, AssetInfo, AssetListOptions, AssetListResult } from '../types';
|
|
5
|
+
interface AssetsConfig {
|
|
6
|
+
apiUrl: string;
|
|
7
|
+
apiKey: string;
|
|
8
|
+
appId: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class AssetsAPI implements AssetsService {
|
|
11
|
+
private config;
|
|
12
|
+
constructor(config: AssetsConfig);
|
|
13
|
+
private request;
|
|
14
|
+
upload(path: string, data: ArrayBuffer | Blob | ReadableStream | string, options?: UploadOptions): Promise<UploadResult>;
|
|
15
|
+
get(path: string): Promise<AssetInfo | null>;
|
|
16
|
+
getUrl(path: string): string;
|
|
17
|
+
delete(path: string): Promise<boolean>;
|
|
18
|
+
deleteMany(paths: string[]): Promise<number>;
|
|
19
|
+
list(options?: AssetListOptions): Promise<AssetListResult>;
|
|
20
|
+
exists(path: string): Promise<boolean>;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/assets/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,UAAU,CAAC;AAElB,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,SAAU,YAAW,aAAa;IACjC,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;YAE1B,OAAO;IAkCf,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,cAAc,GAAG,MAAM,EAClD,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,CAAC;IA6BlB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAWlD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAItB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAO5C,IAAI,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAS1D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAI7C"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assets service client for file storage
|
|
3
|
+
*/
|
|
4
|
+
export class AssetsAPI {
|
|
5
|
+
config;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
}
|
|
9
|
+
async request(method, path, body, headers) {
|
|
10
|
+
const defaultHeaders = {
|
|
11
|
+
'X-API-Key': this.config.apiKey,
|
|
12
|
+
'X-App-ID': this.config.appId,
|
|
13
|
+
};
|
|
14
|
+
if (body && typeof body === 'object' && !(body instanceof FormData)) {
|
|
15
|
+
defaultHeaders['Content-Type'] = 'application/json';
|
|
16
|
+
}
|
|
17
|
+
const response = await fetch(`${this.config.apiUrl}/assets${path}`, {
|
|
18
|
+
method,
|
|
19
|
+
headers: { ...defaultHeaders, ...headers },
|
|
20
|
+
body: body instanceof FormData || typeof body === 'string'
|
|
21
|
+
? body
|
|
22
|
+
: body
|
|
23
|
+
? JSON.stringify(body)
|
|
24
|
+
: undefined,
|
|
25
|
+
});
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
const error = await response.json().catch(() => ({}));
|
|
28
|
+
throw new Error(error.error || `Assets error: ${response.statusText}`);
|
|
29
|
+
}
|
|
30
|
+
return response.json();
|
|
31
|
+
}
|
|
32
|
+
async upload(path, data, options) {
|
|
33
|
+
const formData = new FormData();
|
|
34
|
+
formData.append('path', path);
|
|
35
|
+
if (data instanceof ArrayBuffer) {
|
|
36
|
+
formData.append('file', new Blob([data]));
|
|
37
|
+
}
|
|
38
|
+
else if (data instanceof Blob) {
|
|
39
|
+
formData.append('file', data);
|
|
40
|
+
}
|
|
41
|
+
else if (typeof data === 'string') {
|
|
42
|
+
formData.append('file', new Blob([data]));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
throw new Error('Unsupported data type for upload');
|
|
46
|
+
}
|
|
47
|
+
if (options?.contentType) {
|
|
48
|
+
formData.append('contentType', options.contentType);
|
|
49
|
+
}
|
|
50
|
+
if (options?.cacheControl) {
|
|
51
|
+
formData.append('cacheControl', options.cacheControl);
|
|
52
|
+
}
|
|
53
|
+
if (options?.metadata) {
|
|
54
|
+
formData.append('metadata', JSON.stringify(options.metadata));
|
|
55
|
+
}
|
|
56
|
+
return this.request('POST', '/upload', formData);
|
|
57
|
+
}
|
|
58
|
+
async get(path) {
|
|
59
|
+
try {
|
|
60
|
+
return await this.request('GET', `/${encodeURIComponent(path)}`);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
if (e.message.includes('404')) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
throw e;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
getUrl(path) {
|
|
70
|
+
return `${this.config.apiUrl}/assets/${this.config.appId}/${path}`;
|
|
71
|
+
}
|
|
72
|
+
async delete(path) {
|
|
73
|
+
try {
|
|
74
|
+
await this.request('DELETE', `/${encodeURIComponent(path)}`);
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
if (e.message.includes('404')) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
throw e;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async deleteMany(paths) {
|
|
85
|
+
const result = await this.request('POST', '/delete-many', {
|
|
86
|
+
paths,
|
|
87
|
+
});
|
|
88
|
+
return result.deleted;
|
|
89
|
+
}
|
|
90
|
+
async list(options) {
|
|
91
|
+
const params = new URLSearchParams();
|
|
92
|
+
if (options?.prefix)
|
|
93
|
+
params.set('prefix', options.prefix);
|
|
94
|
+
if (options?.limit)
|
|
95
|
+
params.set('limit', options.limit.toString());
|
|
96
|
+
if (options?.cursor)
|
|
97
|
+
params.set('cursor', options.cursor);
|
|
98
|
+
return this.request('GET', `/list?${params.toString()}`);
|
|
99
|
+
}
|
|
100
|
+
async exists(path) {
|
|
101
|
+
const asset = await this.get(path);
|
|
102
|
+
return asset !== null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/assets/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication service client
|
|
3
|
+
*/
|
|
4
|
+
import type { AuthService, AccessTokenPayload, UserContext, PermissionScope, CheckPermissionsResult } from './types';
|
|
5
|
+
interface AuthConfig {
|
|
6
|
+
apiUrl: string;
|
|
7
|
+
apiKey: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class AuthAPI implements AuthService {
|
|
10
|
+
private config;
|
|
11
|
+
constructor(config: AuthConfig);
|
|
12
|
+
private request;
|
|
13
|
+
verifyUserToken(token: string): Promise<AccessTokenPayload | null>;
|
|
14
|
+
getUserContext(userId: string, scopes: PermissionScope[]): Promise<UserContext>;
|
|
15
|
+
checkPermissions(userId: string, appId: string, scopes: PermissionScope[]): Promise<CheckPermissionsResult>;
|
|
16
|
+
grantPermissions(userId: string, appId: string, scopes: PermissionScope[]): Promise<void>;
|
|
17
|
+
revokePermissions(userId: string, appId: string): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/auth/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,sBAAsB,EACvB,MAAM,SAAS,CAAC;AAEjB,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,OAAQ,YAAW,WAAW;IAC7B,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,UAAU;YAExB,OAAO;IAsBf,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAQlE,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,EAAE,GACxB,OAAO,CAAC,WAAW,CAAC;IAIjB,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,EAAE,GACxB,OAAO,CAAC,sBAAsB,CAAC;IAQ5B,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC;IAQV,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGtE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication service client
|
|
3
|
+
*/
|
|
4
|
+
export class AuthAPI {
|
|
5
|
+
config;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
}
|
|
9
|
+
async request(method, path, body) {
|
|
10
|
+
const response = await fetch(`${this.config.apiUrl}/auth${path}`, {
|
|
11
|
+
method,
|
|
12
|
+
headers: {
|
|
13
|
+
'Content-Type': 'application/json',
|
|
14
|
+
'X-API-Key': this.config.apiKey,
|
|
15
|
+
},
|
|
16
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
17
|
+
});
|
|
18
|
+
if (!response.ok) {
|
|
19
|
+
const error = await response.json().catch(() => ({}));
|
|
20
|
+
throw new Error(error.error || `Auth error: ${response.statusText}`);
|
|
21
|
+
}
|
|
22
|
+
return response.json();
|
|
23
|
+
}
|
|
24
|
+
async verifyUserToken(token) {
|
|
25
|
+
try {
|
|
26
|
+
return await this.request('POST', '/token/verify', { token });
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async getUserContext(userId, scopes) {
|
|
33
|
+
return this.request('POST', '/user', { userId, scopes });
|
|
34
|
+
}
|
|
35
|
+
async checkPermissions(userId, appId, scopes) {
|
|
36
|
+
return this.request('POST', '/permissions/check', {
|
|
37
|
+
userId,
|
|
38
|
+
appId,
|
|
39
|
+
scopes,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async grantPermissions(userId, appId, scopes) {
|
|
43
|
+
await this.request('POST', '/permissions/grant', {
|
|
44
|
+
userId,
|
|
45
|
+
appId,
|
|
46
|
+
scopes,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async revokePermissions(userId, appId) {
|
|
50
|
+
await this.request('DELETE', `/permissions/${appId}/${userId}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=client.js.map
|