@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,420 +0,0 @@
1
- 'use client'
2
-
3
- /**
4
- * Enhanced Query Client with SSE support
5
- * Provides intelligent query execution with automatic strategy selection
6
- */
7
-
8
- import { executeCypherQuery } from '../sdk/sdk.gen'
9
- import type { ExecuteCypherQueryData } from '../sdk/types.gen'
10
- import { EventType, SSEClient } from './SSEClient'
11
-
12
- export interface QueryRequest {
13
- query: string
14
- parameters?: Record<string, any>
15
- timeout?: number
16
- }
17
-
18
- export interface QueryOptions {
19
- mode?: 'auto' | 'sync' | 'async' | 'stream'
20
- chunkSize?: number
21
- testMode?: boolean
22
- maxWait?: number
23
- onQueueUpdate?: (position: number, estimatedWait: number) => void
24
- onProgress?: (message: string) => void
25
- }
26
-
27
- export interface QueryResult {
28
- data: any[]
29
- columns: string[]
30
- row_count: number
31
- execution_time_ms: number
32
- graph_id?: string
33
- timestamp?: string
34
- }
35
-
36
- export interface QueuedQueryResponse {
37
- status: 'queued'
38
- operation_id: string
39
- queue_position: number
40
- estimated_wait_seconds: number
41
- message: string
42
- }
43
-
44
- export class QueryClient {
45
- private sseClient?: SSEClient
46
- private config: {
47
- baseUrl: string
48
- credentials?: 'include' | 'same-origin' | 'omit'
49
- headers?: Record<string, string>
50
- token?: string // JWT token for authentication
51
- }
52
-
53
- constructor(config: {
54
- baseUrl: string
55
- credentials?: 'include' | 'same-origin' | 'omit'
56
- headers?: Record<string, string>
57
- token?: string // JWT token for authentication
58
- }) {
59
- this.config = config
60
- }
61
-
62
- async executeQuery(
63
- graphId: string,
64
- request: QueryRequest,
65
- options: QueryOptions = {}
66
- ): Promise<QueryResult | AsyncIterableIterator<any>> {
67
- const data: ExecuteCypherQueryData = {
68
- url: '/v1/graphs/{graph_id}/query' as const,
69
- path: { graph_id: graphId },
70
- body: {
71
- query: request.query,
72
- parameters: request.parameters,
73
- },
74
- query: {
75
- mode: options.mode,
76
- test_mode: options.testMode,
77
- },
78
- // For streaming mode, don't parse response - get raw Response object
79
- ...(options.mode === 'stream' ? { parseAs: 'stream' as const } : {}),
80
- }
81
-
82
- const response = await executeCypherQuery(data)
83
-
84
- // Check for errors in the response (network errors, etc.)
85
- if ('error' in response && response.error) {
86
- const error = response.error as Error
87
- throw error instanceof Error ? error : new Error(String(error))
88
- }
89
-
90
- // Check if this is a raw stream response (when parseAs: 'stream')
91
- if (options.mode === 'stream' && response.response) {
92
- const contentType = response.response.headers.get('content-type') || ''
93
-
94
- if (contentType.includes('application/x-ndjson')) {
95
- return this.parseNDJSONResponse(response.response, graphId)
96
- } else if (contentType.includes('application/json')) {
97
- // Fallback: parse JSON manually
98
- const data = await response.response.json()
99
- if (data.data !== undefined && data.columns) {
100
- return {
101
- data: data.data,
102
- columns: data.columns,
103
- row_count: data.row_count || data.data.length,
104
- execution_time_ms: data.execution_time_ms || 0,
105
- graph_id: graphId,
106
- timestamp: data.timestamp || new Date().toISOString(),
107
- }
108
- }
109
- }
110
- }
111
-
112
- const responseData = response.data as any
113
-
114
- // Check if this is an immediate response
115
- if (responseData?.data !== undefined && responseData?.columns) {
116
- return {
117
- data: responseData.data,
118
- columns: responseData.columns,
119
- row_count: responseData.row_count || responseData.data.length,
120
- execution_time_ms: responseData.execution_time_ms || 0,
121
- graph_id: graphId,
122
- timestamp: responseData.timestamp || new Date().toISOString(),
123
- }
124
- }
125
-
126
- // Check if this is a queued response
127
- if (responseData?.status === 'queued' && responseData?.operation_id) {
128
- const queuedResponse = responseData as QueuedQueryResponse
129
-
130
- // Notify about queue status
131
- options.onQueueUpdate?.(queuedResponse.queue_position, queuedResponse.estimated_wait_seconds)
132
-
133
- // If user doesn't want to wait, throw with queue info
134
- if (options.maxWait === 0) {
135
- throw new QueuedQueryError(queuedResponse)
136
- }
137
-
138
- // Use SSE to monitor the operation
139
- return this.waitForQueryCompletion(queuedResponse.operation_id, options)
140
- }
141
-
142
- // Unexpected response format
143
- throw new Error('Unexpected response format from query endpoint')
144
- }
145
-
146
- private async parseNDJSONResponse(response: Response, graphId: string): Promise<QueryResult> {
147
- const allData: any[] = []
148
- let columns: string[] | null = null
149
- let totalRows = 0
150
- let executionTimeMs = 0
151
- const parseErrors: { line: number; error: string }[] = []
152
- let lineNumber = 0
153
-
154
- // Use streaming reader to avoid "body already read" error
155
- const reader = response.body?.getReader()
156
- if (!reader) {
157
- throw new Error('Response body is not readable')
158
- }
159
-
160
- const decoder = new TextDecoder()
161
- let buffer = ''
162
-
163
- try {
164
- while (true) {
165
- const { done, value } = await reader.read()
166
- if (done) break
167
-
168
- buffer += decoder.decode(value, { stream: true })
169
- const lines = buffer.split('\n')
170
- buffer = lines.pop() || ''
171
-
172
- for (const line of lines) {
173
- lineNumber++
174
- if (!line.trim()) continue
175
-
176
- try {
177
- const chunk = JSON.parse(line)
178
-
179
- // Extract columns from first chunk
180
- if (columns === null && chunk.columns) {
181
- columns = chunk.columns
182
- }
183
-
184
- // Aggregate data rows (NDJSON uses "rows", regular JSON uses "data")
185
- if (chunk.rows) {
186
- allData.push(...chunk.rows)
187
- totalRows += chunk.rows.length
188
- } else if (chunk.data) {
189
- allData.push(...chunk.data)
190
- totalRows += chunk.data.length
191
- }
192
-
193
- // Track execution time (use max from all chunks)
194
- if (chunk.execution_time_ms) {
195
- executionTimeMs = Math.max(executionTimeMs, chunk.execution_time_ms)
196
- }
197
- } catch (error) {
198
- parseErrors.push({
199
- line: lineNumber,
200
- error: error instanceof Error ? error.message : String(error),
201
- })
202
- }
203
- }
204
- }
205
-
206
- // Parse any remaining buffer
207
- if (buffer.trim()) {
208
- lineNumber++
209
- try {
210
- const chunk = JSON.parse(buffer)
211
- if (columns === null && chunk.columns) {
212
- columns = chunk.columns
213
- }
214
- if (chunk.rows) {
215
- allData.push(...chunk.rows)
216
- totalRows += chunk.rows.length
217
- } else if (chunk.data) {
218
- allData.push(...chunk.data)
219
- totalRows += chunk.data.length
220
- }
221
- if (chunk.execution_time_ms) {
222
- executionTimeMs = Math.max(executionTimeMs, chunk.execution_time_ms)
223
- }
224
- } catch (error) {
225
- parseErrors.push({
226
- line: lineNumber,
227
- error: error instanceof Error ? error.message : String(error),
228
- })
229
- }
230
- }
231
- } catch (error) {
232
- throw new Error(`NDJSON stream reading error: ${error}`)
233
- }
234
-
235
- // Report parse errors if any occurred
236
- if (parseErrors.length > 0) {
237
- const errorDetails = parseErrors.slice(0, 3).map((e) => `line ${e.line}: ${e.error}`)
238
- const moreErrors = parseErrors.length > 3 ? ` (and ${parseErrors.length - 3} more)` : ''
239
- throw new Error(
240
- `NDJSON parsing failed for ${parseErrors.length} line(s): ${errorDetails.join('; ')}${moreErrors}`
241
- )
242
- }
243
-
244
- // Return aggregated result
245
- return {
246
- data: allData,
247
- columns: columns || [],
248
- row_count: totalRows,
249
- execution_time_ms: executionTimeMs,
250
- graph_id: graphId,
251
- timestamp: new Date().toISOString(),
252
- }
253
- }
254
-
255
- private async *streamQueryResults(
256
- operationId: string,
257
- options: QueryOptions
258
- ): AsyncIterableIterator<any> {
259
- const buffer: any[] = []
260
- let completed = false
261
- let error: Error | null = null
262
-
263
- // Set up SSE connection
264
- this.sseClient = new SSEClient(this.config)
265
- await this.sseClient.connect(operationId)
266
-
267
- // Listen for data chunks
268
- this.sseClient.on(EventType.DATA_CHUNK, (data) => {
269
- if (Array.isArray(data.rows)) {
270
- buffer.push(...data.rows)
271
- } else if (data.data) {
272
- buffer.push(...data.data)
273
- }
274
- })
275
-
276
- // Listen for queue updates
277
- this.sseClient.on(EventType.QUEUE_UPDATE, (data) => {
278
- options.onQueueUpdate?.(data.position, data.estimated_wait_seconds)
279
- })
280
-
281
- // Listen for progress
282
- this.sseClient.on(EventType.OPERATION_PROGRESS, (data) => {
283
- options.onProgress?.(data.message)
284
- })
285
-
286
- // Listen for completion
287
- this.sseClient.on(EventType.OPERATION_COMPLETED, (data) => {
288
- if (data.result?.data) {
289
- buffer.push(...data.result.data)
290
- }
291
- completed = true
292
- })
293
-
294
- // Listen for errors
295
- this.sseClient.on(EventType.OPERATION_ERROR, (err) => {
296
- error = new Error(err.message || err.error)
297
- completed = true
298
- })
299
-
300
- // Yield buffered results
301
- while (!completed || buffer.length > 0) {
302
- if (error) throw error
303
-
304
- if (buffer.length > 0) {
305
- const chunk = buffer.splice(0, options.chunkSize || 100)
306
- for (const item of chunk) {
307
- yield item
308
- }
309
- } else if (!completed) {
310
- // Wait for more data
311
- await new Promise((resolve) => setTimeout(resolve, 100))
312
- }
313
- }
314
-
315
- this.sseClient.close()
316
- this.sseClient = undefined
317
- }
318
-
319
- private async waitForQueryCompletion(
320
- operationId: string,
321
- options: QueryOptions
322
- ): Promise<QueryResult> {
323
- return new Promise((resolve, reject) => {
324
- const sseClient = new SSEClient(this.config)
325
-
326
- sseClient
327
- .connect(operationId)
328
- .then(() => {
329
- let result: QueryResult | null = null
330
-
331
- // Listen for queue updates
332
- sseClient.on(EventType.QUEUE_UPDATE, (data) => {
333
- options.onQueueUpdate?.(data.position, data.estimated_wait_seconds)
334
- })
335
-
336
- // Listen for progress
337
- sseClient.on(EventType.OPERATION_PROGRESS, (data) => {
338
- options.onProgress?.(data.message)
339
- })
340
-
341
- sseClient.on(EventType.OPERATION_COMPLETED, (data) => {
342
- const queryResult = data.result || data
343
- result = {
344
- data: queryResult.data || [],
345
- columns: queryResult.columns || [],
346
- row_count: queryResult.row_count || 0,
347
- execution_time_ms: queryResult.execution_time_ms || 0,
348
- graph_id: queryResult.graph_id,
349
- timestamp: queryResult.timestamp || new Date().toISOString(),
350
- }
351
- sseClient.close()
352
- resolve(result)
353
- })
354
-
355
- sseClient.on(EventType.OPERATION_ERROR, (error) => {
356
- sseClient.close()
357
- reject(new Error(error.message || error.error))
358
- })
359
-
360
- sseClient.on(EventType.OPERATION_CANCELLED, () => {
361
- sseClient.close()
362
- reject(new Error('Query cancelled'))
363
- })
364
- })
365
- .catch(reject)
366
- })
367
- }
368
-
369
- // Convenience method for simple queries
370
- async query(
371
- graphId: string,
372
- cypher: string,
373
- parameters?: Record<string, any>
374
- ): Promise<QueryResult> {
375
- return this.executeQuery(
376
- graphId,
377
- { query: cypher, parameters },
378
- { mode: 'auto' }
379
- ) as Promise<QueryResult>
380
- }
381
-
382
- // Streaming query for large results
383
- async *streamQuery(
384
- graphId: string,
385
- cypher: string,
386
- parameters?: Record<string, any>,
387
- chunkSize: number = 1000
388
- ): AsyncIterableIterator<any> {
389
- const result = await this.executeQuery(
390
- graphId,
391
- { query: cypher, parameters },
392
- { mode: 'stream', chunkSize }
393
- )
394
-
395
- if (Symbol.asyncIterator in (result as any)) {
396
- yield* result as AsyncIterableIterator<any>
397
- } else {
398
- // If not streaming, yield all results at once
399
- yield* (result as QueryResult).data
400
- }
401
- }
402
-
403
- // Cancel any active SSE connections
404
- close(): void {
405
- if (this.sseClient) {
406
- this.sseClient.close()
407
- this.sseClient = undefined
408
- }
409
- }
410
- }
411
-
412
- /**
413
- * Error thrown when query is queued and maxWait is 0
414
- */
415
- export class QueuedQueryError extends Error {
416
- constructor(public queueInfo: QueuedQueryResponse) {
417
- super('Query was queued')
418
- this.name = 'QueuedQueryError'
419
- }
420
- }