@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,375 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
2
|
-
import { EventType, SSEClient } from './SSEClient'
|
|
3
|
-
|
|
4
|
-
// Mock EventSource for testing
|
|
5
|
-
class MockEventSource {
|
|
6
|
-
url: string
|
|
7
|
-
withCredentials: boolean
|
|
8
|
-
readyState: number = 0 // 0 = CONNECTING, 1 = OPEN, 2 = CLOSED
|
|
9
|
-
onopen: ((event: any) => void) | null = null
|
|
10
|
-
onerror: ((event: any) => void) | null = null
|
|
11
|
-
onmessage: ((event: any) => void) | null = null
|
|
12
|
-
private eventListeners: Map<string, Set<(event: any) => void>> = new Map()
|
|
13
|
-
|
|
14
|
-
static CONNECTING = 0
|
|
15
|
-
static OPEN = 1
|
|
16
|
-
static CLOSED = 2
|
|
17
|
-
|
|
18
|
-
constructor(url: string, options?: { withCredentials?: boolean }) {
|
|
19
|
-
this.url = url
|
|
20
|
-
this.withCredentials = options?.withCredentials ?? false
|
|
21
|
-
|
|
22
|
-
// Simulate async connection
|
|
23
|
-
setTimeout(() => {
|
|
24
|
-
this.readyState = MockEventSource.OPEN
|
|
25
|
-
if (this.onopen) {
|
|
26
|
-
this.onopen({ type: 'open' })
|
|
27
|
-
}
|
|
28
|
-
}, 0)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
addEventListener(event: string, listener: (event: any) => void) {
|
|
32
|
-
if (!this.eventListeners.has(event)) {
|
|
33
|
-
this.eventListeners.set(event, new Set())
|
|
34
|
-
}
|
|
35
|
-
this.eventListeners.get(event)!.add(listener)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
removeEventListener(event: string, listener: (event: any) => void) {
|
|
39
|
-
const listeners = this.eventListeners.get(event)
|
|
40
|
-
if (listeners) {
|
|
41
|
-
listeners.delete(listener)
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
dispatchEvent(event: any) {
|
|
46
|
-
const listeners = this.eventListeners.get(event.type)
|
|
47
|
-
if (listeners) {
|
|
48
|
-
listeners.forEach((listener) => listener(event))
|
|
49
|
-
}
|
|
50
|
-
return true
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
close() {
|
|
54
|
-
this.readyState = MockEventSource.CLOSED
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Test helper to simulate receiving a message
|
|
58
|
-
simulateMessage(eventType: string, data: any, lastEventId?: string) {
|
|
59
|
-
const event = {
|
|
60
|
-
type: eventType,
|
|
61
|
-
data: JSON.stringify(data),
|
|
62
|
-
lastEventId: lastEventId || '',
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
if (eventType === 'message' && this.onmessage) {
|
|
66
|
-
this.onmessage(event)
|
|
67
|
-
} else {
|
|
68
|
-
const listeners = this.eventListeners.get(eventType)
|
|
69
|
-
if (listeners) {
|
|
70
|
-
listeners.forEach((listener) => listener(event))
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Test helper to simulate error
|
|
76
|
-
simulateError() {
|
|
77
|
-
if (this.onerror) {
|
|
78
|
-
this.onerror({ type: 'error' })
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
describe('SSEClient', () => {
|
|
84
|
-
let mockEventSource: MockEventSource
|
|
85
|
-
|
|
86
|
-
beforeEach(() => {
|
|
87
|
-
// Mock global EventSource
|
|
88
|
-
global.EventSource = MockEventSource as any
|
|
89
|
-
vi.clearAllMocks()
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
describe('connect', () => {
|
|
93
|
-
it('should connect to SSE endpoint successfully', async () => {
|
|
94
|
-
const client = new SSEClient({
|
|
95
|
-
baseUrl: 'http://localhost:8000',
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
await expect(client.connect('op_123')).resolves.toBeUndefined()
|
|
99
|
-
expect(client.isConnected()).toBe(true)
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
it('should include token in URL when provided', async () => {
|
|
103
|
-
const client = new SSEClient({
|
|
104
|
-
baseUrl: 'http://localhost:8000',
|
|
105
|
-
token: 'my-jwt-token',
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
await client.connect('op_123')
|
|
109
|
-
|
|
110
|
-
// We can't directly access the EventSource URL in this mock,
|
|
111
|
-
// but the client should have connected successfully
|
|
112
|
-
expect(client.isConnected()).toBe(true)
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
it('should include from_sequence parameter', async () => {
|
|
116
|
-
const client = new SSEClient({
|
|
117
|
-
baseUrl: 'http://localhost:8000',
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
await client.connect('op_123', 42)
|
|
121
|
-
expect(client.isConnected()).toBe(true)
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
it('should set withCredentials when credentials is include', async () => {
|
|
125
|
-
const client = new SSEClient({
|
|
126
|
-
baseUrl: 'http://localhost:8000',
|
|
127
|
-
credentials: 'include',
|
|
128
|
-
})
|
|
129
|
-
|
|
130
|
-
await client.connect('op_123')
|
|
131
|
-
expect(client.isConnected()).toBe(true)
|
|
132
|
-
})
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
describe('event handling', () => {
|
|
136
|
-
it('should emit connected event on connection', async () => {
|
|
137
|
-
const client = new SSEClient({
|
|
138
|
-
baseUrl: 'http://localhost:8000',
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
const connectedEvents: any[] = []
|
|
142
|
-
client.on('connected', (data) => connectedEvents.push(data))
|
|
143
|
-
|
|
144
|
-
await client.connect('op_123')
|
|
145
|
-
|
|
146
|
-
expect(connectedEvents).toHaveLength(1)
|
|
147
|
-
})
|
|
148
|
-
|
|
149
|
-
it('should handle typed events', async () => {
|
|
150
|
-
const client = new SSEClient({
|
|
151
|
-
baseUrl: 'http://localhost:8000',
|
|
152
|
-
})
|
|
153
|
-
|
|
154
|
-
const progressEvents: any[] = []
|
|
155
|
-
client.on(EventType.OPERATION_PROGRESS, (data) => progressEvents.push(data))
|
|
156
|
-
|
|
157
|
-
await client.connect('op_123')
|
|
158
|
-
|
|
159
|
-
// Simulate receiving a progress event
|
|
160
|
-
const eventSource = (client as any).eventSource as MockEventSource
|
|
161
|
-
eventSource.simulateMessage(EventType.OPERATION_PROGRESS, {
|
|
162
|
-
message: 'Processing...',
|
|
163
|
-
progress_percent: 50,
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
expect(progressEvents).toHaveLength(1)
|
|
167
|
-
expect(progressEvents[0].message).toBe('Processing...')
|
|
168
|
-
expect(progressEvents[0].progress_percent).toBe(50)
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
it('should auto-close on completion events', async () => {
|
|
172
|
-
const client = new SSEClient({
|
|
173
|
-
baseUrl: 'http://localhost:8000',
|
|
174
|
-
})
|
|
175
|
-
|
|
176
|
-
await client.connect('op_123')
|
|
177
|
-
|
|
178
|
-
const eventSource = (client as any).eventSource as MockEventSource
|
|
179
|
-
eventSource.simulateMessage(EventType.OPERATION_COMPLETED, {
|
|
180
|
-
result: { success: true },
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
// Client should close automatically
|
|
184
|
-
expect(client.isConnected()).toBe(false)
|
|
185
|
-
})
|
|
186
|
-
|
|
187
|
-
it('should auto-close on error events', async () => {
|
|
188
|
-
const client = new SSEClient({
|
|
189
|
-
baseUrl: 'http://localhost:8000',
|
|
190
|
-
})
|
|
191
|
-
|
|
192
|
-
await client.connect('op_123')
|
|
193
|
-
|
|
194
|
-
const eventSource = (client as any).eventSource as MockEventSource
|
|
195
|
-
eventSource.simulateMessage(EventType.OPERATION_ERROR, {
|
|
196
|
-
error: 'Something failed',
|
|
197
|
-
})
|
|
198
|
-
|
|
199
|
-
expect(client.isConnected()).toBe(false)
|
|
200
|
-
})
|
|
201
|
-
|
|
202
|
-
it('should auto-close on cancelled events', async () => {
|
|
203
|
-
const client = new SSEClient({
|
|
204
|
-
baseUrl: 'http://localhost:8000',
|
|
205
|
-
})
|
|
206
|
-
|
|
207
|
-
await client.connect('op_123')
|
|
208
|
-
|
|
209
|
-
const eventSource = (client as any).eventSource as MockEventSource
|
|
210
|
-
eventSource.simulateMessage(EventType.OPERATION_CANCELLED, {
|
|
211
|
-
message: 'Cancelled by user',
|
|
212
|
-
})
|
|
213
|
-
|
|
214
|
-
expect(client.isConnected()).toBe(false)
|
|
215
|
-
})
|
|
216
|
-
|
|
217
|
-
it('should handle heartbeat events', async () => {
|
|
218
|
-
const client = new SSEClient({
|
|
219
|
-
baseUrl: 'http://localhost:8000',
|
|
220
|
-
})
|
|
221
|
-
|
|
222
|
-
const heartbeats: any[] = []
|
|
223
|
-
client.on(EventType.HEARTBEAT, (data) => heartbeats.push(data))
|
|
224
|
-
|
|
225
|
-
await client.connect('op_123')
|
|
226
|
-
|
|
227
|
-
const eventSource = (client as any).eventSource as MockEventSource
|
|
228
|
-
eventSource.simulateMessage(EventType.HEARTBEAT, { timestamp: Date.now() })
|
|
229
|
-
|
|
230
|
-
expect(heartbeats).toHaveLength(1)
|
|
231
|
-
})
|
|
232
|
-
|
|
233
|
-
it('should handle data chunk events', async () => {
|
|
234
|
-
const client = new SSEClient({
|
|
235
|
-
baseUrl: 'http://localhost:8000',
|
|
236
|
-
})
|
|
237
|
-
|
|
238
|
-
const chunks: any[] = []
|
|
239
|
-
client.on(EventType.DATA_CHUNK, (data) => chunks.push(data))
|
|
240
|
-
|
|
241
|
-
await client.connect('op_123')
|
|
242
|
-
|
|
243
|
-
const eventSource = (client as any).eventSource as MockEventSource
|
|
244
|
-
eventSource.simulateMessage(EventType.DATA_CHUNK, {
|
|
245
|
-
rows: [
|
|
246
|
-
{ id: 1, name: 'Alice' },
|
|
247
|
-
{ id: 2, name: 'Bob' },
|
|
248
|
-
],
|
|
249
|
-
})
|
|
250
|
-
|
|
251
|
-
expect(chunks).toHaveLength(1)
|
|
252
|
-
expect(chunks[0].rows).toHaveLength(2)
|
|
253
|
-
})
|
|
254
|
-
})
|
|
255
|
-
|
|
256
|
-
describe('listener management', () => {
|
|
257
|
-
it('should add and remove listeners', async () => {
|
|
258
|
-
const client = new SSEClient({
|
|
259
|
-
baseUrl: 'http://localhost:8000',
|
|
260
|
-
})
|
|
261
|
-
|
|
262
|
-
const events: any[] = []
|
|
263
|
-
const listener = (data: any) => events.push(data)
|
|
264
|
-
|
|
265
|
-
client.on('test-event', listener)
|
|
266
|
-
await client.connect('op_123')
|
|
267
|
-
|
|
268
|
-
// Manually emit an event
|
|
269
|
-
;(client as any).emit('test-event', { value: 1 })
|
|
270
|
-
expect(events).toHaveLength(1)
|
|
271
|
-
|
|
272
|
-
// Remove listener
|
|
273
|
-
client.off('test-event', listener)
|
|
274
|
-
;(client as any).emit('test-event', { value: 2 })
|
|
275
|
-
expect(events).toHaveLength(1) // Should not have increased
|
|
276
|
-
})
|
|
277
|
-
|
|
278
|
-
it('should support multiple listeners for same event', async () => {
|
|
279
|
-
const client = new SSEClient({
|
|
280
|
-
baseUrl: 'http://localhost:8000',
|
|
281
|
-
})
|
|
282
|
-
|
|
283
|
-
const events1: any[] = []
|
|
284
|
-
const events2: any[] = []
|
|
285
|
-
|
|
286
|
-
client.on('test-event', (data) => events1.push(data))
|
|
287
|
-
client.on('test-event', (data) => events2.push(data))
|
|
288
|
-
|
|
289
|
-
await client.connect('op_123')
|
|
290
|
-
;(client as any).emit('test-event', { value: 1 })
|
|
291
|
-
|
|
292
|
-
expect(events1).toHaveLength(1)
|
|
293
|
-
expect(events2).toHaveLength(1)
|
|
294
|
-
})
|
|
295
|
-
})
|
|
296
|
-
|
|
297
|
-
describe('close', () => {
|
|
298
|
-
it('should close the connection', async () => {
|
|
299
|
-
const client = new SSEClient({
|
|
300
|
-
baseUrl: 'http://localhost:8000',
|
|
301
|
-
})
|
|
302
|
-
|
|
303
|
-
await client.connect('op_123')
|
|
304
|
-
expect(client.isConnected()).toBe(true)
|
|
305
|
-
|
|
306
|
-
client.close()
|
|
307
|
-
expect(client.isConnected()).toBe(false)
|
|
308
|
-
})
|
|
309
|
-
|
|
310
|
-
it('should emit closed event', async () => {
|
|
311
|
-
const client = new SSEClient({
|
|
312
|
-
baseUrl: 'http://localhost:8000',
|
|
313
|
-
})
|
|
314
|
-
|
|
315
|
-
const closedEvents: any[] = []
|
|
316
|
-
client.on('closed', (data) => closedEvents.push(data))
|
|
317
|
-
|
|
318
|
-
await client.connect('op_123')
|
|
319
|
-
client.close()
|
|
320
|
-
|
|
321
|
-
expect(closedEvents).toHaveLength(1)
|
|
322
|
-
})
|
|
323
|
-
|
|
324
|
-
it('should clear all listeners on close', async () => {
|
|
325
|
-
const client = new SSEClient({
|
|
326
|
-
baseUrl: 'http://localhost:8000',
|
|
327
|
-
})
|
|
328
|
-
|
|
329
|
-
const events: any[] = []
|
|
330
|
-
client.on('test-event', (data) => events.push(data))
|
|
331
|
-
|
|
332
|
-
await client.connect('op_123')
|
|
333
|
-
client.close()
|
|
334
|
-
|
|
335
|
-
// Try to emit after close - should not receive events
|
|
336
|
-
;(client as any).emit('test-event', { value: 1 })
|
|
337
|
-
expect(events).toHaveLength(0)
|
|
338
|
-
})
|
|
339
|
-
|
|
340
|
-
it('should be safe to call close multiple times', async () => {
|
|
341
|
-
const client = new SSEClient({
|
|
342
|
-
baseUrl: 'http://localhost:8000',
|
|
343
|
-
})
|
|
344
|
-
|
|
345
|
-
await client.connect('op_123')
|
|
346
|
-
|
|
347
|
-
client.close()
|
|
348
|
-
expect(() => client.close()).not.toThrow()
|
|
349
|
-
})
|
|
350
|
-
})
|
|
351
|
-
|
|
352
|
-
describe('configuration', () => {
|
|
353
|
-
it('should accept all config options', () => {
|
|
354
|
-
const client = new SSEClient({
|
|
355
|
-
baseUrl: 'http://localhost:8000',
|
|
356
|
-
credentials: 'include',
|
|
357
|
-
headers: { 'X-Custom': 'value' },
|
|
358
|
-
token: 'jwt-token',
|
|
359
|
-
maxRetries: 5,
|
|
360
|
-
retryDelay: 2000,
|
|
361
|
-
heartbeatInterval: 60000,
|
|
362
|
-
})
|
|
363
|
-
|
|
364
|
-
expect(client).toBeInstanceOf(SSEClient)
|
|
365
|
-
})
|
|
366
|
-
|
|
367
|
-
it('should use default config values', () => {
|
|
368
|
-
const client = new SSEClient({
|
|
369
|
-
baseUrl: 'http://localhost:8000',
|
|
370
|
-
})
|
|
371
|
-
|
|
372
|
-
expect(client).toBeInstanceOf(SSEClient)
|
|
373
|
-
})
|
|
374
|
-
})
|
|
375
|
-
})
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, it } from 'vitest'
|
|
2
|
-
import {
|
|
3
|
-
configureWithJWT,
|
|
4
|
-
extractJWTFromHeader,
|
|
5
|
-
getEnvironmentConfig,
|
|
6
|
-
getSDKExtensionsConfig,
|
|
7
|
-
isValidJWT,
|
|
8
|
-
resetSDKExtensionsConfig,
|
|
9
|
-
setSDKExtensionsConfig,
|
|
10
|
-
} from './config'
|
|
11
|
-
|
|
12
|
-
describe('config', () => {
|
|
13
|
-
beforeEach(() => {
|
|
14
|
-
resetSDKExtensionsConfig()
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
describe('setSDKExtensionsConfig / getSDKExtensionsConfig', () => {
|
|
18
|
-
it('should set and get configuration', () => {
|
|
19
|
-
setSDKExtensionsConfig({
|
|
20
|
-
baseUrl: 'https://api.example.com',
|
|
21
|
-
token: 'test-token',
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
const config = getSDKExtensionsConfig()
|
|
25
|
-
expect(config.baseUrl).toBe('https://api.example.com')
|
|
26
|
-
expect(config.token).toBe('test-token')
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
it('should merge configuration with defaults', () => {
|
|
30
|
-
setSDKExtensionsConfig({ token: 'new-token' })
|
|
31
|
-
|
|
32
|
-
const config = getSDKExtensionsConfig()
|
|
33
|
-
expect(config.token).toBe('new-token')
|
|
34
|
-
expect(config.credentials).toBe('include') // Default value
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
it('should allow partial updates', () => {
|
|
38
|
-
setSDKExtensionsConfig({ baseUrl: 'https://first.com' })
|
|
39
|
-
setSDKExtensionsConfig({ token: 'token-123' })
|
|
40
|
-
|
|
41
|
-
const config = getSDKExtensionsConfig()
|
|
42
|
-
expect(config.baseUrl).toBe('https://first.com')
|
|
43
|
-
expect(config.token).toBe('token-123')
|
|
44
|
-
})
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
describe('resetSDKExtensionsConfig', () => {
|
|
48
|
-
it('should reset configuration to defaults', () => {
|
|
49
|
-
setSDKExtensionsConfig({
|
|
50
|
-
baseUrl: 'https://custom.com',
|
|
51
|
-
token: 'custom-token',
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
resetSDKExtensionsConfig()
|
|
55
|
-
|
|
56
|
-
const config = getSDKExtensionsConfig()
|
|
57
|
-
expect(config.baseUrl).toBe('http://localhost:8000')
|
|
58
|
-
expect(config.token).toBeUndefined()
|
|
59
|
-
expect(config.credentials).toBe('include')
|
|
60
|
-
})
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
describe('extractJWTFromHeader', () => {
|
|
64
|
-
it('should extract JWT from Bearer token', () => {
|
|
65
|
-
const token = extractJWTFromHeader('Bearer abc.def.ghi')
|
|
66
|
-
expect(token).toBe('abc.def.ghi')
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
it('should extract JWT from array of headers', () => {
|
|
70
|
-
const token = extractJWTFromHeader(['Bearer abc.def.ghi'])
|
|
71
|
-
expect(token).toBe('abc.def.ghi')
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
it('should return undefined for non-Bearer tokens', () => {
|
|
75
|
-
const token = extractJWTFromHeader('Basic abc123')
|
|
76
|
-
expect(token).toBeUndefined()
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
it('should return undefined for undefined header', () => {
|
|
80
|
-
const token = extractJWTFromHeader(undefined)
|
|
81
|
-
expect(token).toBeUndefined()
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
it('should return undefined for empty string', () => {
|
|
85
|
-
const token = extractJWTFromHeader('')
|
|
86
|
-
expect(token).toBeUndefined()
|
|
87
|
-
})
|
|
88
|
-
|
|
89
|
-
it('should handle Bearer without space', () => {
|
|
90
|
-
const token = extractJWTFromHeader('Bearerabc.def.ghi')
|
|
91
|
-
expect(token).toBeUndefined()
|
|
92
|
-
})
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
describe('isValidJWT', () => {
|
|
96
|
-
it('should validate a proper JWT format', () => {
|
|
97
|
-
const valid = isValidJWT('eyJhbGc.eyJzdWI.SflKxw')
|
|
98
|
-
expect(valid).toBe(true)
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
it('should reject tokens with fewer than 3 parts', () => {
|
|
102
|
-
const valid = isValidJWT('abc.def')
|
|
103
|
-
expect(valid).toBe(false)
|
|
104
|
-
})
|
|
105
|
-
|
|
106
|
-
it('should reject tokens with more than 3 parts', () => {
|
|
107
|
-
const valid = isValidJWT('a.b.c.d')
|
|
108
|
-
expect(valid).toBe(false)
|
|
109
|
-
})
|
|
110
|
-
|
|
111
|
-
it('should reject tokens with empty parts', () => {
|
|
112
|
-
const valid = isValidJWT('a..c')
|
|
113
|
-
expect(valid).toBe(false)
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
it('should reject undefined', () => {
|
|
117
|
-
const valid = isValidJWT(undefined)
|
|
118
|
-
expect(valid).toBe(false)
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
it('should reject empty string', () => {
|
|
122
|
-
const valid = isValidJWT('')
|
|
123
|
-
expect(valid).toBe(false)
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
it('should reject non-string values', () => {
|
|
127
|
-
const valid = isValidJWT(123 as any)
|
|
128
|
-
expect(valid).toBe(false)
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
it('should accept JWT with long parts', () => {
|
|
132
|
-
const longJWT =
|
|
133
|
-
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
|
|
134
|
-
const valid = isValidJWT(longJWT)
|
|
135
|
-
expect(valid).toBe(true)
|
|
136
|
-
})
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
describe('configureWithJWT', () => {
|
|
140
|
-
it('should configure SDK with JWT token', () => {
|
|
141
|
-
configureWithJWT('abc.def.ghi')
|
|
142
|
-
|
|
143
|
-
const config = getSDKExtensionsConfig()
|
|
144
|
-
expect(config.token).toBe('abc.def.ghi')
|
|
145
|
-
expect(config.credentials).toBe('omit') // Default when using JWT
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
it('should allow overriding credentials', () => {
|
|
149
|
-
configureWithJWT('abc.def.ghi', { credentials: 'include' })
|
|
150
|
-
|
|
151
|
-
const config = getSDKExtensionsConfig()
|
|
152
|
-
expect(config.credentials).toBe('include')
|
|
153
|
-
})
|
|
154
|
-
|
|
155
|
-
it('should merge additional config options', () => {
|
|
156
|
-
configureWithJWT('abc.def.ghi', {
|
|
157
|
-
baseUrl: 'https://custom.com',
|
|
158
|
-
timeout: 60000,
|
|
159
|
-
})
|
|
160
|
-
|
|
161
|
-
const config = getSDKExtensionsConfig()
|
|
162
|
-
expect(config.token).toBe('abc.def.ghi')
|
|
163
|
-
expect(config.baseUrl).toBe('https://custom.com')
|
|
164
|
-
expect(config.timeout).toBe(60000)
|
|
165
|
-
})
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
describe('getEnvironmentConfig', () => {
|
|
169
|
-
it('should return development config by default', () => {
|
|
170
|
-
const config = getEnvironmentConfig()
|
|
171
|
-
expect(config.baseUrl).toBe('http://localhost:8000')
|
|
172
|
-
expect(config.credentials).toBe('include')
|
|
173
|
-
expect(config.timeout).toBe(30000)
|
|
174
|
-
expect(config.maxRetries).toBe(3)
|
|
175
|
-
})
|
|
176
|
-
|
|
177
|
-
it('should return production config', () => {
|
|
178
|
-
const config = getEnvironmentConfig('production')
|
|
179
|
-
expect(config.baseUrl).toBe('https://api.robosystems.ai')
|
|
180
|
-
expect(config.timeout).toBe(60000)
|
|
181
|
-
expect(config.maxRetries).toBe(5)
|
|
182
|
-
expect(config.retryDelay).toBe(2000)
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
it('should return staging config', () => {
|
|
186
|
-
const config = getEnvironmentConfig('staging')
|
|
187
|
-
expect(config.baseUrl).toBe('https://staging-api.robosystems.ai')
|
|
188
|
-
expect(config.timeout).toBe(45000)
|
|
189
|
-
expect(config.maxRetries).toBe(3)
|
|
190
|
-
expect(config.retryDelay).toBe(1500)
|
|
191
|
-
})
|
|
192
|
-
|
|
193
|
-
it('should return development config explicitly', () => {
|
|
194
|
-
const config = getEnvironmentConfig('development')
|
|
195
|
-
expect(config.baseUrl).toBe('http://localhost:8000')
|
|
196
|
-
expect(config.timeout).toBe(30000)
|
|
197
|
-
})
|
|
198
|
-
})
|
|
199
|
-
})
|