@syncular/console 0.0.0 → 0.0.4-25
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/dist/App.d.ts +14 -0
- package/dist/App.d.ts.map +1 -0
- package/dist/App.js +33 -0
- package/dist/App.js.map +1 -0
- package/dist/browser-main.d.ts +2 -0
- package/dist/browser-main.d.ts.map +1 -0
- package/dist/browser-main.js +9 -0
- package/dist/browser-main.js.map +1 -0
- package/dist/hooks/ConnectionContext.d.ts +30 -0
- package/dist/hooks/ConnectionContext.d.ts.map +1 -0
- package/dist/hooks/ConnectionContext.js +127 -0
- package/dist/hooks/ConnectionContext.js.map +1 -0
- package/dist/hooks/index.d.ts +10 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +10 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useConsoleApi.d.ts +152 -0
- package/dist/hooks/useConsoleApi.d.ts.map +1 -0
- package/dist/hooks/useConsoleApi.js +623 -0
- package/dist/hooks/useConsoleApi.js.map +1 -0
- package/dist/hooks/useInstanceContext.d.ts +9 -0
- package/dist/hooks/useInstanceContext.d.ts.map +1 -0
- package/dist/hooks/useInstanceContext.js +14 -0
- package/dist/hooks/useInstanceContext.js.map +1 -0
- package/dist/hooks/useLiveEvents.d.ts +33 -0
- package/dist/hooks/useLiveEvents.d.ts.map +1 -0
- package/dist/hooks/useLiveEvents.js +199 -0
- package/dist/hooks/useLiveEvents.js.map +1 -0
- package/dist/hooks/useLocalStorage.d.ts +2 -0
- package/dist/hooks/useLocalStorage.d.ts.map +1 -0
- package/dist/hooks/useLocalStorage.js +36 -0
- package/dist/hooks/useLocalStorage.js.map +1 -0
- package/dist/hooks/usePartitionContext.d.ts +9 -0
- package/dist/hooks/usePartitionContext.d.ts.map +1 -0
- package/dist/hooks/usePartitionContext.js +14 -0
- package/dist/hooks/usePartitionContext.js.map +1 -0
- package/dist/hooks/usePreferences.d.ts +35 -0
- package/dist/hooks/usePreferences.d.ts.map +1 -0
- package/dist/hooks/usePreferences.js +48 -0
- package/dist/hooks/usePreferences.js.map +1 -0
- package/dist/hooks/useRequestEvents.d.ts +7 -0
- package/dist/hooks/useRequestEvents.d.ts.map +1 -0
- package/dist/hooks/useRequestEvents.js +33 -0
- package/dist/hooks/useRequestEvents.js.map +1 -0
- package/dist/hooks/useTimeRange.d.ts +18 -0
- package/dist/hooks/useTimeRange.d.ts.map +1 -0
- package/dist/hooks/useTimeRange.js +18 -0
- package/dist/hooks/useTimeRange.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/layout.d.ts +6 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +85 -0
- package/dist/layout.js.map +1 -0
- package/dist/lib/api.d.ts +11 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +20 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/topology.d.ts +8 -0
- package/dist/lib/topology.d.ts.map +1 -0
- package/dist/lib/topology.js +76 -0
- package/dist/lib/topology.js.map +1 -0
- package/dist/lib/types.d.ts +194 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +5 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/mount.d.ts +10 -0
- package/dist/mount.d.ts.map +1 -0
- package/dist/mount.js +25 -0
- package/dist/mount.js.map +1 -0
- package/dist/pages/Command.d.ts +2 -0
- package/dist/pages/Command.d.ts.map +1 -0
- package/dist/pages/Command.js +215 -0
- package/dist/pages/Command.js.map +1 -0
- package/dist/pages/Config.d.ts +2 -0
- package/dist/pages/Config.d.ts.map +1 -0
- package/dist/pages/Config.js +504 -0
- package/dist/pages/Config.js.map +1 -0
- package/dist/pages/Fleet.d.ts +2 -0
- package/dist/pages/Fleet.d.ts.map +1 -0
- package/dist/pages/Fleet.js +126 -0
- package/dist/pages/Fleet.js.map +1 -0
- package/dist/pages/Ops.d.ts +2 -0
- package/dist/pages/Ops.d.ts.map +1 -0
- package/dist/pages/Ops.js +294 -0
- package/dist/pages/Ops.js.map +1 -0
- package/dist/pages/Stream.d.ts +6 -0
- package/dist/pages/Stream.d.ts.map +1 -0
- package/dist/pages/Stream.js +403 -0
- package/dist/pages/Stream.js.map +1 -0
- package/dist/pages/index.d.ts +6 -0
- package/dist/pages/index.d.ts.map +1 -0
- package/dist/pages/index.js +6 -0
- package/dist/pages/index.js.map +1 -0
- package/dist/routeTree.d.ts +2 -0
- package/dist/routeTree.d.ts.map +1 -0
- package/dist/routeTree.js +18 -0
- package/dist/routeTree.js.map +1 -0
- package/dist/routes/__root.d.ts +2 -0
- package/dist/routes/__root.d.ts.map +1 -0
- package/dist/routes/__root.js +6 -0
- package/dist/routes/__root.js.map +1 -0
- package/dist/routes/config.d.ts +2 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +9 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/fleet.d.ts +2 -0
- package/dist/routes/fleet.d.ts.map +1 -0
- package/dist/routes/fleet.js +9 -0
- package/dist/routes/fleet.js.map +1 -0
- package/dist/routes/index.d.ts +2 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +9 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/investigate-commit.d.ts +2 -0
- package/dist/routes/investigate-commit.d.ts.map +1 -0
- package/dist/routes/investigate-commit.js +14 -0
- package/dist/routes/investigate-commit.js.map +1 -0
- package/dist/routes/investigate-event.d.ts +2 -0
- package/dist/routes/investigate-event.d.ts.map +1 -0
- package/dist/routes/investigate-event.js +14 -0
- package/dist/routes/investigate-event.js.map +1 -0
- package/dist/routes/ops.d.ts +2 -0
- package/dist/routes/ops.d.ts.map +1 -0
- package/dist/routes/ops.js +9 -0
- package/dist/routes/ops.js.map +1 -0
- package/dist/routes/stream.d.ts +2 -0
- package/dist/routes/stream.d.ts.map +1 -0
- package/dist/routes/stream.js +9 -0
- package/dist/routes/stream.js.map +1 -0
- package/dist/runtime-config.d.ts +12 -0
- package/dist/runtime-config.d.ts.map +1 -0
- package/dist/runtime-config.js +35 -0
- package/dist/runtime-config.js.map +1 -0
- package/dist/sentry.d.ts +11 -0
- package/dist/sentry.d.ts.map +1 -0
- package/dist/sentry.js +60 -0
- package/dist/sentry.js.map +1 -0
- package/package.json +27 -7
- package/src/App.tsx +46 -25
- package/src/browser-main.tsx +10 -0
- package/src/index.ts +1 -0
- package/src/mount.tsx +6 -3
- package/src/runtime-config.ts +50 -0
- package/web-dist/apple-touch-icon.png +0 -0
- package/web-dist/chunk-7ayekhzx.css +1 -0
- package/web-dist/chunk-myppbvt5.js +90 -0
- package/web-dist/favicon-96x96.png +0 -0
- package/web-dist/favicon.ico +0 -0
- package/web-dist/favicon.svg +3 -0
- package/web-dist/index.html +19 -0
- package/web-dist/site.webmanifest +21 -0
- package/web-dist/web-app-manifest-192x192.png +0 -0
- package/web-dist/web-app-manifest-512x512.png +0 -0
|
@@ -0,0 +1,623 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Query hooks for Console API
|
|
3
|
+
*/
|
|
4
|
+
import { unwrap } from '@syncular/transport-http';
|
|
5
|
+
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
6
|
+
import { useApiClient, useConnection } from './ConnectionContext.js';
|
|
7
|
+
import { useInstanceContext } from './useInstanceContext.js';
|
|
8
|
+
const queryKeys = {
|
|
9
|
+
stats: (params) => ['console', 'stats', params],
|
|
10
|
+
timeseries: (params) => ['console', 'stats', 'timeseries', params],
|
|
11
|
+
latency: (params) => ['console', 'stats', 'latency', params],
|
|
12
|
+
commits: (params) => ['console', 'commits', params],
|
|
13
|
+
commitDetail: (seq, partitionId, instanceId) => ['console', 'commit-detail', seq, partitionId, instanceId],
|
|
14
|
+
timeline: (params) => ['console', 'timeline', params],
|
|
15
|
+
clients: (params) => ['console', 'clients', params],
|
|
16
|
+
eventDetail: (id, partitionId, instanceId) => ['console', 'event-detail', id, partitionId, instanceId],
|
|
17
|
+
eventPayload: (id, partitionId, instanceId) => ['console', 'event-payload', id, partitionId, instanceId],
|
|
18
|
+
handlers: (instanceId) => ['console', 'handlers', instanceId],
|
|
19
|
+
prunePreview: (instanceId) => ['console', 'prune', 'preview', instanceId],
|
|
20
|
+
operations: (params) => ['console', 'operations', params],
|
|
21
|
+
apiKeys: (params) => ['console', 'api-keys', params],
|
|
22
|
+
};
|
|
23
|
+
function resolveRefetchInterval(refreshIntervalMs, defaultValueMs) {
|
|
24
|
+
if (refreshIntervalMs === 0)
|
|
25
|
+
return false;
|
|
26
|
+
return refreshIntervalMs ?? defaultValueMs;
|
|
27
|
+
}
|
|
28
|
+
function withInstanceQuery(query, instanceId) {
|
|
29
|
+
if (!instanceId)
|
|
30
|
+
return query;
|
|
31
|
+
return { ...query, instanceId };
|
|
32
|
+
}
|
|
33
|
+
function serializePathSegment(value) {
|
|
34
|
+
return encodeURIComponent(String(value));
|
|
35
|
+
}
|
|
36
|
+
function buildConsoleUrl(serverUrl, path, queryString) {
|
|
37
|
+
const baseUrl = serverUrl.endsWith('/') ? serverUrl.slice(0, -1) : serverUrl;
|
|
38
|
+
const suffix = queryString?.toString();
|
|
39
|
+
return `${baseUrl}${path}${suffix ? `?${suffix}` : ''}`;
|
|
40
|
+
}
|
|
41
|
+
export function useStats(options = {}) {
|
|
42
|
+
const client = useApiClient();
|
|
43
|
+
const { instanceId: selectedInstanceId } = useInstanceContext();
|
|
44
|
+
const instanceId = options.instanceId ?? selectedInstanceId;
|
|
45
|
+
const query = withInstanceQuery(options.partitionId ? { partitionId: options.partitionId } : {}, instanceId);
|
|
46
|
+
return useQuery({
|
|
47
|
+
queryKey: queryKeys.stats({
|
|
48
|
+
partitionId: options.partitionId,
|
|
49
|
+
instanceId,
|
|
50
|
+
}),
|
|
51
|
+
queryFn: () => {
|
|
52
|
+
if (!client)
|
|
53
|
+
throw new Error('Not connected');
|
|
54
|
+
return unwrap(client.GET('/console/stats', { params: { query } }));
|
|
55
|
+
},
|
|
56
|
+
enabled: !!client,
|
|
57
|
+
refetchInterval: resolveRefetchInterval(options.refetchIntervalMs, 5000),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export function useTimeseriesStats(params = {}, options = {}) {
|
|
61
|
+
const client = useApiClient();
|
|
62
|
+
const { config: connectionConfig } = useConnection();
|
|
63
|
+
const { instanceId: selectedInstanceId } = useInstanceContext();
|
|
64
|
+
const instanceId = params.instanceId ?? selectedInstanceId;
|
|
65
|
+
return useQuery({
|
|
66
|
+
queryKey: queryKeys.timeseries({ ...params, instanceId }),
|
|
67
|
+
queryFn: async () => {
|
|
68
|
+
if (!client || !connectionConfig)
|
|
69
|
+
throw new Error('Not connected');
|
|
70
|
+
// Use fetch directly since this endpoint may not be in OpenAPI yet
|
|
71
|
+
const queryString = new URLSearchParams();
|
|
72
|
+
if (params.interval)
|
|
73
|
+
queryString.set('interval', params.interval);
|
|
74
|
+
if (params.range)
|
|
75
|
+
queryString.set('range', params.range);
|
|
76
|
+
if (params.partitionId)
|
|
77
|
+
queryString.set('partitionId', params.partitionId);
|
|
78
|
+
if (instanceId)
|
|
79
|
+
queryString.set('instanceId', instanceId);
|
|
80
|
+
const response = await fetch(`${connectionConfig.serverUrl}/console/stats/timeseries?${queryString}`, { headers: { Authorization: `Bearer ${connectionConfig.token}` } });
|
|
81
|
+
if (!response.ok)
|
|
82
|
+
throw new Error('Failed to fetch timeseries stats');
|
|
83
|
+
return response.json();
|
|
84
|
+
},
|
|
85
|
+
enabled: (options.enabled ?? true) && !!client && !!connectionConfig,
|
|
86
|
+
refetchInterval: resolveRefetchInterval(options.refetchIntervalMs, 30000),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
export function useLatencyStats(params = {}, options = {}) {
|
|
90
|
+
const client = useApiClient();
|
|
91
|
+
const { config: connectionConfig } = useConnection();
|
|
92
|
+
const { instanceId: selectedInstanceId } = useInstanceContext();
|
|
93
|
+
const instanceId = params.instanceId ?? selectedInstanceId;
|
|
94
|
+
return useQuery({
|
|
95
|
+
queryKey: queryKeys.latency({ ...params, instanceId }),
|
|
96
|
+
queryFn: async () => {
|
|
97
|
+
if (!client || !connectionConfig)
|
|
98
|
+
throw new Error('Not connected');
|
|
99
|
+
// Use fetch directly since this endpoint may not be in OpenAPI yet
|
|
100
|
+
const queryString = new URLSearchParams();
|
|
101
|
+
if (params.range)
|
|
102
|
+
queryString.set('range', params.range);
|
|
103
|
+
if (params.partitionId)
|
|
104
|
+
queryString.set('partitionId', params.partitionId);
|
|
105
|
+
if (instanceId)
|
|
106
|
+
queryString.set('instanceId', instanceId);
|
|
107
|
+
const response = await fetch(`${connectionConfig.serverUrl}/console/stats/latency?${queryString}`, { headers: { Authorization: `Bearer ${connectionConfig.token}` } });
|
|
108
|
+
if (!response.ok)
|
|
109
|
+
throw new Error('Failed to fetch latency stats');
|
|
110
|
+
return response.json();
|
|
111
|
+
},
|
|
112
|
+
enabled: (options.enabled ?? true) && !!client && !!connectionConfig,
|
|
113
|
+
refetchInterval: resolveRefetchInterval(options.refetchIntervalMs, 30000),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
export function useCommits(params = {}, options = {}) {
|
|
117
|
+
const client = useApiClient();
|
|
118
|
+
const { instanceId: selectedInstanceId } = useInstanceContext();
|
|
119
|
+
const instanceId = params.instanceId ?? selectedInstanceId;
|
|
120
|
+
const query = withInstanceQuery({
|
|
121
|
+
limit: params.limit,
|
|
122
|
+
offset: params.offset,
|
|
123
|
+
partitionId: params.partitionId,
|
|
124
|
+
}, instanceId);
|
|
125
|
+
return useQuery({
|
|
126
|
+
queryKey: queryKeys.commits({ ...params, instanceId }),
|
|
127
|
+
queryFn: () => {
|
|
128
|
+
if (!client)
|
|
129
|
+
throw new Error('Not connected');
|
|
130
|
+
return unwrap(client.GET('/console/commits', { params: { query } }));
|
|
131
|
+
},
|
|
132
|
+
enabled: (options.enabled ?? true) && !!client,
|
|
133
|
+
refetchInterval: resolveRefetchInterval(options.refetchIntervalMs, 10000),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
export function useCommitDetail(seq, options = {}) {
|
|
137
|
+
const client = useApiClient();
|
|
138
|
+
const { config: connectionConfig } = useConnection();
|
|
139
|
+
const { instanceId: selectedInstanceId } = useInstanceContext();
|
|
140
|
+
const instanceId = options.instanceId ?? selectedInstanceId;
|
|
141
|
+
return useQuery({
|
|
142
|
+
queryKey: queryKeys.commitDetail(seq, options.partitionId, instanceId),
|
|
143
|
+
queryFn: async () => {
|
|
144
|
+
if (!client || !connectionConfig)
|
|
145
|
+
throw new Error('Not connected');
|
|
146
|
+
if (seq === undefined)
|
|
147
|
+
throw new Error('Commit sequence is required');
|
|
148
|
+
const queryString = new URLSearchParams();
|
|
149
|
+
if (options.partitionId)
|
|
150
|
+
queryString.set('partitionId', options.partitionId);
|
|
151
|
+
if (instanceId)
|
|
152
|
+
queryString.set('instanceId', instanceId);
|
|
153
|
+
const suffix = queryString.toString();
|
|
154
|
+
const response = await fetch(`${connectionConfig.serverUrl}/console/commits/${serializePathSegment(seq)}${suffix ? `?${suffix}` : ''}`, { headers: { Authorization: `Bearer ${connectionConfig.token}` } });
|
|
155
|
+
if (!response.ok)
|
|
156
|
+
throw new Error('Failed to fetch commit detail');
|
|
157
|
+
return response.json();
|
|
158
|
+
},
|
|
159
|
+
enabled: (options.enabled ?? true) && seq !== undefined && !!client,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
export function useTimeline(params = {}, options = {}) {
|
|
163
|
+
const client = useApiClient();
|
|
164
|
+
const { instanceId: selectedInstanceId } = useInstanceContext();
|
|
165
|
+
const instanceId = params.instanceId ?? selectedInstanceId;
|
|
166
|
+
const query = withInstanceQuery({
|
|
167
|
+
limit: params.limit,
|
|
168
|
+
offset: params.offset,
|
|
169
|
+
partitionId: params.partitionId,
|
|
170
|
+
view: params.view,
|
|
171
|
+
eventType: params.eventType,
|
|
172
|
+
actorId: params.actorId,
|
|
173
|
+
clientId: params.clientId,
|
|
174
|
+
requestId: params.requestId,
|
|
175
|
+
traceId: params.traceId,
|
|
176
|
+
table: params.table,
|
|
177
|
+
outcome: params.outcome,
|
|
178
|
+
search: params.search,
|
|
179
|
+
from: params.from,
|
|
180
|
+
to: params.to,
|
|
181
|
+
}, instanceId);
|
|
182
|
+
return useQuery({
|
|
183
|
+
queryKey: queryKeys.timeline({ ...params, instanceId }),
|
|
184
|
+
queryFn: () => {
|
|
185
|
+
if (!client)
|
|
186
|
+
throw new Error('Not connected');
|
|
187
|
+
return unwrap(client.GET('/console/timeline', { params: { query } }));
|
|
188
|
+
},
|
|
189
|
+
enabled: (options.enabled ?? true) && !!client,
|
|
190
|
+
refetchInterval: resolveRefetchInterval(options.refetchIntervalMs, 10000),
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
export function useClients(params = {}, options = {}) {
|
|
194
|
+
const client = useApiClient();
|
|
195
|
+
const { instanceId: selectedInstanceId } = useInstanceContext();
|
|
196
|
+
const instanceId = params.instanceId ?? selectedInstanceId;
|
|
197
|
+
const query = withInstanceQuery({
|
|
198
|
+
limit: params.limit,
|
|
199
|
+
offset: params.offset,
|
|
200
|
+
partitionId: params.partitionId,
|
|
201
|
+
}, instanceId);
|
|
202
|
+
return useQuery({
|
|
203
|
+
queryKey: queryKeys.clients({ ...params, instanceId }),
|
|
204
|
+
queryFn: () => {
|
|
205
|
+
if (!client)
|
|
206
|
+
throw new Error('Not connected');
|
|
207
|
+
return unwrap(client.GET('/console/clients', { params: { query } }));
|
|
208
|
+
},
|
|
209
|
+
enabled: (options.enabled ?? true) && !!client,
|
|
210
|
+
refetchInterval: resolveRefetchInterval(options.refetchIntervalMs, 10000),
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
export function useRequestEventDetail(id, options = {}) {
|
|
214
|
+
const client = useApiClient();
|
|
215
|
+
const { config: connectionConfig } = useConnection();
|
|
216
|
+
const { instanceId: selectedInstanceId } = useInstanceContext();
|
|
217
|
+
const instanceId = options.instanceId ?? selectedInstanceId;
|
|
218
|
+
return useQuery({
|
|
219
|
+
queryKey: queryKeys.eventDetail(id, options.partitionId, instanceId),
|
|
220
|
+
queryFn: async () => {
|
|
221
|
+
if (!client || !connectionConfig)
|
|
222
|
+
throw new Error('Not connected');
|
|
223
|
+
if (id === undefined)
|
|
224
|
+
throw new Error('Event id is required');
|
|
225
|
+
const queryString = new URLSearchParams();
|
|
226
|
+
if (options.partitionId)
|
|
227
|
+
queryString.set('partitionId', options.partitionId);
|
|
228
|
+
if (instanceId)
|
|
229
|
+
queryString.set('instanceId', instanceId);
|
|
230
|
+
const suffix = queryString.toString();
|
|
231
|
+
const response = await fetch(`${connectionConfig.serverUrl}/console/events/${serializePathSegment(id)}${suffix ? `?${suffix}` : ''}`, { headers: { Authorization: `Bearer ${connectionConfig.token}` } });
|
|
232
|
+
if (!response.ok)
|
|
233
|
+
throw new Error('Failed to fetch event detail');
|
|
234
|
+
return response.json();
|
|
235
|
+
},
|
|
236
|
+
enabled: (options.enabled ?? true) && id !== undefined && !!client,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
export function useRequestEventPayload(id, options = {}) {
|
|
240
|
+
const client = useApiClient();
|
|
241
|
+
const { config: connectionConfig } = useConnection();
|
|
242
|
+
const { instanceId: selectedInstanceId } = useInstanceContext();
|
|
243
|
+
const instanceId = options.instanceId ?? selectedInstanceId;
|
|
244
|
+
return useQuery({
|
|
245
|
+
queryKey: queryKeys.eventPayload(id, options.partitionId, instanceId),
|
|
246
|
+
queryFn: async () => {
|
|
247
|
+
if (!client || !connectionConfig)
|
|
248
|
+
throw new Error('Not connected');
|
|
249
|
+
if (id === undefined)
|
|
250
|
+
throw new Error('Event id is required');
|
|
251
|
+
const queryString = new URLSearchParams();
|
|
252
|
+
if (options.partitionId)
|
|
253
|
+
queryString.set('partitionId', options.partitionId);
|
|
254
|
+
if (instanceId)
|
|
255
|
+
queryString.set('instanceId', instanceId);
|
|
256
|
+
const suffix = queryString.toString();
|
|
257
|
+
const response = await fetch(`${connectionConfig.serverUrl}/console/events/${serializePathSegment(id)}/payload${suffix ? `?${suffix}` : ''}`, { headers: { Authorization: `Bearer ${connectionConfig.token}` } });
|
|
258
|
+
if (!response.ok)
|
|
259
|
+
throw new Error('Failed to fetch event payload');
|
|
260
|
+
return response.json();
|
|
261
|
+
},
|
|
262
|
+
enabled: (options.enabled ?? true) && id !== undefined && !!client,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
export function useHandlers(options = {}) {
|
|
266
|
+
const client = useApiClient();
|
|
267
|
+
const { config: connectionConfig } = useConnection();
|
|
268
|
+
const { instanceId: selectedInstanceId } = useInstanceContext();
|
|
269
|
+
const instanceId = options.instanceId ?? selectedInstanceId;
|
|
270
|
+
return useQuery({
|
|
271
|
+
queryKey: queryKeys.handlers(instanceId),
|
|
272
|
+
queryFn: async () => {
|
|
273
|
+
if (!client || !connectionConfig)
|
|
274
|
+
throw new Error('Not connected');
|
|
275
|
+
const queryString = new URLSearchParams();
|
|
276
|
+
if (instanceId)
|
|
277
|
+
queryString.set('instanceId', instanceId);
|
|
278
|
+
const response = await fetch(buildConsoleUrl(connectionConfig.serverUrl, '/console/handlers', queryString), {
|
|
279
|
+
headers: { Authorization: `Bearer ${connectionConfig.token}` },
|
|
280
|
+
});
|
|
281
|
+
if (!response.ok)
|
|
282
|
+
throw new Error('Failed to fetch handlers');
|
|
283
|
+
return response.json();
|
|
284
|
+
},
|
|
285
|
+
enabled: !!client && !!connectionConfig,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
export function usePrunePreview(options = {}) {
|
|
289
|
+
const client = useApiClient();
|
|
290
|
+
const { config: connectionConfig } = useConnection();
|
|
291
|
+
const { instanceId: selectedInstanceId } = useInstanceContext();
|
|
292
|
+
const instanceId = options.instanceId ?? selectedInstanceId;
|
|
293
|
+
return useQuery({
|
|
294
|
+
queryKey: queryKeys.prunePreview(instanceId),
|
|
295
|
+
queryFn: async () => {
|
|
296
|
+
if (!client || !connectionConfig)
|
|
297
|
+
throw new Error('Not connected');
|
|
298
|
+
const queryString = new URLSearchParams();
|
|
299
|
+
if (instanceId)
|
|
300
|
+
queryString.set('instanceId', instanceId);
|
|
301
|
+
const response = await fetch(buildConsoleUrl(connectionConfig.serverUrl, '/console/prune/preview', queryString), {
|
|
302
|
+
method: 'POST',
|
|
303
|
+
headers: { Authorization: `Bearer ${connectionConfig.token}` },
|
|
304
|
+
});
|
|
305
|
+
if (!response.ok)
|
|
306
|
+
throw new Error('Failed to fetch prune preview');
|
|
307
|
+
return response.json();
|
|
308
|
+
},
|
|
309
|
+
enabled: !!client && !!connectionConfig && (options.enabled ?? true),
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
export function useOperationEvents(params = {}, options = {}) {
|
|
313
|
+
const client = useApiClient();
|
|
314
|
+
const { instanceId: selectedInstanceId } = useInstanceContext();
|
|
315
|
+
const instanceId = params.instanceId ?? selectedInstanceId;
|
|
316
|
+
const query = withInstanceQuery({
|
|
317
|
+
limit: params.limit,
|
|
318
|
+
offset: params.offset,
|
|
319
|
+
operationType: params.operationType,
|
|
320
|
+
partitionId: params.partitionId,
|
|
321
|
+
}, instanceId);
|
|
322
|
+
return useQuery({
|
|
323
|
+
queryKey: queryKeys.operations({ ...params, instanceId }),
|
|
324
|
+
queryFn: () => {
|
|
325
|
+
if (!client)
|
|
326
|
+
throw new Error('Not connected');
|
|
327
|
+
return unwrap(client.GET('/console/operations', { params: { query } }));
|
|
328
|
+
},
|
|
329
|
+
enabled: (options.enabled ?? true) && !!client,
|
|
330
|
+
refetchInterval: resolveRefetchInterval(options.refetchIntervalMs, 10000),
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
export function useEvictClientMutation() {
|
|
334
|
+
const client = useApiClient();
|
|
335
|
+
const { config: connectionConfig } = useConnection();
|
|
336
|
+
const { instanceId: selectedInstanceId } = useInstanceContext();
|
|
337
|
+
const queryClient = useQueryClient();
|
|
338
|
+
return useMutation({
|
|
339
|
+
mutationFn: async ({ clientId, partitionId, instanceId }) => {
|
|
340
|
+
if (!client || !connectionConfig)
|
|
341
|
+
throw new Error('Not connected');
|
|
342
|
+
const effectiveInstanceId = instanceId ?? selectedInstanceId;
|
|
343
|
+
const queryString = new URLSearchParams();
|
|
344
|
+
if (partitionId)
|
|
345
|
+
queryString.set('partitionId', partitionId);
|
|
346
|
+
if (effectiveInstanceId)
|
|
347
|
+
queryString.set('instanceId', effectiveInstanceId);
|
|
348
|
+
const response = await fetch(buildConsoleUrl(connectionConfig.serverUrl, `/console/clients/${serializePathSegment(clientId)}`, queryString), {
|
|
349
|
+
method: 'DELETE',
|
|
350
|
+
headers: { Authorization: `Bearer ${connectionConfig.token}` },
|
|
351
|
+
});
|
|
352
|
+
if (!response.ok)
|
|
353
|
+
throw new Error('Failed to evict client');
|
|
354
|
+
return response.json();
|
|
355
|
+
},
|
|
356
|
+
onSuccess: () => {
|
|
357
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'clients'] });
|
|
358
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'stats'] });
|
|
359
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'operations'] });
|
|
360
|
+
},
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
export function usePruneMutation() {
|
|
364
|
+
const client = useApiClient();
|
|
365
|
+
const { config: connectionConfig } = useConnection();
|
|
366
|
+
const { instanceId } = useInstanceContext();
|
|
367
|
+
const queryClient = useQueryClient();
|
|
368
|
+
return useMutation({
|
|
369
|
+
mutationFn: async () => {
|
|
370
|
+
if (!client || !connectionConfig)
|
|
371
|
+
throw new Error('Not connected');
|
|
372
|
+
const queryString = new URLSearchParams();
|
|
373
|
+
if (instanceId)
|
|
374
|
+
queryString.set('instanceId', instanceId);
|
|
375
|
+
const response = await fetch(buildConsoleUrl(connectionConfig.serverUrl, '/console/prune', queryString), {
|
|
376
|
+
method: 'POST',
|
|
377
|
+
headers: { Authorization: `Bearer ${connectionConfig.token}` },
|
|
378
|
+
});
|
|
379
|
+
if (!response.ok)
|
|
380
|
+
throw new Error('Failed to prune');
|
|
381
|
+
return response.json();
|
|
382
|
+
},
|
|
383
|
+
onSuccess: () => {
|
|
384
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'stats'] });
|
|
385
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'commits'] });
|
|
386
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'timeline'] });
|
|
387
|
+
queryClient.invalidateQueries({
|
|
388
|
+
queryKey: ['console', 'prune', 'preview'],
|
|
389
|
+
});
|
|
390
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'operations'] });
|
|
391
|
+
},
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
export function useCompactMutation() {
|
|
395
|
+
const client = useApiClient();
|
|
396
|
+
const { config: connectionConfig } = useConnection();
|
|
397
|
+
const { instanceId } = useInstanceContext();
|
|
398
|
+
const queryClient = useQueryClient();
|
|
399
|
+
return useMutation({
|
|
400
|
+
mutationFn: async () => {
|
|
401
|
+
if (!client || !connectionConfig)
|
|
402
|
+
throw new Error('Not connected');
|
|
403
|
+
const queryString = new URLSearchParams();
|
|
404
|
+
if (instanceId)
|
|
405
|
+
queryString.set('instanceId', instanceId);
|
|
406
|
+
const response = await fetch(buildConsoleUrl(connectionConfig.serverUrl, '/console/compact', queryString), {
|
|
407
|
+
method: 'POST',
|
|
408
|
+
headers: { Authorization: `Bearer ${connectionConfig.token}` },
|
|
409
|
+
});
|
|
410
|
+
if (!response.ok)
|
|
411
|
+
throw new Error('Failed to compact');
|
|
412
|
+
return response.json();
|
|
413
|
+
},
|
|
414
|
+
onSuccess: () => {
|
|
415
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'stats'] });
|
|
416
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'operations'] });
|
|
417
|
+
},
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
export function useNotifyDataChangeMutation() {
|
|
421
|
+
const client = useApiClient();
|
|
422
|
+
const { config: connectionConfig } = useConnection();
|
|
423
|
+
const { instanceId: selectedInstanceId } = useInstanceContext();
|
|
424
|
+
const queryClient = useQueryClient();
|
|
425
|
+
return useMutation({
|
|
426
|
+
mutationFn: async (request) => {
|
|
427
|
+
if (!client || !connectionConfig)
|
|
428
|
+
throw new Error('Not connected');
|
|
429
|
+
const effectiveInstanceId = request.instanceId ?? selectedInstanceId;
|
|
430
|
+
const queryString = new URLSearchParams();
|
|
431
|
+
if (effectiveInstanceId)
|
|
432
|
+
queryString.set('instanceId', effectiveInstanceId);
|
|
433
|
+
const response = await fetch(buildConsoleUrl(connectionConfig.serverUrl, '/console/notify-data-change', queryString), {
|
|
434
|
+
method: 'POST',
|
|
435
|
+
headers: {
|
|
436
|
+
Authorization: `Bearer ${connectionConfig.token}`,
|
|
437
|
+
'Content-Type': 'application/json',
|
|
438
|
+
},
|
|
439
|
+
body: JSON.stringify({
|
|
440
|
+
tables: request.tables,
|
|
441
|
+
partitionId: request.partitionId,
|
|
442
|
+
}),
|
|
443
|
+
});
|
|
444
|
+
if (!response.ok)
|
|
445
|
+
throw new Error('Failed to notify data change');
|
|
446
|
+
return response.json();
|
|
447
|
+
},
|
|
448
|
+
onSuccess: () => {
|
|
449
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'stats'] });
|
|
450
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'commits'] });
|
|
451
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'timeline'] });
|
|
452
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'operations'] });
|
|
453
|
+
},
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
export function useApiKeys(params = {}) {
|
|
457
|
+
const client = useApiClient();
|
|
458
|
+
const { config: connectionConfig } = useConnection();
|
|
459
|
+
const { instanceId: selectedInstanceId } = useInstanceContext();
|
|
460
|
+
const instanceId = params.instanceId ?? selectedInstanceId;
|
|
461
|
+
return useQuery({
|
|
462
|
+
queryKey: queryKeys.apiKeys({ ...params, instanceId }),
|
|
463
|
+
queryFn: async () => {
|
|
464
|
+
if (!client || !connectionConfig)
|
|
465
|
+
throw new Error('Not connected');
|
|
466
|
+
const queryString = new URLSearchParams();
|
|
467
|
+
if (params.limit !== undefined)
|
|
468
|
+
queryString.set('limit', String(params.limit));
|
|
469
|
+
if (params.offset !== undefined)
|
|
470
|
+
queryString.set('offset', String(params.offset));
|
|
471
|
+
if (params.type)
|
|
472
|
+
queryString.set('type', params.type);
|
|
473
|
+
if (params.status)
|
|
474
|
+
queryString.set('status', params.status);
|
|
475
|
+
if (params.expiresWithinDays !== undefined) {
|
|
476
|
+
queryString.set('expiresWithinDays', String(params.expiresWithinDays));
|
|
477
|
+
}
|
|
478
|
+
if (instanceId)
|
|
479
|
+
queryString.set('instanceId', instanceId);
|
|
480
|
+
const response = await fetch(buildConsoleUrl(connectionConfig.serverUrl, '/console/api-keys', queryString), {
|
|
481
|
+
headers: { Authorization: `Bearer ${connectionConfig.token}` },
|
|
482
|
+
});
|
|
483
|
+
if (!response.ok)
|
|
484
|
+
throw new Error('Failed to fetch API keys');
|
|
485
|
+
return response.json();
|
|
486
|
+
},
|
|
487
|
+
enabled: !!client && !!connectionConfig,
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
export function useCreateApiKeyMutation() {
|
|
491
|
+
const client = useApiClient();
|
|
492
|
+
const { config: connectionConfig } = useConnection();
|
|
493
|
+
const { instanceId } = useInstanceContext();
|
|
494
|
+
const queryClient = useQueryClient();
|
|
495
|
+
return useMutation({
|
|
496
|
+
mutationFn: async (request) => {
|
|
497
|
+
if (!client || !connectionConfig)
|
|
498
|
+
throw new Error('Not connected');
|
|
499
|
+
const queryString = new URLSearchParams();
|
|
500
|
+
if (instanceId)
|
|
501
|
+
queryString.set('instanceId', instanceId);
|
|
502
|
+
const response = await fetch(buildConsoleUrl(connectionConfig.serverUrl, '/console/api-keys', queryString), {
|
|
503
|
+
method: 'POST',
|
|
504
|
+
headers: {
|
|
505
|
+
Authorization: `Bearer ${connectionConfig.token}`,
|
|
506
|
+
'Content-Type': 'application/json',
|
|
507
|
+
},
|
|
508
|
+
body: JSON.stringify(request),
|
|
509
|
+
});
|
|
510
|
+
if (!response.ok)
|
|
511
|
+
throw new Error('Failed to create API key');
|
|
512
|
+
return response.json();
|
|
513
|
+
},
|
|
514
|
+
onSuccess: () => {
|
|
515
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'api-keys'] });
|
|
516
|
+
},
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
export function useRevokeApiKeyMutation() {
|
|
520
|
+
const client = useApiClient();
|
|
521
|
+
const { config: connectionConfig } = useConnection();
|
|
522
|
+
const { instanceId } = useInstanceContext();
|
|
523
|
+
const queryClient = useQueryClient();
|
|
524
|
+
return useMutation({
|
|
525
|
+
mutationFn: async (keyId) => {
|
|
526
|
+
if (!client || !connectionConfig)
|
|
527
|
+
throw new Error('Not connected');
|
|
528
|
+
const queryString = new URLSearchParams();
|
|
529
|
+
if (instanceId)
|
|
530
|
+
queryString.set('instanceId', instanceId);
|
|
531
|
+
const response = await fetch(buildConsoleUrl(connectionConfig.serverUrl, `/console/api-keys/${serializePathSegment(keyId)}`, queryString), {
|
|
532
|
+
method: 'DELETE',
|
|
533
|
+
headers: { Authorization: `Bearer ${connectionConfig.token}` },
|
|
534
|
+
});
|
|
535
|
+
if (!response.ok)
|
|
536
|
+
throw new Error('Failed to revoke API key');
|
|
537
|
+
return response.json();
|
|
538
|
+
},
|
|
539
|
+
onSuccess: () => {
|
|
540
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'api-keys'] });
|
|
541
|
+
},
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
export function useBulkRevokeApiKeysMutation() {
|
|
545
|
+
const client = useApiClient();
|
|
546
|
+
const { config: connectionConfig } = useConnection();
|
|
547
|
+
const { instanceId } = useInstanceContext();
|
|
548
|
+
const queryClient = useQueryClient();
|
|
549
|
+
return useMutation({
|
|
550
|
+
mutationFn: async (request) => {
|
|
551
|
+
if (!client || !connectionConfig)
|
|
552
|
+
throw new Error('Not connected');
|
|
553
|
+
const queryString = new URLSearchParams();
|
|
554
|
+
if (instanceId)
|
|
555
|
+
queryString.set('instanceId', instanceId);
|
|
556
|
+
const response = await fetch(buildConsoleUrl(connectionConfig.serverUrl, '/console/api-keys/bulk-revoke', queryString), {
|
|
557
|
+
method: 'POST',
|
|
558
|
+
headers: {
|
|
559
|
+
Authorization: `Bearer ${connectionConfig.token}`,
|
|
560
|
+
'Content-Type': 'application/json',
|
|
561
|
+
},
|
|
562
|
+
body: JSON.stringify(request),
|
|
563
|
+
});
|
|
564
|
+
if (!response.ok)
|
|
565
|
+
throw new Error('Failed to bulk revoke API keys');
|
|
566
|
+
return response.json();
|
|
567
|
+
},
|
|
568
|
+
onSuccess: () => {
|
|
569
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'api-keys'] });
|
|
570
|
+
},
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
export function useRotateApiKeyMutation() {
|
|
574
|
+
const client = useApiClient();
|
|
575
|
+
const { config: connectionConfig } = useConnection();
|
|
576
|
+
const { instanceId } = useInstanceContext();
|
|
577
|
+
const queryClient = useQueryClient();
|
|
578
|
+
return useMutation({
|
|
579
|
+
mutationFn: async (keyId) => {
|
|
580
|
+
if (!client || !connectionConfig)
|
|
581
|
+
throw new Error('Not connected');
|
|
582
|
+
const queryString = new URLSearchParams();
|
|
583
|
+
if (instanceId)
|
|
584
|
+
queryString.set('instanceId', instanceId);
|
|
585
|
+
const response = await fetch(buildConsoleUrl(connectionConfig.serverUrl, `/console/api-keys/${serializePathSegment(keyId)}/rotate`, queryString), {
|
|
586
|
+
method: 'POST',
|
|
587
|
+
headers: { Authorization: `Bearer ${connectionConfig.token}` },
|
|
588
|
+
});
|
|
589
|
+
if (!response.ok)
|
|
590
|
+
throw new Error('Failed to rotate API key');
|
|
591
|
+
return response.json();
|
|
592
|
+
},
|
|
593
|
+
onSuccess: () => {
|
|
594
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'api-keys'] });
|
|
595
|
+
},
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
export function useStageRotateApiKeyMutation() {
|
|
599
|
+
const client = useApiClient();
|
|
600
|
+
const { config: connectionConfig } = useConnection();
|
|
601
|
+
const { instanceId } = useInstanceContext();
|
|
602
|
+
const queryClient = useQueryClient();
|
|
603
|
+
return useMutation({
|
|
604
|
+
mutationFn: async (keyId) => {
|
|
605
|
+
if (!client || !connectionConfig)
|
|
606
|
+
throw new Error('Not connected');
|
|
607
|
+
const queryString = new URLSearchParams();
|
|
608
|
+
if (instanceId)
|
|
609
|
+
queryString.set('instanceId', instanceId);
|
|
610
|
+
const response = await fetch(buildConsoleUrl(connectionConfig.serverUrl, `/console/api-keys/${serializePathSegment(keyId)}/rotate/stage`, queryString), {
|
|
611
|
+
method: 'POST',
|
|
612
|
+
headers: { Authorization: `Bearer ${connectionConfig.token}` },
|
|
613
|
+
});
|
|
614
|
+
if (!response.ok)
|
|
615
|
+
throw new Error('Failed to stage-rotate API key');
|
|
616
|
+
return response.json();
|
|
617
|
+
},
|
|
618
|
+
onSuccess: () => {
|
|
619
|
+
queryClient.invalidateQueries({ queryKey: ['console', 'api-keys'] });
|
|
620
|
+
},
|
|
621
|
+
});
|
|
622
|
+
}
|
|
623
|
+
//# sourceMappingURL=useConsoleApi.js.map
|