@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.
- package/extensions/InvestorClient.d.ts +91 -0
- package/extensions/InvestorClient.js +223 -0
- package/extensions/InvestorClient.ts +501 -0
- package/extensions/LedgerClient.d.ts +213 -165
- package/extensions/LedgerClient.js +315 -393
- package/extensions/LedgerClient.ts +887 -564
- package/extensions/ReportClient.d.ts +77 -115
- package/extensions/ReportClient.js +124 -211
- package/extensions/ReportClient.ts +298 -358
- package/extensions/config.js +1 -1
- package/extensions/config.ts +1 -1
- package/extensions/graphql/client.d.ts +46 -0
- package/extensions/graphql/client.js +75 -0
- package/extensions/graphql/client.ts +82 -0
- package/extensions/graphql/generated/graphql.d.ts +1786 -0
- package/extensions/graphql/generated/graphql.js +2671 -0
- package/extensions/graphql/generated/graphql.ts +4491 -0
- package/extensions/graphql/queries/investor/holdings.d.ts +8 -0
- package/extensions/graphql/queries/investor/holdings.js +36 -0
- package/extensions/graphql/queries/investor/holdings.ts +34 -0
- package/extensions/graphql/queries/investor/portfolio.d.ts +4 -0
- package/extensions/graphql/queries/investor/portfolio.js +21 -0
- package/extensions/graphql/queries/investor/portfolio.ts +19 -0
- package/extensions/graphql/queries/investor/portfolios.d.ts +4 -0
- package/extensions/graphql/queries/investor/portfolios.js +29 -0
- package/extensions/graphql/queries/investor/portfolios.ts +27 -0
- package/extensions/graphql/queries/investor/position.d.ts +4 -0
- package/extensions/graphql/queries/investor/position.js +33 -0
- package/extensions/graphql/queries/investor/position.ts +31 -0
- package/extensions/graphql/queries/investor/positions.d.ts +8 -0
- package/extensions/graphql/queries/investor/positions.js +57 -0
- package/extensions/graphql/queries/investor/positions.ts +55 -0
- package/extensions/graphql/queries/investor/securities.d.ts +8 -0
- package/extensions/graphql/queries/investor/securities.js +50 -0
- package/extensions/graphql/queries/investor/securities.ts +48 -0
- package/extensions/graphql/queries/investor/security.d.ts +4 -0
- package/extensions/graphql/queries/investor/security.js +26 -0
- package/extensions/graphql/queries/investor/security.ts +24 -0
- package/extensions/graphql/queries/ledger/accountRollups.d.ts +7 -0
- package/extensions/graphql/queries/ledger/accountRollups.js +36 -0
- package/extensions/graphql/queries/ledger/accountRollups.ts +34 -0
- package/extensions/graphql/queries/ledger/accountTree.d.ts +11 -0
- package/extensions/graphql/queries/ledger/accountTree.js +61 -0
- package/extensions/graphql/queries/ledger/accountTree.ts +59 -0
- package/extensions/graphql/queries/ledger/accounts.d.ts +8 -0
- package/extensions/graphql/queries/ledger/accounts.js +45 -0
- package/extensions/graphql/queries/ledger/accounts.ts +43 -0
- package/extensions/graphql/queries/ledger/closingBookStructures.d.ts +6 -0
- package/extensions/graphql/queries/ledger/closingBookStructures.js +27 -0
- package/extensions/graphql/queries/ledger/closingBookStructures.ts +25 -0
- package/extensions/graphql/queries/ledger/elements.d.ts +6 -0
- package/extensions/graphql/queries/ledger/elements.js +56 -0
- package/extensions/graphql/queries/ledger/elements.ts +54 -0
- package/extensions/graphql/queries/ledger/entities.d.ts +7 -0
- package/extensions/graphql/queries/ledger/entities.js +31 -0
- package/extensions/graphql/queries/ledger/entities.ts +29 -0
- package/extensions/graphql/queries/ledger/entity.d.ts +14 -0
- package/extensions/graphql/queries/ledger/entity.js +55 -0
- package/extensions/graphql/queries/ledger/entity.ts +54 -0
- package/extensions/graphql/queries/ledger/fiscalCalendar.d.ts +8 -0
- package/extensions/graphql/queries/ledger/fiscalCalendar.js +35 -0
- package/extensions/graphql/queries/ledger/fiscalCalendar.ts +33 -0
- package/extensions/graphql/queries/ledger/mappedTrialBalance.d.ts +9 -0
- package/extensions/graphql/queries/ledger/mappedTrialBalance.js +29 -0
- package/extensions/graphql/queries/ledger/mappedTrialBalance.ts +27 -0
- package/extensions/graphql/queries/ledger/mapping.d.ts +5 -0
- package/extensions/graphql/queries/ledger/mapping.js +35 -0
- package/extensions/graphql/queries/ledger/mapping.ts +33 -0
- package/extensions/graphql/queries/ledger/mappingCoverage.d.ts +5 -0
- package/extensions/graphql/queries/ledger/mappingCoverage.js +22 -0
- package/extensions/graphql/queries/ledger/mappingCoverage.ts +20 -0
- package/extensions/graphql/queries/ledger/mappings.d.ts +6 -0
- package/extensions/graphql/queries/ledger/mappings.js +23 -0
- package/extensions/graphql/queries/ledger/mappings.ts +21 -0
- package/extensions/graphql/queries/ledger/periodCloseStatus.d.ts +6 -0
- package/extensions/graphql/queries/ledger/periodCloseStatus.js +29 -0
- package/extensions/graphql/queries/ledger/periodCloseStatus.ts +27 -0
- package/extensions/graphql/queries/ledger/periodDrafts.d.ts +8 -0
- package/extensions/graphql/queries/ledger/periodDrafts.js +45 -0
- package/extensions/graphql/queries/ledger/periodDrafts.ts +43 -0
- package/extensions/graphql/queries/ledger/publishList.d.ts +5 -0
- package/extensions/graphql/queries/ledger/publishList.js +29 -0
- package/extensions/graphql/queries/ledger/publishList.ts +27 -0
- package/extensions/graphql/queries/ledger/publishLists.d.ts +5 -0
- package/extensions/graphql/queries/ledger/publishLists.js +29 -0
- package/extensions/graphql/queries/ledger/publishLists.ts +27 -0
- package/extensions/graphql/queries/ledger/report.d.ts +5 -0
- package/extensions/graphql/queries/ledger/report.js +40 -0
- package/extensions/graphql/queries/ledger/report.ts +38 -0
- package/extensions/graphql/queries/ledger/reportingTaxonomy.d.ts +6 -0
- package/extensions/graphql/queries/ledger/reportingTaxonomy.js +27 -0
- package/extensions/graphql/queries/ledger/reportingTaxonomy.ts +25 -0
- package/extensions/graphql/queries/ledger/reports.d.ts +8 -0
- package/extensions/graphql/queries/ledger/reports.js +45 -0
- package/extensions/graphql/queries/ledger/reports.ts +43 -0
- package/extensions/graphql/queries/ledger/scheduleFacts.d.ts +7 -0
- package/extensions/graphql/queries/ledger/scheduleFacts.js +24 -0
- package/extensions/graphql/queries/ledger/scheduleFacts.ts +22 -0
- package/extensions/graphql/queries/ledger/schedules.d.ts +6 -0
- package/extensions/graphql/queries/ledger/schedules.js +24 -0
- package/extensions/graphql/queries/ledger/schedules.ts +22 -0
- package/extensions/graphql/queries/ledger/statement.d.ts +9 -0
- package/extensions/graphql/queries/ledger/statement.js +43 -0
- package/extensions/graphql/queries/ledger/statement.ts +41 -0
- package/extensions/graphql/queries/ledger/structures.d.ts +5 -0
- package/extensions/graphql/queries/ledger/structures.js +22 -0
- package/extensions/graphql/queries/ledger/structures.ts +20 -0
- package/extensions/graphql/queries/ledger/summary.d.ts +7 -0
- package/extensions/graphql/queries/ledger/summary.js +25 -0
- package/extensions/graphql/queries/ledger/summary.ts +23 -0
- package/extensions/graphql/queries/ledger/taxonomies.d.ts +5 -0
- package/extensions/graphql/queries/ledger/taxonomies.js +28 -0
- package/extensions/graphql/queries/ledger/taxonomies.ts +26 -0
- package/extensions/graphql/queries/ledger/transaction.d.ts +6 -0
- package/extensions/graphql/queries/ledger/transaction.js +49 -0
- package/extensions/graphql/queries/ledger/transaction.ts +47 -0
- package/extensions/graphql/queries/ledger/transactions.d.ts +7 -0
- package/extensions/graphql/queries/ledger/transactions.js +49 -0
- package/extensions/graphql/queries/ledger/transactions.ts +47 -0
- package/extensions/graphql/queries/ledger/trialBalance.d.ts +7 -0
- package/extensions/graphql/queries/ledger/trialBalance.js +28 -0
- package/extensions/graphql/queries/ledger/trialBalance.ts +26 -0
- package/extensions/graphql/queries/ledger/unmappedElements.d.ts +8 -0
- package/extensions/graphql/queries/ledger/unmappedElements.js +29 -0
- package/extensions/graphql/queries/ledger/unmappedElements.ts +27 -0
- package/extensions/hooks.d.ts +1 -1
- package/extensions/index.d.ts +5 -1
- package/extensions/index.js +13 -1
- package/extensions/index.ts +14 -0
- package/index.ts +2 -2
- package/package.json +14 -5
- package/sdk/index.d.ts +2 -2
- package/sdk/index.js +38 -65
- package/sdk/index.ts +2 -2
- package/sdk/sdk.gen.d.ts +101 -220
- package/sdk/sdk.gen.js +251 -445
- package/sdk/sdk.gen.ts +216 -409
- package/sdk/types.gen.d.ts +4586 -7045
- package/sdk/types.gen.ts +4702 -7334
- package/sdk.gen.d.ts +101 -220
- package/sdk.gen.js +251 -445
- package/sdk.gen.ts +216 -409
- package/types.gen.d.ts +4586 -7045
- package/types.gen.ts +4702 -7334
- package/extensions/AgentClient.test.ts +0 -403
- package/extensions/LedgerClient.test.ts +0 -1138
- package/extensions/OperationClient.test.ts +0 -365
- package/extensions/QueryClient.test.ts +0 -432
- package/extensions/ReportClient.test.ts +0 -828
- package/extensions/SSEClient.test.ts +0 -375
- package/extensions/config.test.ts +0 -199
- package/extensions/hooks.test.ts +0 -373
- package/extensions/index.test.ts +0 -420
- package/sdk-extensions/AgentClient.d.ts +0 -82
- package/sdk-extensions/AgentClient.js +0 -218
- package/sdk-extensions/AgentClient.test.ts +0 -403
- package/sdk-extensions/AgentClient.ts +0 -321
- package/sdk-extensions/LedgerClient.d.ts +0 -242
- package/sdk-extensions/LedgerClient.js +0 -496
- package/sdk-extensions/LedgerClient.test.ts +0 -1138
- package/sdk-extensions/LedgerClient.ts +0 -800
- package/sdk-extensions/OperationClient.d.ts +0 -65
- package/sdk-extensions/OperationClient.js +0 -251
- package/sdk-extensions/OperationClient.test.ts +0 -365
- package/sdk-extensions/OperationClient.ts +0 -324
- package/sdk-extensions/QueryClient.d.ts +0 -52
- package/sdk-extensions/QueryClient.js +0 -313
- package/sdk-extensions/QueryClient.test.ts +0 -432
- package/sdk-extensions/QueryClient.ts +0 -420
- package/sdk-extensions/README.md +0 -901
- package/sdk-extensions/ReportClient.d.ts +0 -151
- package/sdk-extensions/ReportClient.js +0 -278
- package/sdk-extensions/ReportClient.test.ts +0 -828
- package/sdk-extensions/ReportClient.ts +0 -486
- package/sdk-extensions/SSEClient.d.ts +0 -62
- package/sdk-extensions/SSEClient.js +0 -154
- package/sdk-extensions/SSEClient.test.ts +0 -375
- package/sdk-extensions/SSEClient.ts +0 -210
- package/sdk-extensions/config.d.ts +0 -57
- package/sdk-extensions/config.js +0 -152
- package/sdk-extensions/config.test.ts +0 -199
- package/sdk-extensions/config.ts +0 -175
- package/sdk-extensions/hooks.d.ts +0 -110
- package/sdk-extensions/hooks.js +0 -384
- package/sdk-extensions/hooks.test.ts +0 -373
- package/sdk-extensions/hooks.ts +0 -459
- package/sdk-extensions/index.d.ts +0 -63
- package/sdk-extensions/index.js +0 -164
- package/sdk-extensions/index.test.ts +0 -420
- 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
|
-
}
|