@robosystems/client 0.2.48 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/extensions/InvestorClient.d.ts +91 -0
  2. package/extensions/InvestorClient.js +223 -0
  3. package/extensions/InvestorClient.ts +501 -0
  4. package/extensions/LedgerClient.d.ts +213 -165
  5. package/extensions/LedgerClient.js +315 -393
  6. package/extensions/LedgerClient.ts +887 -564
  7. package/extensions/ReportClient.d.ts +77 -115
  8. package/extensions/ReportClient.js +124 -211
  9. package/extensions/ReportClient.ts +298 -358
  10. package/extensions/config.js +1 -1
  11. package/extensions/config.ts +1 -1
  12. package/extensions/graphql/client.d.ts +46 -0
  13. package/extensions/graphql/client.js +75 -0
  14. package/extensions/graphql/client.ts +82 -0
  15. package/extensions/graphql/generated/graphql.d.ts +1786 -0
  16. package/extensions/graphql/generated/graphql.js +2671 -0
  17. package/extensions/graphql/generated/graphql.ts +4491 -0
  18. package/extensions/graphql/queries/investor/holdings.d.ts +8 -0
  19. package/extensions/graphql/queries/investor/holdings.js +36 -0
  20. package/extensions/graphql/queries/investor/holdings.ts +34 -0
  21. package/extensions/graphql/queries/investor/portfolio.d.ts +4 -0
  22. package/extensions/graphql/queries/investor/portfolio.js +21 -0
  23. package/extensions/graphql/queries/investor/portfolio.ts +19 -0
  24. package/extensions/graphql/queries/investor/portfolios.d.ts +4 -0
  25. package/extensions/graphql/queries/investor/portfolios.js +29 -0
  26. package/extensions/graphql/queries/investor/portfolios.ts +27 -0
  27. package/extensions/graphql/queries/investor/position.d.ts +4 -0
  28. package/extensions/graphql/queries/investor/position.js +33 -0
  29. package/extensions/graphql/queries/investor/position.ts +31 -0
  30. package/extensions/graphql/queries/investor/positions.d.ts +8 -0
  31. package/extensions/graphql/queries/investor/positions.js +57 -0
  32. package/extensions/graphql/queries/investor/positions.ts +55 -0
  33. package/extensions/graphql/queries/investor/securities.d.ts +8 -0
  34. package/extensions/graphql/queries/investor/securities.js +50 -0
  35. package/extensions/graphql/queries/investor/securities.ts +48 -0
  36. package/extensions/graphql/queries/investor/security.d.ts +4 -0
  37. package/extensions/graphql/queries/investor/security.js +26 -0
  38. package/extensions/graphql/queries/investor/security.ts +24 -0
  39. package/extensions/graphql/queries/ledger/accountRollups.d.ts +7 -0
  40. package/extensions/graphql/queries/ledger/accountRollups.js +36 -0
  41. package/extensions/graphql/queries/ledger/accountRollups.ts +34 -0
  42. package/extensions/graphql/queries/ledger/accountTree.d.ts +11 -0
  43. package/extensions/graphql/queries/ledger/accountTree.js +61 -0
  44. package/extensions/graphql/queries/ledger/accountTree.ts +59 -0
  45. package/extensions/graphql/queries/ledger/accounts.d.ts +8 -0
  46. package/extensions/graphql/queries/ledger/accounts.js +45 -0
  47. package/extensions/graphql/queries/ledger/accounts.ts +43 -0
  48. package/extensions/graphql/queries/ledger/closingBookStructures.d.ts +6 -0
  49. package/extensions/graphql/queries/ledger/closingBookStructures.js +27 -0
  50. package/extensions/graphql/queries/ledger/closingBookStructures.ts +25 -0
  51. package/extensions/graphql/queries/ledger/elements.d.ts +6 -0
  52. package/extensions/graphql/queries/ledger/elements.js +56 -0
  53. package/extensions/graphql/queries/ledger/elements.ts +54 -0
  54. package/extensions/graphql/queries/ledger/entities.d.ts +7 -0
  55. package/extensions/graphql/queries/ledger/entities.js +31 -0
  56. package/extensions/graphql/queries/ledger/entities.ts +29 -0
  57. package/extensions/graphql/queries/ledger/entity.d.ts +14 -0
  58. package/extensions/graphql/queries/ledger/entity.js +55 -0
  59. package/extensions/graphql/queries/ledger/entity.ts +54 -0
  60. package/extensions/graphql/queries/ledger/fiscalCalendar.d.ts +8 -0
  61. package/extensions/graphql/queries/ledger/fiscalCalendar.js +35 -0
  62. package/extensions/graphql/queries/ledger/fiscalCalendar.ts +33 -0
  63. package/extensions/graphql/queries/ledger/mappedTrialBalance.d.ts +9 -0
  64. package/extensions/graphql/queries/ledger/mappedTrialBalance.js +29 -0
  65. package/extensions/graphql/queries/ledger/mappedTrialBalance.ts +27 -0
  66. package/extensions/graphql/queries/ledger/mapping.d.ts +5 -0
  67. package/extensions/graphql/queries/ledger/mapping.js +35 -0
  68. package/extensions/graphql/queries/ledger/mapping.ts +33 -0
  69. package/extensions/graphql/queries/ledger/mappingCoverage.d.ts +5 -0
  70. package/extensions/graphql/queries/ledger/mappingCoverage.js +22 -0
  71. package/extensions/graphql/queries/ledger/mappingCoverage.ts +20 -0
  72. package/extensions/graphql/queries/ledger/mappings.d.ts +6 -0
  73. package/extensions/graphql/queries/ledger/mappings.js +23 -0
  74. package/extensions/graphql/queries/ledger/mappings.ts +21 -0
  75. package/extensions/graphql/queries/ledger/periodCloseStatus.d.ts +6 -0
  76. package/extensions/graphql/queries/ledger/periodCloseStatus.js +29 -0
  77. package/extensions/graphql/queries/ledger/periodCloseStatus.ts +27 -0
  78. package/extensions/graphql/queries/ledger/periodDrafts.d.ts +8 -0
  79. package/extensions/graphql/queries/ledger/periodDrafts.js +45 -0
  80. package/extensions/graphql/queries/ledger/periodDrafts.ts +43 -0
  81. package/extensions/graphql/queries/ledger/publishList.d.ts +5 -0
  82. package/extensions/graphql/queries/ledger/publishList.js +29 -0
  83. package/extensions/graphql/queries/ledger/publishList.ts +27 -0
  84. package/extensions/graphql/queries/ledger/publishLists.d.ts +5 -0
  85. package/extensions/graphql/queries/ledger/publishLists.js +29 -0
  86. package/extensions/graphql/queries/ledger/publishLists.ts +27 -0
  87. package/extensions/graphql/queries/ledger/report.d.ts +5 -0
  88. package/extensions/graphql/queries/ledger/report.js +40 -0
  89. package/extensions/graphql/queries/ledger/report.ts +38 -0
  90. package/extensions/graphql/queries/ledger/reportingTaxonomy.d.ts +6 -0
  91. package/extensions/graphql/queries/ledger/reportingTaxonomy.js +27 -0
  92. package/extensions/graphql/queries/ledger/reportingTaxonomy.ts +25 -0
  93. package/extensions/graphql/queries/ledger/reports.d.ts +8 -0
  94. package/extensions/graphql/queries/ledger/reports.js +45 -0
  95. package/extensions/graphql/queries/ledger/reports.ts +43 -0
  96. package/extensions/graphql/queries/ledger/scheduleFacts.d.ts +7 -0
  97. package/extensions/graphql/queries/ledger/scheduleFacts.js +24 -0
  98. package/extensions/graphql/queries/ledger/scheduleFacts.ts +22 -0
  99. package/extensions/graphql/queries/ledger/schedules.d.ts +6 -0
  100. package/extensions/graphql/queries/ledger/schedules.js +24 -0
  101. package/extensions/graphql/queries/ledger/schedules.ts +22 -0
  102. package/extensions/graphql/queries/ledger/statement.d.ts +9 -0
  103. package/extensions/graphql/queries/ledger/statement.js +43 -0
  104. package/extensions/graphql/queries/ledger/statement.ts +41 -0
  105. package/extensions/graphql/queries/ledger/structures.d.ts +5 -0
  106. package/extensions/graphql/queries/ledger/structures.js +22 -0
  107. package/extensions/graphql/queries/ledger/structures.ts +20 -0
  108. package/extensions/graphql/queries/ledger/summary.d.ts +7 -0
  109. package/extensions/graphql/queries/ledger/summary.js +25 -0
  110. package/extensions/graphql/queries/ledger/summary.ts +23 -0
  111. package/extensions/graphql/queries/ledger/taxonomies.d.ts +5 -0
  112. package/extensions/graphql/queries/ledger/taxonomies.js +28 -0
  113. package/extensions/graphql/queries/ledger/taxonomies.ts +26 -0
  114. package/extensions/graphql/queries/ledger/transaction.d.ts +6 -0
  115. package/extensions/graphql/queries/ledger/transaction.js +49 -0
  116. package/extensions/graphql/queries/ledger/transaction.ts +47 -0
  117. package/extensions/graphql/queries/ledger/transactions.d.ts +7 -0
  118. package/extensions/graphql/queries/ledger/transactions.js +49 -0
  119. package/extensions/graphql/queries/ledger/transactions.ts +47 -0
  120. package/extensions/graphql/queries/ledger/trialBalance.d.ts +7 -0
  121. package/extensions/graphql/queries/ledger/trialBalance.js +28 -0
  122. package/extensions/graphql/queries/ledger/trialBalance.ts +26 -0
  123. package/extensions/graphql/queries/ledger/unmappedElements.d.ts +8 -0
  124. package/extensions/graphql/queries/ledger/unmappedElements.js +29 -0
  125. package/extensions/graphql/queries/ledger/unmappedElements.ts +27 -0
  126. package/extensions/hooks.d.ts +1 -1
  127. package/extensions/index.d.ts +5 -1
  128. package/extensions/index.js +13 -1
  129. package/extensions/index.ts +14 -0
  130. package/index.ts +2 -2
  131. package/package.json +14 -5
  132. package/sdk/index.d.ts +2 -2
  133. package/sdk/index.js +38 -65
  134. package/sdk/index.ts +2 -2
  135. package/sdk/sdk.gen.d.ts +101 -220
  136. package/sdk/sdk.gen.js +251 -445
  137. package/sdk/sdk.gen.ts +216 -409
  138. package/sdk/types.gen.d.ts +4586 -7045
  139. package/sdk/types.gen.ts +4702 -7334
  140. package/sdk.gen.d.ts +101 -220
  141. package/sdk.gen.js +251 -445
  142. package/sdk.gen.ts +216 -409
  143. package/types.gen.d.ts +4586 -7045
  144. package/types.gen.ts +4702 -7334
  145. package/extensions/AgentClient.test.ts +0 -403
  146. package/extensions/LedgerClient.test.ts +0 -1138
  147. package/extensions/OperationClient.test.ts +0 -365
  148. package/extensions/QueryClient.test.ts +0 -432
  149. package/extensions/ReportClient.test.ts +0 -828
  150. package/extensions/SSEClient.test.ts +0 -375
  151. package/extensions/config.test.ts +0 -199
  152. package/extensions/hooks.test.ts +0 -373
  153. package/extensions/index.test.ts +0 -420
  154. package/sdk-extensions/AgentClient.d.ts +0 -82
  155. package/sdk-extensions/AgentClient.js +0 -218
  156. package/sdk-extensions/AgentClient.test.ts +0 -403
  157. package/sdk-extensions/AgentClient.ts +0 -321
  158. package/sdk-extensions/LedgerClient.d.ts +0 -242
  159. package/sdk-extensions/LedgerClient.js +0 -496
  160. package/sdk-extensions/LedgerClient.test.ts +0 -1138
  161. package/sdk-extensions/LedgerClient.ts +0 -800
  162. package/sdk-extensions/OperationClient.d.ts +0 -65
  163. package/sdk-extensions/OperationClient.js +0 -251
  164. package/sdk-extensions/OperationClient.test.ts +0 -365
  165. package/sdk-extensions/OperationClient.ts +0 -324
  166. package/sdk-extensions/QueryClient.d.ts +0 -52
  167. package/sdk-extensions/QueryClient.js +0 -313
  168. package/sdk-extensions/QueryClient.test.ts +0 -432
  169. package/sdk-extensions/QueryClient.ts +0 -420
  170. package/sdk-extensions/README.md +0 -901
  171. package/sdk-extensions/ReportClient.d.ts +0 -151
  172. package/sdk-extensions/ReportClient.js +0 -278
  173. package/sdk-extensions/ReportClient.test.ts +0 -828
  174. package/sdk-extensions/ReportClient.ts +0 -486
  175. package/sdk-extensions/SSEClient.d.ts +0 -62
  176. package/sdk-extensions/SSEClient.js +0 -154
  177. package/sdk-extensions/SSEClient.test.ts +0 -375
  178. package/sdk-extensions/SSEClient.ts +0 -210
  179. package/sdk-extensions/config.d.ts +0 -57
  180. package/sdk-extensions/config.js +0 -152
  181. package/sdk-extensions/config.test.ts +0 -199
  182. package/sdk-extensions/config.ts +0 -175
  183. package/sdk-extensions/hooks.d.ts +0 -110
  184. package/sdk-extensions/hooks.js +0 -384
  185. package/sdk-extensions/hooks.test.ts +0 -373
  186. package/sdk-extensions/hooks.ts +0 -459
  187. package/sdk-extensions/index.d.ts +0 -63
  188. package/sdk-extensions/index.js +0 -164
  189. package/sdk-extensions/index.test.ts +0 -420
  190. package/sdk-extensions/index.ts +0 -203
