@robosystems/client 0.2.49 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/extensions/InvestorClient.d.ts +98 -0
  2. package/extensions/InvestorClient.js +223 -0
  3. package/extensions/InvestorClient.ts +508 -0
  4. package/extensions/LedgerClient.d.ts +190 -309
  5. package/extensions/LedgerClient.js +268 -587
  6. package/extensions/LedgerClient.ts +784 -903
  7. package/extensions/ReportClient.d.ts +82 -113
  8. package/extensions/ReportClient.js +124 -211
  9. package/extensions/ReportClient.ts +305 -358
  10. package/extensions/config.d.ts +19 -0
  11. package/extensions/config.js +1 -1
  12. package/extensions/config.ts +22 -2
  13. package/extensions/graphql/client.d.ts +82 -0
  14. package/extensions/graphql/client.js +149 -0
  15. package/extensions/graphql/client.ts +189 -0
  16. package/extensions/graphql/generated/graphql.d.ts +1786 -0
  17. package/extensions/graphql/generated/graphql.js +2671 -0
  18. package/extensions/graphql/generated/graphql.ts +4491 -0
  19. package/extensions/graphql/queries/investor/holdings.d.ts +8 -0
  20. package/extensions/graphql/queries/investor/holdings.js +36 -0
  21. package/extensions/graphql/queries/investor/holdings.ts +34 -0
  22. package/extensions/graphql/queries/investor/portfolio.d.ts +4 -0
  23. package/extensions/graphql/queries/investor/portfolio.js +21 -0
  24. package/extensions/graphql/queries/investor/portfolio.ts +19 -0
  25. package/extensions/graphql/queries/investor/portfolios.d.ts +4 -0
  26. package/extensions/graphql/queries/investor/portfolios.js +29 -0
  27. package/extensions/graphql/queries/investor/portfolios.ts +27 -0
  28. package/extensions/graphql/queries/investor/position.d.ts +4 -0
  29. package/extensions/graphql/queries/investor/position.js +33 -0
  30. package/extensions/graphql/queries/investor/position.ts +31 -0
  31. package/extensions/graphql/queries/investor/positions.d.ts +8 -0
  32. package/extensions/graphql/queries/investor/positions.js +57 -0
  33. package/extensions/graphql/queries/investor/positions.ts +55 -0
  34. package/extensions/graphql/queries/investor/securities.d.ts +8 -0
  35. package/extensions/graphql/queries/investor/securities.js +50 -0
  36. package/extensions/graphql/queries/investor/securities.ts +48 -0
  37. package/extensions/graphql/queries/investor/security.d.ts +4 -0
  38. package/extensions/graphql/queries/investor/security.js +26 -0
  39. package/extensions/graphql/queries/investor/security.ts +24 -0
  40. package/extensions/graphql/queries/ledger/accountRollups.d.ts +7 -0
  41. package/extensions/graphql/queries/ledger/accountRollups.js +36 -0
  42. package/extensions/graphql/queries/ledger/accountRollups.ts +34 -0
  43. package/extensions/graphql/queries/ledger/accountTree.d.ts +11 -0
  44. package/extensions/graphql/queries/ledger/accountTree.js +61 -0
  45. package/extensions/graphql/queries/ledger/accountTree.ts +59 -0
  46. package/extensions/graphql/queries/ledger/accounts.d.ts +8 -0
  47. package/extensions/graphql/queries/ledger/accounts.js +45 -0
  48. package/extensions/graphql/queries/ledger/accounts.ts +43 -0
  49. package/extensions/graphql/queries/ledger/closingBookStructures.d.ts +6 -0
  50. package/extensions/graphql/queries/ledger/closingBookStructures.js +27 -0
  51. package/extensions/graphql/queries/ledger/closingBookStructures.ts +25 -0
  52. package/extensions/graphql/queries/ledger/elements.d.ts +6 -0
  53. package/extensions/graphql/queries/ledger/elements.js +56 -0
  54. package/extensions/graphql/queries/ledger/elements.ts +54 -0
  55. package/extensions/graphql/queries/ledger/entities.d.ts +7 -0
  56. package/extensions/graphql/queries/ledger/entities.js +31 -0
  57. package/extensions/graphql/queries/ledger/entities.ts +29 -0
  58. package/extensions/graphql/queries/ledger/entity.d.ts +14 -0
  59. package/extensions/graphql/queries/ledger/entity.js +55 -0
  60. package/extensions/graphql/queries/ledger/entity.ts +54 -0
  61. package/extensions/graphql/queries/ledger/fiscalCalendar.d.ts +8 -0
  62. package/extensions/graphql/queries/ledger/fiscalCalendar.js +35 -0
  63. package/extensions/graphql/queries/ledger/fiscalCalendar.ts +33 -0
  64. package/extensions/graphql/queries/ledger/mappedTrialBalance.d.ts +9 -0
  65. package/extensions/graphql/queries/ledger/mappedTrialBalance.js +29 -0
  66. package/extensions/graphql/queries/ledger/mappedTrialBalance.ts +27 -0
  67. package/extensions/graphql/queries/ledger/mapping.d.ts +5 -0
  68. package/extensions/graphql/queries/ledger/mapping.js +35 -0
  69. package/extensions/graphql/queries/ledger/mapping.ts +33 -0
  70. package/extensions/graphql/queries/ledger/mappingCoverage.d.ts +5 -0
  71. package/extensions/graphql/queries/ledger/mappingCoverage.js +22 -0
  72. package/extensions/graphql/queries/ledger/mappingCoverage.ts +20 -0
  73. package/extensions/graphql/queries/ledger/mappings.d.ts +6 -0
  74. package/extensions/graphql/queries/ledger/mappings.js +23 -0
  75. package/extensions/graphql/queries/ledger/mappings.ts +21 -0
  76. package/extensions/graphql/queries/ledger/periodCloseStatus.d.ts +6 -0
  77. package/extensions/graphql/queries/ledger/periodCloseStatus.js +29 -0
  78. package/extensions/graphql/queries/ledger/periodCloseStatus.ts +27 -0
  79. package/extensions/graphql/queries/ledger/periodDrafts.d.ts +8 -0
  80. package/extensions/graphql/queries/ledger/periodDrafts.js +45 -0
  81. package/extensions/graphql/queries/ledger/periodDrafts.ts +43 -0
  82. package/extensions/graphql/queries/ledger/publishList.d.ts +5 -0
  83. package/extensions/graphql/queries/ledger/publishList.js +29 -0
  84. package/extensions/graphql/queries/ledger/publishList.ts +27 -0
  85. package/extensions/graphql/queries/ledger/publishLists.d.ts +5 -0
  86. package/extensions/graphql/queries/ledger/publishLists.js +29 -0
  87. package/extensions/graphql/queries/ledger/publishLists.ts +27 -0
  88. package/extensions/graphql/queries/ledger/report.d.ts +5 -0
  89. package/extensions/graphql/queries/ledger/report.js +40 -0
  90. package/extensions/graphql/queries/ledger/report.ts +38 -0
  91. package/extensions/graphql/queries/ledger/reportingTaxonomy.d.ts +6 -0
  92. package/extensions/graphql/queries/ledger/reportingTaxonomy.js +27 -0
  93. package/extensions/graphql/queries/ledger/reportingTaxonomy.ts +25 -0
  94. package/extensions/graphql/queries/ledger/reports.d.ts +8 -0
  95. package/extensions/graphql/queries/ledger/reports.js +45 -0
  96. package/extensions/graphql/queries/ledger/reports.ts +43 -0
  97. package/extensions/graphql/queries/ledger/scheduleFacts.d.ts +7 -0
  98. package/extensions/graphql/queries/ledger/scheduleFacts.js +24 -0
  99. package/extensions/graphql/queries/ledger/scheduleFacts.ts +22 -0
  100. package/extensions/graphql/queries/ledger/schedules.d.ts +6 -0
  101. package/extensions/graphql/queries/ledger/schedules.js +24 -0
  102. package/extensions/graphql/queries/ledger/schedules.ts +22 -0
  103. package/extensions/graphql/queries/ledger/statement.d.ts +9 -0
  104. package/extensions/graphql/queries/ledger/statement.js +43 -0
  105. package/extensions/graphql/queries/ledger/statement.ts +41 -0
  106. package/extensions/graphql/queries/ledger/structures.d.ts +5 -0
  107. package/extensions/graphql/queries/ledger/structures.js +22 -0
  108. package/extensions/graphql/queries/ledger/structures.ts +20 -0
  109. package/extensions/graphql/queries/ledger/summary.d.ts +7 -0
  110. package/extensions/graphql/queries/ledger/summary.js +25 -0
  111. package/extensions/graphql/queries/ledger/summary.ts +23 -0
  112. package/extensions/graphql/queries/ledger/taxonomies.d.ts +5 -0
  113. package/extensions/graphql/queries/ledger/taxonomies.js +28 -0
  114. package/extensions/graphql/queries/ledger/taxonomies.ts +26 -0
  115. package/extensions/graphql/queries/ledger/transaction.d.ts +6 -0
  116. package/extensions/graphql/queries/ledger/transaction.js +49 -0
  117. package/extensions/graphql/queries/ledger/transaction.ts +47 -0
  118. package/extensions/graphql/queries/ledger/transactions.d.ts +7 -0
  119. package/extensions/graphql/queries/ledger/transactions.js +49 -0
  120. package/extensions/graphql/queries/ledger/transactions.ts +47 -0
  121. package/extensions/graphql/queries/ledger/trialBalance.d.ts +7 -0
  122. package/extensions/graphql/queries/ledger/trialBalance.js +28 -0
  123. package/extensions/graphql/queries/ledger/trialBalance.ts +26 -0
  124. package/extensions/graphql/queries/ledger/unmappedElements.d.ts +8 -0
  125. package/extensions/graphql/queries/ledger/unmappedElements.js +29 -0
  126. package/extensions/graphql/queries/ledger/unmappedElements.ts +27 -0
  127. package/extensions/hooks.d.ts +1 -1
  128. package/extensions/index.d.ts +18 -1
  129. package/extensions/index.js +26 -1
  130. package/extensions/index.ts +49 -2
  131. package/index.ts +2 -2
  132. package/package.json +14 -5
  133. package/sdk/index.d.ts +2 -2
  134. package/sdk/index.js +38 -73
  135. package/sdk/index.ts +2 -2
  136. package/sdk/sdk.gen.d.ts +100 -325
  137. package/sdk/sdk.gen.js +228 -592
  138. package/sdk/sdk.gen.ts +193 -556
  139. package/sdk/types.gen.d.ts +4522 -7708
  140. package/sdk/types.gen.ts +4569 -7983
  141. package/sdk.gen.d.ts +100 -325
  142. package/sdk.gen.js +228 -592
  143. package/sdk.gen.ts +193 -556
  144. package/types.gen.d.ts +4522 -7708
  145. package/types.gen.ts +4569 -7983
  146. package/extensions/AgentClient.test.ts +0 -403
  147. package/extensions/LedgerClient.test.ts +0 -1655
  148. package/extensions/OperationClient.test.ts +0 -365
  149. package/extensions/QueryClient.test.ts +0 -432
  150. package/extensions/ReportClient.test.ts +0 -828
  151. package/extensions/SSEClient.test.ts +0 -375
  152. package/extensions/config.test.ts +0 -199
  153. package/extensions/hooks.test.ts +0 -373
  154. package/extensions/index.test.ts +0 -420
  155. package/sdk-extensions/AgentClient.d.ts +0 -82
  156. package/sdk-extensions/AgentClient.js +0 -218
  157. package/sdk-extensions/AgentClient.test.ts +0 -403
  158. package/sdk-extensions/AgentClient.ts +0 -321
  159. package/sdk-extensions/LedgerClient.d.ts +0 -416
  160. package/sdk-extensions/LedgerClient.js +0 -737
  161. package/sdk-extensions/LedgerClient.test.ts +0 -1655
  162. package/sdk-extensions/LedgerClient.ts +0 -1249
  163. package/sdk-extensions/OperationClient.d.ts +0 -65
  164. package/sdk-extensions/OperationClient.js +0 -251
  165. package/sdk-extensions/OperationClient.test.ts +0 -365
  166. package/sdk-extensions/OperationClient.ts +0 -324
  167. package/sdk-extensions/QueryClient.d.ts +0 -52
  168. package/sdk-extensions/QueryClient.js +0 -313
  169. package/sdk-extensions/QueryClient.test.ts +0 -432
  170. package/sdk-extensions/QueryClient.ts +0 -420
  171. package/sdk-extensions/README.md +0 -901
  172. package/sdk-extensions/ReportClient.d.ts +0 -151
  173. package/sdk-extensions/ReportClient.js +0 -278
  174. package/sdk-extensions/ReportClient.test.ts +0 -828
  175. package/sdk-extensions/ReportClient.ts +0 -486
  176. package/sdk-extensions/SSEClient.d.ts +0 -62
  177. package/sdk-extensions/SSEClient.js +0 -154
  178. package/sdk-extensions/SSEClient.test.ts +0 -375
  179. package/sdk-extensions/SSEClient.ts +0 -210
  180. package/sdk-extensions/config.d.ts +0 -57
  181. package/sdk-extensions/config.js +0 -152
  182. package/sdk-extensions/config.test.ts +0 -199
  183. package/sdk-extensions/config.ts +0 -175
  184. package/sdk-extensions/hooks.d.ts +0 -110
  185. package/sdk-extensions/hooks.js +0 -384
  186. package/sdk-extensions/hooks.test.ts +0 -373
  187. package/sdk-extensions/hooks.ts +0 -459
  188. package/sdk-extensions/index.d.ts +0 -63
  189. package/sdk-extensions/index.js +0 -164
  190. package/sdk-extensions/index.test.ts +0 -420
  191. 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
- })