@rool-dev/client 0.1.0-dev.1a6a7a3
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 +186 -0
- package/dist/auth.d.ts +75 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +375 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +129 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +343 -0
- package/dist/client.js.map +1 -0
- package/dist/event-emitter.d.ts +38 -0
- package/dist/event-emitter.d.ts.map +1 -0
- package/dist/event-emitter.js +80 -0
- package/dist/event-emitter.js.map +1 -0
- package/dist/graph.d.ts +240 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +573 -0
- package/dist/graph.js.map +1 -0
- package/dist/graphql.d.ts +33 -0
- package/dist/graphql.d.ts.map +1 -0
- package/dist/graphql.js +269 -0
- package/dist/graphql.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/media.d.ts +36 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +105 -0
- package/dist/media.js.map +1 -0
- package/dist/subscription.d.ts +30 -0
- package/dist/subscription.d.ts.map +1 -0
- package/dist/subscription.js +161 -0
- package/dist/subscription.js.map +1 -0
- package/dist/types.d.ts +180 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +54 -0
package/dist/graphql.js
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// GraphQL Client
|
|
3
|
+
// Handles all GraphQL queries and mutations for the Rool API
|
|
4
|
+
// =============================================================================
|
|
5
|
+
import { gzipSync } from 'fflate';
|
|
6
|
+
const COMPRESSION_THRESHOLD = 2048; // Compress payloads > 2KB
|
|
7
|
+
export class GraphQLClient {
|
|
8
|
+
config;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
}
|
|
12
|
+
get graphqlUrl() {
|
|
13
|
+
return `${this.config.baseUrl}/graphql`;
|
|
14
|
+
}
|
|
15
|
+
// ===========================================================================
|
|
16
|
+
// Core Graph Operations
|
|
17
|
+
// ===========================================================================
|
|
18
|
+
async listGraphs() {
|
|
19
|
+
const query = `
|
|
20
|
+
query ListGraphs {
|
|
21
|
+
listGraphs {
|
|
22
|
+
id
|
|
23
|
+
name
|
|
24
|
+
role
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
`;
|
|
28
|
+
const response = await this.request(query);
|
|
29
|
+
return response.listGraphs;
|
|
30
|
+
}
|
|
31
|
+
async getGraph(graphId) {
|
|
32
|
+
const query = `
|
|
33
|
+
query GetGraph($graphId: String!) {
|
|
34
|
+
getGraph(graphId: $graphId)
|
|
35
|
+
}
|
|
36
|
+
`;
|
|
37
|
+
const response = await this.request(query, { graphId });
|
|
38
|
+
return JSON.parse(response.getGraph);
|
|
39
|
+
}
|
|
40
|
+
async setGraph(graphId, graph) {
|
|
41
|
+
const mutation = `
|
|
42
|
+
mutation SetGraph($graphId: String!, $graphData: String!, $connectionId: String) {
|
|
43
|
+
setGraph(graphId: $graphId, graphData: $graphData, connectionId: $connectionId)
|
|
44
|
+
}
|
|
45
|
+
`;
|
|
46
|
+
await this.request(mutation, {
|
|
47
|
+
graphId,
|
|
48
|
+
graphData: JSON.stringify(graph),
|
|
49
|
+
connectionId: this.config.getConnectionId(),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async deleteGraph(graphId) {
|
|
53
|
+
const mutation = `
|
|
54
|
+
mutation DeleteGraph($graphId: String!, $connectionId: String) {
|
|
55
|
+
deleteGraph(graphId: $graphId, connectionId: $connectionId)
|
|
56
|
+
}
|
|
57
|
+
`;
|
|
58
|
+
await this.request(mutation, {
|
|
59
|
+
graphId,
|
|
60
|
+
connectionId: this.config.getConnectionId(),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
async renameGraph(graphId, name) {
|
|
64
|
+
const mutation = `
|
|
65
|
+
mutation RenameGraph($graphId: String!, $name: String!, $connectionId: String) {
|
|
66
|
+
renameGraph(graphId: $graphId, name: $name, connectionId: $connectionId)
|
|
67
|
+
}
|
|
68
|
+
`;
|
|
69
|
+
await this.request(mutation, {
|
|
70
|
+
graphId,
|
|
71
|
+
name,
|
|
72
|
+
connectionId: this.config.getConnectionId(),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
async patch(graphId, patch) {
|
|
76
|
+
const mutation = `
|
|
77
|
+
mutation PatchGraph($graphId: String!, $patch: String!, $connectionId: String) {
|
|
78
|
+
patch(graphId: $graphId, patch: $patch, connectionId: $connectionId)
|
|
79
|
+
}
|
|
80
|
+
`;
|
|
81
|
+
await this.request(mutation, {
|
|
82
|
+
graphId,
|
|
83
|
+
patch: JSON.stringify(patch),
|
|
84
|
+
connectionId: this.config.getConnectionId(),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// ===========================================================================
|
|
88
|
+
// AI Operations
|
|
89
|
+
// ===========================================================================
|
|
90
|
+
async promptGraph(graphId, prompt, options = {}) {
|
|
91
|
+
const mutation = `
|
|
92
|
+
mutation PromptGraph(
|
|
93
|
+
$graphId: String!,
|
|
94
|
+
$prompt: String!,
|
|
95
|
+
$nodeIds: [String!],
|
|
96
|
+
$edgeIds: [String!],
|
|
97
|
+
$metadata: JSON,
|
|
98
|
+
$responseSchema: JSON
|
|
99
|
+
) {
|
|
100
|
+
promptGraph(
|
|
101
|
+
graphId: $graphId,
|
|
102
|
+
prompt: $prompt,
|
|
103
|
+
nodeIds: $nodeIds,
|
|
104
|
+
edgeIds: $edgeIds,
|
|
105
|
+
metadata: $metadata,
|
|
106
|
+
responseSchema: $responseSchema
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
`;
|
|
110
|
+
const response = await this.request(mutation, {
|
|
111
|
+
graphId,
|
|
112
|
+
prompt,
|
|
113
|
+
nodeIds: options.nodeIds ?? [],
|
|
114
|
+
edgeIds: options.edgeIds ?? [],
|
|
115
|
+
metadata: options.metadata,
|
|
116
|
+
responseSchema: options.responseSchema,
|
|
117
|
+
});
|
|
118
|
+
return response.promptGraph ?? null;
|
|
119
|
+
}
|
|
120
|
+
// ===========================================================================
|
|
121
|
+
// Image Operations (Rool Canvas specific)
|
|
122
|
+
// ===========================================================================
|
|
123
|
+
async generateImage(graphId, prompt, aspectRatio) {
|
|
124
|
+
const query = `
|
|
125
|
+
query GenerateImage($graphId: String!, $prompt: String!, $aspectRatio: String) {
|
|
126
|
+
generateImage(graphId: $graphId, prompt: $prompt, aspectRatio: $aspectRatio) {
|
|
127
|
+
url
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
`;
|
|
131
|
+
const response = await this.request(query, {
|
|
132
|
+
graphId,
|
|
133
|
+
prompt,
|
|
134
|
+
aspectRatio,
|
|
135
|
+
});
|
|
136
|
+
return response.generateImage;
|
|
137
|
+
}
|
|
138
|
+
async editImage(graphId, prompt, url) {
|
|
139
|
+
const query = `
|
|
140
|
+
query EditImage($graphId: String!, $prompt: String!, $url: String!) {
|
|
141
|
+
editImage(graphId: $graphId, prompt: $prompt, url: $url) {
|
|
142
|
+
url
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
`;
|
|
146
|
+
const response = await this.request(query, {
|
|
147
|
+
graphId,
|
|
148
|
+
prompt,
|
|
149
|
+
url,
|
|
150
|
+
});
|
|
151
|
+
return response.editImage;
|
|
152
|
+
}
|
|
153
|
+
// ===========================================================================
|
|
154
|
+
// User / Collaboration Operations
|
|
155
|
+
// ===========================================================================
|
|
156
|
+
async getAccount() {
|
|
157
|
+
const query = `
|
|
158
|
+
query GetAccount {
|
|
159
|
+
getAccount {
|
|
160
|
+
id
|
|
161
|
+
email
|
|
162
|
+
plan
|
|
163
|
+
creditsBalance
|
|
164
|
+
processedAt
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
`;
|
|
168
|
+
const response = await this.request(query);
|
|
169
|
+
return response.getAccount;
|
|
170
|
+
}
|
|
171
|
+
async searchUser(email) {
|
|
172
|
+
const query = `
|
|
173
|
+
query SearchUser($email: String!) {
|
|
174
|
+
searchUser(email: $email) {
|
|
175
|
+
id
|
|
176
|
+
email
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
`;
|
|
180
|
+
try {
|
|
181
|
+
const response = await this.request(query, { email });
|
|
182
|
+
return response.searchUser;
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
async listGraphUsers(graphId) {
|
|
189
|
+
const query = `
|
|
190
|
+
query ListGraphUsers($graphId: String!) {
|
|
191
|
+
listGraphUsers(graphId: $graphId) {
|
|
192
|
+
id
|
|
193
|
+
email
|
|
194
|
+
role
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
`;
|
|
198
|
+
const response = await this.request(query, { graphId });
|
|
199
|
+
return response.listGraphUsers;
|
|
200
|
+
}
|
|
201
|
+
async addGraphUser(graphId, userId, role) {
|
|
202
|
+
const mutation = `
|
|
203
|
+
mutation AddGraphUser($graphId: String!, $userId: String!, $role: String!) {
|
|
204
|
+
addGraphUser(graphId: $graphId, userId: $userId, role: $role)
|
|
205
|
+
}
|
|
206
|
+
`;
|
|
207
|
+
await this.request(mutation, { graphId, userId, role });
|
|
208
|
+
}
|
|
209
|
+
async removeGraphUser(graphId, userId) {
|
|
210
|
+
const mutation = `
|
|
211
|
+
mutation RemoveGraphUser($graphId: String!, $userId: String!) {
|
|
212
|
+
removeGraphUser(graphId: $graphId, userId: $userId)
|
|
213
|
+
}
|
|
214
|
+
`;
|
|
215
|
+
await this.request(mutation, { graphId, userId });
|
|
216
|
+
}
|
|
217
|
+
// ===========================================================================
|
|
218
|
+
// Generic Query (escape hatch for app-specific queries)
|
|
219
|
+
// ===========================================================================
|
|
220
|
+
/**
|
|
221
|
+
* Execute an arbitrary GraphQL query or mutation.
|
|
222
|
+
* Use this for app-specific operations not covered by the typed methods.
|
|
223
|
+
*/
|
|
224
|
+
async query(query, variables) {
|
|
225
|
+
return this.request(query, variables);
|
|
226
|
+
}
|
|
227
|
+
// ===========================================================================
|
|
228
|
+
// Private Methods
|
|
229
|
+
// ===========================================================================
|
|
230
|
+
async request(query, variables) {
|
|
231
|
+
const token = await this.config.authManager.getToken();
|
|
232
|
+
if (!token) {
|
|
233
|
+
throw new Error('Not authenticated');
|
|
234
|
+
}
|
|
235
|
+
const body = JSON.stringify({ query, variables });
|
|
236
|
+
const headers = {
|
|
237
|
+
'Content-Type': 'application/json',
|
|
238
|
+
Authorization: `Bearer ${token}`,
|
|
239
|
+
};
|
|
240
|
+
let fetchBody = body;
|
|
241
|
+
// Compress large payloads
|
|
242
|
+
if (body.length > COMPRESSION_THRESHOLD) {
|
|
243
|
+
const gzipped = gzipSync(new TextEncoder().encode(body));
|
|
244
|
+
headers['Content-Encoding'] = 'gzip';
|
|
245
|
+
// Convert to ArrayBuffer for fetch compatibility
|
|
246
|
+
fetchBody = gzipped.buffer.slice(gzipped.byteOffset, gzipped.byteOffset + gzipped.byteLength);
|
|
247
|
+
}
|
|
248
|
+
const response = await fetch(this.graphqlUrl, {
|
|
249
|
+
method: 'POST',
|
|
250
|
+
headers,
|
|
251
|
+
body: fetchBody,
|
|
252
|
+
});
|
|
253
|
+
if (!response.ok) {
|
|
254
|
+
throw new Error(`GraphQL request failed: ${response.status} ${response.statusText}`);
|
|
255
|
+
}
|
|
256
|
+
const result = await response.json();
|
|
257
|
+
if (result.errors && result.errors.length > 0) {
|
|
258
|
+
const error = result.errors[0];
|
|
259
|
+
const err = new Error(error.message);
|
|
260
|
+
err.extensions = error.extensions;
|
|
261
|
+
throw err;
|
|
262
|
+
}
|
|
263
|
+
if (!result.data) {
|
|
264
|
+
throw new Error('GraphQL response missing data');
|
|
265
|
+
}
|
|
266
|
+
return result.data;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=graphql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql.js","sourceRoot":"","sources":["../src/graphql.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { RoolClient } from './client.js';
|
|
2
|
+
export { RoolGraph, generateEntityId } from './graph.js';
|
|
3
|
+
export { EventEmitter } from './event-emitter.js';
|
|
4
|
+
export type { RoolNode, RoolEdge, RoolGraphData, JSONPatchOp, RoolGraphInfo, RoolGraphRole, UserResult, RoolGraphUser, Account, UserInfo, MediaItem, PromptOptions, ImageResult, ImageAspectRatio, ConnectionState, GraphEvent, GraphEventType, RoolClientConfig, RoolClientEvents, GraphEvents, AuthTokens, AuthProvider, } from './types.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,YAAY,EAEV,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EAGb,UAAU,EACV,aAAa,EACb,OAAO,EACP,QAAQ,EAGR,SAAS,EAGT,aAAa,EAGb,WAAW,EACX,gBAAgB,EAGhB,eAAe,EACf,UAAU,EACV,cAAc,EAGd,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Rool Client
|
|
3
|
+
// Generic TypeScript client library for the Rool server API
|
|
4
|
+
// =============================================================================
|
|
5
|
+
// Main client
|
|
6
|
+
export { RoolClient } from './client.js';
|
|
7
|
+
// Graph class
|
|
8
|
+
export { RoolGraph, generateEntityId } from './graph.js';
|
|
9
|
+
// Event emitter (for extending)
|
|
10
|
+
export { EventEmitter } from './event-emitter.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,cAAc;AACd,4DAA4D;AAC5D,gFAAgF;AAEhF,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEzD,gCAAgC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/media.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { MediaItem } from './types.js';
|
|
2
|
+
import type { AuthManager } from './auth.js';
|
|
3
|
+
export interface MediaClientConfig {
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
authManager: AuthManager;
|
|
6
|
+
}
|
|
7
|
+
export declare class MediaClient {
|
|
8
|
+
private config;
|
|
9
|
+
constructor(config: MediaClientConfig);
|
|
10
|
+
private mediaUrl;
|
|
11
|
+
/**
|
|
12
|
+
* List all media files for a graph.
|
|
13
|
+
*/
|
|
14
|
+
list(graphId: string): Promise<MediaItem[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Upload a file to a graph.
|
|
17
|
+
* Accepts File, Blob, or base64 data with content type.
|
|
18
|
+
*/
|
|
19
|
+
upload(graphId: string, file: File | Blob | {
|
|
20
|
+
data: string;
|
|
21
|
+
contentType: string;
|
|
22
|
+
}): Promise<MediaItem>;
|
|
23
|
+
/**
|
|
24
|
+
* Get the download URL for a media file.
|
|
25
|
+
*/
|
|
26
|
+
getUrl(graphId: string, uuid: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Download a media file as a Blob.
|
|
29
|
+
*/
|
|
30
|
+
download(graphId: string, uuid: string): Promise<Blob>;
|
|
31
|
+
/**
|
|
32
|
+
* Delete a media file.
|
|
33
|
+
*/
|
|
34
|
+
delete(graphId: string, uuid: string): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,iBAAiB;IAIrC,OAAO,CAAC,QAAQ;IAKhB;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAgBjD;;;OAGG;IACG,MAAM,CACV,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GACxD,OAAO,CAAC,SAAS,CAAC;IAqCrB;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAI7C;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB5D;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAa3D"}
|
package/dist/media.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Media Client
|
|
3
|
+
// REST API wrapper for file upload/download/list/delete
|
|
4
|
+
// =============================================================================
|
|
5
|
+
export class MediaClient {
|
|
6
|
+
config;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
}
|
|
10
|
+
mediaUrl(graphId, uuid) {
|
|
11
|
+
const base = `${this.config.baseUrl}/media/${encodeURIComponent(graphId)}`;
|
|
12
|
+
return uuid ? `${base}/${encodeURIComponent(uuid)}` : base;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* List all media files for a graph.
|
|
16
|
+
*/
|
|
17
|
+
async list(graphId) {
|
|
18
|
+
const token = await this.config.authManager.getToken();
|
|
19
|
+
if (!token)
|
|
20
|
+
throw new Error('Not authenticated');
|
|
21
|
+
const response = await fetch(this.mediaUrl(graphId), {
|
|
22
|
+
method: 'GET',
|
|
23
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
24
|
+
});
|
|
25
|
+
if (!response.ok) {
|
|
26
|
+
throw new Error(`Failed to list media: ${response.status} ${response.statusText}`);
|
|
27
|
+
}
|
|
28
|
+
return response.json();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Upload a file to a graph.
|
|
32
|
+
* Accepts File, Blob, or base64 data with content type.
|
|
33
|
+
*/
|
|
34
|
+
async upload(graphId, file) {
|
|
35
|
+
const token = await this.config.authManager.getToken();
|
|
36
|
+
if (!token)
|
|
37
|
+
throw new Error('Not authenticated');
|
|
38
|
+
let body;
|
|
39
|
+
const headers = {
|
|
40
|
+
Authorization: `Bearer ${token}`,
|
|
41
|
+
};
|
|
42
|
+
if (file instanceof File || file instanceof Blob) {
|
|
43
|
+
// Use FormData for File/Blob uploads
|
|
44
|
+
const formData = new FormData();
|
|
45
|
+
formData.append('file', file);
|
|
46
|
+
body = formData;
|
|
47
|
+
// Don't set Content-Type - browser will set it with boundary
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Use JSON for base64 uploads
|
|
51
|
+
headers['Content-Type'] = 'application/json';
|
|
52
|
+
body = JSON.stringify({
|
|
53
|
+
data: file.data,
|
|
54
|
+
contentType: file.contentType,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const response = await fetch(this.mediaUrl(graphId), {
|
|
58
|
+
method: 'POST',
|
|
59
|
+
headers,
|
|
60
|
+
body,
|
|
61
|
+
});
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
throw new Error(`Failed to upload media: ${response.status} ${response.statusText}`);
|
|
64
|
+
}
|
|
65
|
+
return response.json();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get the download URL for a media file.
|
|
69
|
+
*/
|
|
70
|
+
getUrl(graphId, uuid) {
|
|
71
|
+
return this.mediaUrl(graphId, uuid);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Download a media file as a Blob.
|
|
75
|
+
*/
|
|
76
|
+
async download(graphId, uuid) {
|
|
77
|
+
const token = await this.config.authManager.getToken();
|
|
78
|
+
if (!token)
|
|
79
|
+
throw new Error('Not authenticated');
|
|
80
|
+
const response = await fetch(this.mediaUrl(graphId, uuid), {
|
|
81
|
+
method: 'GET',
|
|
82
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
83
|
+
});
|
|
84
|
+
if (!response.ok) {
|
|
85
|
+
throw new Error(`Failed to download media: ${response.status} ${response.statusText}`);
|
|
86
|
+
}
|
|
87
|
+
return response.blob();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Delete a media file.
|
|
91
|
+
*/
|
|
92
|
+
async delete(graphId, uuid) {
|
|
93
|
+
const token = await this.config.authManager.getToken();
|
|
94
|
+
if (!token)
|
|
95
|
+
throw new Error('Not authenticated');
|
|
96
|
+
const response = await fetch(this.mediaUrl(graphId, uuid), {
|
|
97
|
+
method: 'DELETE',
|
|
98
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
99
|
+
});
|
|
100
|
+
if (!response.ok && response.status !== 204) {
|
|
101
|
+
throw new Error(`Failed to delete media: ${response.status} ${response.statusText}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ConnectionState, GraphEvent } from './types.js';
|
|
2
|
+
import type { AuthManager } from './auth.js';
|
|
3
|
+
export interface SubscriptionManagerConfig {
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
authManager: AuthManager;
|
|
6
|
+
connectionId: string;
|
|
7
|
+
onEvent: (event: GraphEvent) => void;
|
|
8
|
+
onConnectionStateChanged: (state: ConnectionState) => void;
|
|
9
|
+
onError: (error: Error) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare class SubscriptionManager {
|
|
12
|
+
private config;
|
|
13
|
+
private client;
|
|
14
|
+
private unsubscribe;
|
|
15
|
+
private reconnectDelay;
|
|
16
|
+
private reconnectTimeoutId;
|
|
17
|
+
private isIntentionalClose;
|
|
18
|
+
private _isSubscribed;
|
|
19
|
+
constructor(config: SubscriptionManagerConfig);
|
|
20
|
+
get isSubscribed(): boolean;
|
|
21
|
+
subscribe(): Promise<void>;
|
|
22
|
+
unsubscribeFromEvents(): void;
|
|
23
|
+
private connect;
|
|
24
|
+
private disconnect;
|
|
25
|
+
private scheduleReconnect;
|
|
26
|
+
private cancelReconnect;
|
|
27
|
+
private parseEvent;
|
|
28
|
+
destroy(): void;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=subscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../src/subscription.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAe,MAAM,YAAY,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAM7C,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACrC,wBAAwB,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC3D,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,kBAAkB,CAA8C;IACxE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,aAAa,CAAS;gBAElB,MAAM,EAAE,yBAAyB;IAI7C,IAAI,YAAY,IAAI,OAAO,CAE1B;IAEK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAOhC,qBAAqB,IAAI,IAAI;YAMf,OAAO;IAiFrB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,UAAU;IA6BlB,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Subscription Manager
|
|
3
|
+
// SSE-based GraphQL subscriptions with auto-reconnect
|
|
4
|
+
// =============================================================================
|
|
5
|
+
import { createClient } from 'graphql-sse';
|
|
6
|
+
const INITIAL_RECONNECT_DELAY = 1000;
|
|
7
|
+
const MAX_RECONNECT_DELAY = 30000;
|
|
8
|
+
const RECONNECT_MULTIPLIER = 2;
|
|
9
|
+
export class SubscriptionManager {
|
|
10
|
+
config;
|
|
11
|
+
client = null;
|
|
12
|
+
unsubscribe = null;
|
|
13
|
+
reconnectDelay = INITIAL_RECONNECT_DELAY;
|
|
14
|
+
reconnectTimeoutId = null;
|
|
15
|
+
isIntentionalClose = false;
|
|
16
|
+
_isSubscribed = false;
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.config = config;
|
|
19
|
+
}
|
|
20
|
+
get isSubscribed() {
|
|
21
|
+
return this._isSubscribed;
|
|
22
|
+
}
|
|
23
|
+
async subscribe() {
|
|
24
|
+
if (this._isSubscribed)
|
|
25
|
+
return;
|
|
26
|
+
this.isIntentionalClose = false;
|
|
27
|
+
await this.connect();
|
|
28
|
+
}
|
|
29
|
+
unsubscribeFromEvents() {
|
|
30
|
+
this.isIntentionalClose = true;
|
|
31
|
+
this.cancelReconnect();
|
|
32
|
+
this.disconnect();
|
|
33
|
+
}
|
|
34
|
+
async connect() {
|
|
35
|
+
const token = await this.config.authManager.getToken();
|
|
36
|
+
if (!token) {
|
|
37
|
+
this.config.onError(new Error('Cannot subscribe: not authenticated'));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this.config.onConnectionStateChanged('reconnecting');
|
|
41
|
+
try {
|
|
42
|
+
this.client = createClient({
|
|
43
|
+
url: `${this.config.baseUrl}/graphql`,
|
|
44
|
+
headers: {
|
|
45
|
+
Authorization: `Bearer ${token}`,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
const query = `
|
|
49
|
+
subscription GraphEvents($connectionId: String!) {
|
|
50
|
+
graphEvents(connectionId: $connectionId)
|
|
51
|
+
}
|
|
52
|
+
`;
|
|
53
|
+
this.unsubscribe = this.client.subscribe({
|
|
54
|
+
query,
|
|
55
|
+
variables: { connectionId: this.config.connectionId },
|
|
56
|
+
}, {
|
|
57
|
+
next: (result) => {
|
|
58
|
+
// Reset reconnect delay on successful message
|
|
59
|
+
this.reconnectDelay = INITIAL_RECONNECT_DELAY;
|
|
60
|
+
if (!this._isSubscribed) {
|
|
61
|
+
this._isSubscribed = true;
|
|
62
|
+
this.config.onConnectionStateChanged('connected');
|
|
63
|
+
}
|
|
64
|
+
if (result.data?.graphEvents) {
|
|
65
|
+
try {
|
|
66
|
+
const eventData = result.data.graphEvents;
|
|
67
|
+
const rawEvent = JSON.parse(eventData);
|
|
68
|
+
const event = this.parseEvent(rawEvent);
|
|
69
|
+
if (event) {
|
|
70
|
+
this.config.onEvent(event);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
console.error('[RoolClient] Failed to parse graph event:', e);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
error: (error) => {
|
|
79
|
+
console.error('[RoolClient] Subscription error:', error);
|
|
80
|
+
this._isSubscribed = false;
|
|
81
|
+
this.config.onConnectionStateChanged('disconnected');
|
|
82
|
+
if (!this.isIntentionalClose) {
|
|
83
|
+
this.scheduleReconnect();
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
complete: () => {
|
|
87
|
+
this._isSubscribed = false;
|
|
88
|
+
this.config.onConnectionStateChanged('disconnected');
|
|
89
|
+
if (!this.isIntentionalClose) {
|
|
90
|
+
this.scheduleReconnect();
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
console.error('[RoolClient] Failed to establish subscription:', error);
|
|
97
|
+
this._isSubscribed = false;
|
|
98
|
+
this.config.onConnectionStateChanged('disconnected');
|
|
99
|
+
if (!this.isIntentionalClose) {
|
|
100
|
+
this.scheduleReconnect();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
disconnect() {
|
|
105
|
+
if (this.unsubscribe) {
|
|
106
|
+
this.unsubscribe();
|
|
107
|
+
this.unsubscribe = null;
|
|
108
|
+
}
|
|
109
|
+
this.client = null;
|
|
110
|
+
this._isSubscribed = false;
|
|
111
|
+
this.config.onConnectionStateChanged('disconnected');
|
|
112
|
+
}
|
|
113
|
+
scheduleReconnect() {
|
|
114
|
+
this.cancelReconnect();
|
|
115
|
+
console.log(`[RoolClient] Reconnecting in ${this.reconnectDelay}ms...`);
|
|
116
|
+
this.config.onConnectionStateChanged('reconnecting');
|
|
117
|
+
this.reconnectTimeoutId = setTimeout(() => {
|
|
118
|
+
this.reconnectTimeoutId = null;
|
|
119
|
+
void this.connect();
|
|
120
|
+
}, this.reconnectDelay);
|
|
121
|
+
// Exponential backoff
|
|
122
|
+
this.reconnectDelay = Math.min(this.reconnectDelay * RECONNECT_MULTIPLIER, MAX_RECONNECT_DELAY);
|
|
123
|
+
}
|
|
124
|
+
cancelReconnect() {
|
|
125
|
+
if (this.reconnectTimeoutId !== null) {
|
|
126
|
+
clearTimeout(this.reconnectTimeoutId);
|
|
127
|
+
this.reconnectTimeoutId = null;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
parseEvent(raw) {
|
|
131
|
+
const type = raw.type;
|
|
132
|
+
const graphId = raw.graphId;
|
|
133
|
+
const timestamp = raw.timestamp;
|
|
134
|
+
if (!type || !graphId)
|
|
135
|
+
return null;
|
|
136
|
+
switch (type) {
|
|
137
|
+
case 'graph_patched':
|
|
138
|
+
return {
|
|
139
|
+
type: 'graph_patched',
|
|
140
|
+
graphId,
|
|
141
|
+
timestamp,
|
|
142
|
+
patch: raw.patch,
|
|
143
|
+
};
|
|
144
|
+
case 'graph_changed':
|
|
145
|
+
return { type: 'graph_changed', graphId, timestamp };
|
|
146
|
+
case 'graph_name_changed':
|
|
147
|
+
return { type: 'graph_name_changed', graphId, timestamp };
|
|
148
|
+
case 'graph_created':
|
|
149
|
+
return { type: 'graph_created', graphId, timestamp };
|
|
150
|
+
case 'graph_deleted':
|
|
151
|
+
return { type: 'graph_deleted', graphId, timestamp };
|
|
152
|
+
default:
|
|
153
|
+
console.warn('[RoolClient] Unknown event type:', type);
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
destroy() {
|
|
158
|
+
this.unsubscribeFromEvents();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=subscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription.js","sourceRoot":"","sources":["../src/subscription.ts"],"names":[],"mappings":"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"}
|