@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,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;
|