@@ -1,324 +0,0 @@
1
- 'use client'
2
-
3
- /**
4
- * General Operations Client for monitoring async operations
5
- * Handles graph creation, backups, imports, and other long-running tasks
6
- */
7
-
8
- import { cancelOperation as cancelOperationSDK, getOperationStatus } from '../sdk/sdk.gen'
9
- import { EventType, SSEClient } from './SSEClient'
10
-
11
- export interface OperationProgress {
12
- message: string
13
- progressPercent?: number
14
- details?: Record<string, any>
15
- }
16
-
17
- export interface OperationResult<T = any> {
18
- success: boolean
19
- result?: T
20
- error?: string
21
- metadata?: Record<string, any>
22
- }
23
-
24
- export interface OperationMonitorOptions {
25
- onProgress?: (progress: OperationProgress) => void
26
- onQueueUpdate?: (position: number, estimatedWait: number) => void
27
- timeout?: number
28
- }
29
-
30
- export class OperationClient {
31
- private sseClients: Map<string, SSEClient> = new Map()
32
- private cleanupTimeouts: Map<string, ReturnType<typeof setTimeout>> = new Map()
33
- private config: {
34
- baseUrl: string
35
- credentials?: 'include' | 'same-origin' | 'omit'
36
- headers?: Record<string, string>
37
- token?: string // JWT token for authentication
38
- maxRetries?: number
39
- retryDelay?: number
40
- }
41
- private cleanupIntervalMs = 300000 // 5 minutes
42
- private cleanupInterval?: ReturnType<typeof setInterval>
43
-
44
- constructor(config: {
45
- baseUrl: string
46
- credentials?: 'include' | 'same-origin' | 'omit'
47
- headers?: Record<string, string>
48
- token?: string // JWT token for authentication
49
- maxRetries?: number
50
- retryDelay?: number
51
- }) {
52
- this.config = config
53
-
54
- // Start periodic cleanup check every 5 minutes
55
- this.cleanupInterval = setInterval(() => {
56
- this.performPeriodicCleanup()
57
- }, this.cleanupIntervalMs)
58
- }
59
-
60
- async monitorOperation<T = any>(
61
- operationId: string,
62
- options: OperationMonitorOptions = {}
63
- ): Promise<OperationResult<T>> {
64
- return new Promise((resolve, reject) => {
65
- const sseClient = new SSEClient(this.config)
66
- this.sseClients.set(operationId, sseClient)
67
-
68
- const timeoutHandle = options.timeout
69
- ? setTimeout(() => {
70
- this.cleanupClient(operationId)
71
- reject(new Error(`Operation timeout after ${options.timeout}ms`))
72
- }, options.timeout)
73
- : undefined
74
-
75
- sseClient
76
- .connect(operationId)
77
- .then(() => {
78
- let result: OperationResult<T> = { success: false }
79
-
80
- // Track queue updates
81
- if (options.onQueueUpdate) {
82
- sseClient.on(EventType.QUEUE_UPDATE, (data) => {
83
- options.onQueueUpdate!(
84
- data.position || data.queue_position,
85
- data.estimated_wait_seconds || 0
86
- )
87
- })
88
- }
89
-
90
- // Track progress
91
- if (options.onProgress) {
92
- sseClient.on(EventType.OPERATION_PROGRESS, (data) => {
93
- options.onProgress!({
94
- message: data.message || data.status || 'Processing...',
95
- progressPercent: data.progress_percent || data.progress,
96
- details: data,
97
- })
98
- })
99
- }
100
-
101
- // Handle completion
102
- sseClient.on(EventType.OPERATION_COMPLETED, (data) => {
103
- if (timeoutHandle) clearTimeout(timeoutHandle)
104
- result = {
105
- success: true,
106
- result: data.result || data,
107
- metadata: data.metadata,
108
- }
109
- // Schedule cleanup after a short delay to ensure all data is received
110
- this.scheduleCleanup(operationId, 5000)
111
- resolve(result)
112
- })
113
-
114
- // Handle errors
115
- sseClient.on(EventType.OPERATION_ERROR, (error) => {
116
- if (timeoutHandle) clearTimeout(timeoutHandle)
117
- result = {
118
- success: false,
119
- error: error.message || error.error || 'Operation failed',
120
- metadata: error.metadata,
121
- }
122
- // Schedule cleanup after a short delay
123
- this.scheduleCleanup(operationId, 5000)
124
- resolve(result) // Resolve with error result, not reject
125
- })
126
-
127
- // Handle cancellation
128
- sseClient.on(EventType.OPERATION_CANCELLED, (data) => {
129
- if (timeoutHandle) clearTimeout(timeoutHandle)
130
- result = {
131
- success: false,
132
- error: 'Operation cancelled',
133
- metadata: data,
134
- }
135
- // Schedule cleanup after a short delay
136
- this.scheduleCleanup(operationId, 5000)
137
- resolve(result)
138
- })
139
- })
140
- .catch((error) => {
141
- if (timeoutHandle) clearTimeout(timeoutHandle)
142
- this.cleanupClient(operationId)
143
- reject(error)
144
- })
145
- })
146
- }
147
-
148
- /**
149
- * Monitor multiple operations concurrently
150
- */
151
- async monitorMultiple<T = any>(
152
- operationIds: string[],
153
- options: OperationMonitorOptions = {}
154
- ): Promise<Map<string, OperationResult<T>>> {
155
- const results = await Promise.all(
156
- operationIds.map(async (id) => {
157
- const result = await this.monitorOperation<T>(id, options)
158
- return [id, result] as [string, OperationResult<T>]
159
- })
160
- )
161
- return new Map(results)
162
- }
163
-
164
- /**
165
- * Get the current status of an operation (point-in-time check)
166
- */
167
- async getStatus(operationId: string): Promise<any> {
168
- const response = await getOperationStatus({
169
- path: { operation_id: operationId },
170
- })
171
- return response.data
172
- }
173
-
174
- /**
175
- * Cancel a pending or running operation
176
- */
177
- async cancelOperation(operationId: string): Promise<void> {
178
- // First close any active SSE connection
179
- this.cleanupClient(operationId)
180
-
181
- // Then cancel the operation
182
- await cancelOperationSDK({
183
- path: { operation_id: operationId },
184
- })
185
- }
186
-
187
- /**
188
- * Wait for an operation with a simple promise interface
189
- */
190
- async waitForOperation<T = any>(operationId: string, timeoutMs?: number): Promise<T> {
191
- const result = await this.monitorOperation<T>(operationId, {
192
- timeout: timeoutMs,
193
- })
194
-
195
- if (!result.success) {
196
- throw new Error(result.error || 'Operation failed')
197
- }
198
-
199
- return result.result as T
200
- }
201
-
202
- /**
203
- * Monitor operation with async iterator for progress updates
204
- */
205
- async *monitorWithProgress<T = any>(
206
- operationId: string
207
- ): AsyncIterableIterator<OperationProgress | OperationResult<T>> {
208
- const progressQueue: (OperationProgress | OperationResult<T>)[] = []
209
- let completed = false
210
- let finalResult: OperationResult<T> | null = null
211
-
212
- // Start monitoring in background
213
- const monitorPromise = this.monitorOperation<T>(operationId, {
214
- onProgress: (progress) => {
215
- progressQueue.push(progress)
216
- },
217
- onQueueUpdate: (position, estimatedWait) => {
218
- progressQueue.push({
219
- message: `Queue position: ${position}`,
220
- progressPercent: 0,
221
- details: { position, estimatedWait },
222
- })
223
- },
224
- })
225
-
226
- // Handle completion
227
- monitorPromise
228
- .then((result) => {
229
- finalResult = result
230
- completed = true
231
- })
232
- .catch((error) => {
233
- finalResult = {
234
- success: false,
235
- error: error.message,
236
- }
237
- completed = true
238
- })
239
-
240
- // Yield progress updates as they come
241
- while (!completed || progressQueue.length > 0) {
242
- if (progressQueue.length > 0) {
243
- yield progressQueue.shift()!
244
- } else if (!completed) {
245
- // Wait for more progress
246
- await new Promise((resolve) => setTimeout(resolve, 100))
247
- }
248
- }
249
-
250
- // Yield final result
251
- if (finalResult) {
252
- yield finalResult
253
- }
254
- }
255
-
256
- private cleanupClient(operationId: string): void {
257
- const client = this.sseClients.get(operationId)
258
- if (client) {
259
- client.close()
260
- this.sseClients.delete(operationId)
261
- }
262
-
263
- // Clear any cleanup timeout for this operation
264
- const timeout = this.cleanupTimeouts.get(operationId)
265
- if (timeout) {
266
- clearTimeout(timeout)
267
- this.cleanupTimeouts.delete(operationId)
268
- }
269
- }
270
-
271
- /**
272
- * Schedule automatic cleanup of SSE client after a delay
273
- */
274
- private scheduleCleanup(operationId: string, delayMs: number = 60000): void {
275
- // Clear any existing timeout
276
- const existingTimeout = this.cleanupTimeouts.get(operationId)
277
- if (existingTimeout) {
278
- clearTimeout(existingTimeout)
279
- }
280
-
281
- // Schedule new cleanup
282
- const timeout = setTimeout(() => {
283
- this.cleanupClient(operationId)
284
- this.cleanupTimeouts.delete(operationId)
285
- }, delayMs)
286
-
287
- this.cleanupTimeouts.set(operationId, timeout)
288
- }
289
-
290
- /**
291
- * Perform periodic cleanup of stale SSE connections
292
- */
293
- private performPeriodicCleanup(): void {
294
- // Check each SSE client for staleness
295
- this.sseClients.forEach((client, operationId) => {
296
- if (!client.isConnected()) {
297
- // Clean up disconnected clients immediately
298
- this.cleanupClient(operationId)
299
- }
300
- })
301
- }
302
-
303
- /**
304
- * Close all active SSE connections and clean up resources
305
- */
306
- closeAll(): void {
307
- // Clear periodic cleanup interval
308
- if (this.cleanupInterval) {
309
- clearInterval(this.cleanupInterval)
310
- this.cleanupInterval = undefined
311
- }
312
-
313
- // Clear all cleanup timeouts
314
- this.cleanupTimeouts.forEach((timeout) => {
315
- clearTimeout(timeout)
316
- })
317
- this.cleanupTimeouts.clear()
318
-
319
- // Close all SSE clients
320
- this.sseClients.forEach((client, operationId) => {
321
- this.cleanupClient(operationId)
322
- })
323
- }
324
- }
@@ -1,52 +0,0 @@
1
- export interface QueryRequest {
2
- query: string;
3
- parameters?: Record<string, any>;
4
- timeout?: number;
5
- }
6
- export interface QueryOptions {
7
- mode?: 'auto' | 'sync' | 'async' | 'stream';
8
- chunkSize?: number;
9
- testMode?: boolean;
10
- maxWait?: number;
11
- onQueueUpdate?: (position: number, estimatedWait: number) => void;
12
- onProgress?: (message: string) => void;
13
- }
14
- export interface QueryResult {
15
- data: any[];
16
- columns: string[];
17
- row_count: number;
18
- execution_time_ms: number;
19
- graph_id?: string;
20
- timestamp?: string;
21
- }
22
- export interface QueuedQueryResponse {
23
- status: 'queued';
24
- operation_id: string;
25
- queue_position: number;
26
- estimated_wait_seconds: number;
27
- message: string;
28
- }
29
- export declare class QueryClient {
30
- private sseClient?;
31
- private config;
32
- constructor(config: {
33
- baseUrl: string;
34
- credentials?: 'include' | 'same-origin' | 'omit';
35
- headers?: Record<string, string>;
36
- token?: string;
37
- });
38
- executeQuery(graphId: string, request: QueryRequest, options?: QueryOptions): Promise<QueryResult | AsyncIterableIterator<any>>;
39
- private parseNDJSONResponse;
40
- private streamQueryResults;
41
- private waitForQueryCompletion;
42
- query(graphId: string, cypher: string, parameters?: Record<string, any>): Promise<QueryResult>;
43
- streamQuery(graphId: string, cypher: string, parameters?: Record<string, any>, chunkSize?: number): AsyncIterableIterator<any>;
44
- close(): void;
45
- }
46
- /**
47
- * Error thrown when query is queued and maxWait is 0
48
- */
49
- export declare class QueuedQueryError extends Error {
50
- queueInfo: QueuedQueryResponse;
51
- constructor(queueInfo: QueuedQueryResponse);
52
- }
@@ -1,313 +0,0 @@
1
- 'use client';
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.QueuedQueryError = exports.QueryClient = void 0;
5
- /**
6
- * Enhanced Query Client with SSE support
7
- * Provides intelligent query execution with automatic strategy selection
8
- */
9
- const sdk_gen_1 = require("../sdk/sdk.gen");
10
- const SSEClient_1 = require("./SSEClient");
11
- class QueryClient {
12
- constructor(config) {
13
- this.config = config;
14
- }
15
- async executeQuery(graphId, request, options = {}) {
16
- const data = {
17
- url: '/v1/graphs/{graph_id}/query',
18
- path: { graph_id: graphId },
19
- body: {
20
- query: request.query,
21
- parameters: request.parameters,
22
- },
23
- query: {
24
- mode: options.mode,
25
- test_mode: options.testMode,
26
- },
27
- // For streaming mode, don't parse response - get raw Response object
28
- ...(options.mode === 'stream' ? { parseAs: 'stream' } : {}),
29
- };
30
- const response = await (0, sdk_gen_1.executeCypherQuery)(data);
31
- // Check for errors in the response (network errors, etc.)
32
- if ('error' in response && response.error) {
33
- const error = response.error;
34
- throw error instanceof Error ? error : new Error(String(error));
35
- }
36
- // Check if this is a raw stream response (when parseAs: 'stream')
37
- if (options.mode === 'stream' && response.response) {
38
- const contentType = response.response.headers.get('content-type') || '';
39
- if (contentType.includes('application/x-ndjson')) {
40
- return this.parseNDJSONResponse(response.response, graphId);
41
- }
42
- else if (contentType.includes('application/json')) {
43
- // Fallback: parse JSON manually
44
- const data = await response.response.json();
45
- if (data.data !== undefined && data.columns) {
46
- return {
47
- data: data.data,
48
- columns: data.columns,
49
- row_count: data.row_count || data.data.length,
50
- execution_time_ms: data.execution_time_ms || 0,
51
- graph_id: graphId,
52
- timestamp: data.timestamp || new Date().toISOString(),
53
- };
54
- }
55
- }
56
- }
57
- const responseData = response.data;
58
- // Check if this is an immediate response
59
- if (responseData?.data !== undefined && responseData?.columns) {
60
- return {
61
- data: responseData.data,
62
- columns: responseData.columns,
63
- row_count: responseData.row_count || responseData.data.length,
64
- execution_time_ms: responseData.execution_time_ms || 0,
65
- graph_id: graphId,
66
- timestamp: responseData.timestamp || new Date().toISOString(),
67
- };
68
- }
69
- // Check if this is a queued response
70
- if (responseData?.status === 'queued' && responseData?.operation_id) {
71
- const queuedResponse = responseData;
72
- // Notify about queue status
73
- options.onQueueUpdate?.(queuedResponse.queue_position, queuedResponse.estimated_wait_seconds);
74
- // If user doesn't want to wait, throw with queue info
75
- if (options.maxWait === 0) {
76
- throw new QueuedQueryError(queuedResponse);
77
- }
78
- // Use SSE to monitor the operation
79
- return this.waitForQueryCompletion(queuedResponse.operation_id, options);
80
- }
81
- // Unexpected response format
82
- throw new Error('Unexpected response format from query endpoint');
83
- }
84
- async parseNDJSONResponse(response, graphId) {
85
- const allData = [];
86
- let columns = null;
87
- let totalRows = 0;
88
- let executionTimeMs = 0;
89
- const parseErrors = [];
90
- let lineNumber = 0;
91
- // Use streaming reader to avoid "body already read" error
92
- const reader = response.body?.getReader();
93
- if (!reader) {
94
- throw new Error('Response body is not readable');
95
- }
96
- const decoder = new TextDecoder();
97
- let buffer = '';
98
- try {
99
- while (true) {
100
- const { done, value } = await reader.read();
101
- if (done)
102
- break;
103
- buffer += decoder.decode(value, { stream: true });
104
- const lines = buffer.split('\n');
105
- buffer = lines.pop() || '';
106
- for (const line of lines) {
107
- lineNumber++;
108
- if (!line.trim())
109
- continue;
110
- try {
111
- const chunk = JSON.parse(line);
112
- // Extract columns from first chunk
113
- if (columns === null && chunk.columns) {
114
- columns = chunk.columns;
115
- }
116
- // Aggregate data rows (NDJSON uses "rows", regular JSON uses "data")
117
- if (chunk.rows) {
118
- allData.push(...chunk.rows);
119
- totalRows += chunk.rows.length;
120
- }
121
- else if (chunk.data) {
122
- allData.push(...chunk.data);
123
- totalRows += chunk.data.length;
124
- }
125
- // Track execution time (use max from all chunks)
126
- if (chunk.execution_time_ms) {
127
- executionTimeMs = Math.max(executionTimeMs, chunk.execution_time_ms);
128
- }
129
- }
130
- catch (error) {
131
- parseErrors.push({
132
- line: lineNumber,
133
- error: error instanceof Error ? error.message : String(error),
134
- });
135
- }
136
- }
137
- }
138
- // Parse any remaining buffer
139
- if (buffer.trim()) {
140
- lineNumber++;
141
- try {
142
- const chunk = JSON.parse(buffer);
143
- if (columns === null && chunk.columns) {
144
- columns = chunk.columns;
145
- }
146
- if (chunk.rows) {
147
- allData.push(...chunk.rows);
148
- totalRows += chunk.rows.length;
149
- }
150
- else if (chunk.data) {
151
- allData.push(...chunk.data);
152
- totalRows += chunk.data.length;
153
- }
154
- if (chunk.execution_time_ms) {
155
- executionTimeMs = Math.max(executionTimeMs, chunk.execution_time_ms);
156
- }
157
- }
158
- catch (error) {
159
- parseErrors.push({
160
- line: lineNumber,
161
- error: error instanceof Error ? error.message : String(error),
162
- });
163
- }
164
- }
165
- }
166
- catch (error) {
167
- throw new Error(`NDJSON stream reading error: ${error}`);
168
- }
169
- // Report parse errors if any occurred
170
- if (parseErrors.length > 0) {
171
- const errorDetails = parseErrors.slice(0, 3).map((e) => `line ${e.line}: ${e.error}`);
172
- const moreErrors = parseErrors.length > 3 ? ` (and ${parseErrors.length - 3} more)` : '';
173
- throw new Error(`NDJSON parsing failed for ${parseErrors.length} line(s): ${errorDetails.join('; ')}${moreErrors}`);
174
- }
175
- // Return aggregated result
176
- return {
177
- data: allData,
178
- columns: columns || [],
179
- row_count: totalRows,
180
- execution_time_ms: executionTimeMs,
181
- graph_id: graphId,
182
- timestamp: new Date().toISOString(),
183
- };
184
- }
185
- async *streamQueryResults(operationId, options) {
186
- const buffer = [];
187
- let completed = false;
188
- let error = null;
189
- // Set up SSE connection
190
- this.sseClient = new SSEClient_1.SSEClient(this.config);
191
- await this.sseClient.connect(operationId);
192
- // Listen for data chunks
193
- this.sseClient.on(SSEClient_1.EventType.DATA_CHUNK, (data) => {
194
- if (Array.isArray(data.rows)) {
195
- buffer.push(...data.rows);
196
- }
197
- else if (data.data) {
198
- buffer.push(...data.data);
199
- }
200
- });
201
- // Listen for queue updates
202
- this.sseClient.on(SSEClient_1.EventType.QUEUE_UPDATE, (data) => {
203
- options.onQueueUpdate?.(data.position, data.estimated_wait_seconds);
204
- });
205
- // Listen for progress
206
- this.sseClient.on(SSEClient_1.EventType.OPERATION_PROGRESS, (data) => {
207
- options.onProgress?.(data.message);
208
- });
209
- // Listen for completion
210
- this.sseClient.on(SSEClient_1.EventType.OPERATION_COMPLETED, (data) => {
211
- if (data.result?.data) {
212
- buffer.push(...data.result.data);
213
- }
214
- completed = true;
215
- });
216
- // Listen for errors
217
- this.sseClient.on(SSEClient_1.EventType.OPERATION_ERROR, (err) => {
218
- error = new Error(err.message || err.error);
219
- completed = true;
220
- });
221
- // Yield buffered results
222
- while (!completed || buffer.length > 0) {
223
- if (error)
224
- throw error;
225
- if (buffer.length > 0) {
226
- const chunk = buffer.splice(0, options.chunkSize || 100);
227
- for (const item of chunk) {
228
- yield item;
229
- }
230
- }
231
- else if (!completed) {
232
- // Wait for more data
233
- await new Promise((resolve) => setTimeout(resolve, 100));
234
- }
235
- }
236
- this.sseClient.close();
237
- this.sseClient = undefined;
238
- }
239
- async waitForQueryCompletion(operationId, options) {
240
- return new Promise((resolve, reject) => {
241
- const sseClient = new SSEClient_1.SSEClient(this.config);
242
- sseClient
243
- .connect(operationId)
244
- .then(() => {
245
- let result = null;
246
- // Listen for queue updates
247
- sseClient.on(SSEClient_1.EventType.QUEUE_UPDATE, (data) => {
248
- options.onQueueUpdate?.(data.position, data.estimated_wait_seconds);
249
- });
250
- // Listen for progress
251
- sseClient.on(SSEClient_1.EventType.OPERATION_PROGRESS, (data) => {
252
- options.onProgress?.(data.message);
253
- });
254
- sseClient.on(SSEClient_1.EventType.OPERATION_COMPLETED, (data) => {
255
- const queryResult = data.result || data;
256
- result = {
257
- data: queryResult.data || [],
258
- columns: queryResult.columns || [],
259
- row_count: queryResult.row_count || 0,
260
- execution_time_ms: queryResult.execution_time_ms || 0,
261
- graph_id: queryResult.graph_id,
262
- timestamp: queryResult.timestamp || new Date().toISOString(),
263
- };
264
- sseClient.close();
265
- resolve(result);
266
- });
267
- sseClient.on(SSEClient_1.EventType.OPERATION_ERROR, (error) => {
268
- sseClient.close();
269
- reject(new Error(error.message || error.error));
270
- });
271
- sseClient.on(SSEClient_1.EventType.OPERATION_CANCELLED, () => {
272
- sseClient.close();
273
- reject(new Error('Query cancelled'));
274
- });
275
- })
276
- .catch(reject);
277
- });
278
- }
279
- // Convenience method for simple queries
280
- async query(graphId, cypher, parameters) {
281
- return this.executeQuery(graphId, { query: cypher, parameters }, { mode: 'auto' });
282
- }
283
- // Streaming query for large results
284
- async *streamQuery(graphId, cypher, parameters, chunkSize = 1000) {
285
- const result = await this.executeQuery(graphId, { query: cypher, parameters }, { mode: 'stream', chunkSize });
286
- if (Symbol.asyncIterator in result) {
287
- yield* result;
288
- }
289
- else {
290
- // If not streaming, yield all results at once
291
- yield* result.data;
292
- }
293
- }
294
- // Cancel any active SSE connections
295
- close() {
296
- if (this.sseClient) {
297
- this.sseClient.close();
298
- this.sseClient = undefined;
299
- }
300
- }
301
- }
302
- exports.QueryClient = QueryClient;
303
- /**
304
- * Error thrown when query is queued and maxWait is 0
305
- */
306
- class QueuedQueryError extends Error {
307
- constructor(queueInfo) {
308
- super('Query was queued');
309
- this.queueInfo = queueInfo;
310
- this.name = 'QueuedQueryError';
311
- }
312
- }
313
- exports.QueuedQueryError = QueuedQueryError;