@symbo.ls/sdk 2.32.2 → 2.32.5
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/dist/cjs/config/environment.js +43 -8
- package/dist/cjs/index.js +12 -4
- package/dist/cjs/services/AdminService.js +4 -4
- package/dist/cjs/services/AuthService.js +36 -149
- package/dist/cjs/services/BaseService.js +5 -18
- package/dist/cjs/services/BranchService.js +10 -10
- package/dist/cjs/services/CollabService.js +94 -61
- package/dist/cjs/services/CoreService.js +19 -19
- package/dist/cjs/services/DnsService.js +4 -4
- package/dist/cjs/services/FileService.js +2 -2
- package/dist/cjs/services/PaymentService.js +2 -2
- package/dist/cjs/services/PlanService.js +12 -12
- package/dist/cjs/services/ProjectService.js +45 -35
- package/dist/cjs/services/PullRequestService.js +7 -7
- package/dist/cjs/services/ScreenshotService.js +304 -0
- package/dist/cjs/services/SubscriptionService.js +14 -14
- package/dist/cjs/services/index.js +4 -0
- package/dist/cjs/utils/TokenManager.js +16 -5
- package/dist/cjs/utils/changePreprocessor.js +134 -0
- package/dist/cjs/utils/jsonDiff.js +46 -4
- package/dist/cjs/utils/ordering.js +274 -0
- package/dist/cjs/utils/services.js +14 -1
- package/dist/esm/config/environment.js +43 -8
- package/dist/esm/index.js +1099 -417
- package/dist/esm/services/AdminService.js +68 -35
- package/dist/esm/services/AuthService.js +100 -168
- package/dist/esm/services/BaseService.js +64 -31
- package/dist/esm/services/BranchService.js +74 -41
- package/dist/esm/services/CollabService.js +570 -97
- package/dist/esm/services/CoreService.js +83 -50
- package/dist/esm/services/DnsService.js +68 -35
- package/dist/esm/services/FileService.js +66 -33
- package/dist/esm/services/PaymentService.js +66 -33
- package/dist/esm/services/PlanService.js +76 -43
- package/dist/esm/services/ProjectService.js +547 -66
- package/dist/esm/services/PullRequestService.js +71 -38
- package/dist/esm/services/ScreenshotService.js +992 -0
- package/dist/esm/services/SubscriptionService.js +78 -45
- package/dist/esm/services/index.js +1076 -412
- package/dist/esm/utils/CollabClient.js +89 -12
- package/dist/esm/utils/TokenManager.js +16 -5
- package/dist/esm/utils/changePreprocessor.js +442 -0
- package/dist/esm/utils/jsonDiff.js +46 -4
- package/dist/esm/utils/ordering.js +256 -0
- package/dist/esm/utils/services.js +14 -1
- package/dist/node/config/environment.js +43 -8
- package/dist/node/index.js +14 -5
- package/dist/node/services/AdminService.js +4 -4
- package/dist/node/services/AuthService.js +36 -139
- package/dist/node/services/BaseService.js +5 -18
- package/dist/node/services/BranchService.js +10 -10
- package/dist/node/services/CollabService.js +95 -62
- package/dist/node/services/CoreService.js +19 -19
- package/dist/node/services/DnsService.js +4 -4
- package/dist/node/services/FileService.js +2 -2
- package/dist/node/services/PaymentService.js +2 -2
- package/dist/node/services/PlanService.js +12 -12
- package/dist/node/services/ProjectService.js +45 -35
- package/dist/node/services/PullRequestService.js +7 -7
- package/dist/node/services/ScreenshotService.js +285 -0
- package/dist/node/services/SubscriptionService.js +14 -14
- package/dist/node/services/index.js +4 -0
- package/dist/node/utils/TokenManager.js +16 -5
- package/dist/node/utils/changePreprocessor.js +115 -0
- package/dist/node/utils/jsonDiff.js +46 -4
- package/dist/node/utils/ordering.js +255 -0
- package/dist/node/utils/services.js +14 -1
- package/package.json +7 -6
- package/src/config/environment.js +48 -9
- package/src/index.js +38 -22
- package/src/services/AdminService.js +4 -4
- package/src/services/AuthService.js +42 -175
- package/src/services/BaseService.js +7 -24
- package/src/services/BranchService.js +10 -10
- package/src/services/CollabService.js +115 -74
- package/src/services/CoreService.js +19 -19
- package/src/services/DnsService.js +4 -4
- package/src/services/FileService.js +2 -2
- package/src/services/PaymentService.js +2 -2
- package/src/services/PlanService.js +12 -12
- package/src/services/ProjectService.js +50 -35
- package/src/services/PullRequestService.js +7 -7
- package/src/services/ScreenshotService.js +258 -0
- package/src/services/SubscriptionService.js +14 -14
- package/src/services/index.js +6 -1
- package/src/utils/TokenManager.js +19 -5
- package/src/utils/changePreprocessor.js +139 -0
- package/src/utils/jsonDiff.js +40 -5
- package/src/utils/ordering.js +244 -0
- package/src/utils/services.js +15 -1
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { BaseService } from './BaseService.js'
|
|
2
|
-
import environment from '../config/environment.js'
|
|
3
|
-
import { getTokenManager } from '../utils/TokenManager.js'
|
|
4
2
|
import {
|
|
5
3
|
ROLE_PERMISSIONS,
|
|
6
4
|
TIER_FEATURES,
|
|
@@ -18,147 +16,11 @@ export class AuthService extends BaseService {
|
|
|
18
16
|
'pro2',
|
|
19
17
|
'enterprise'
|
|
20
18
|
])
|
|
21
|
-
this._initialized = false
|
|
22
|
-
this._apiUrl = null
|
|
23
|
-
this._tokenManager = null
|
|
24
19
|
this._projectRoleCache = new Map() // Cache for project roles
|
|
25
20
|
this._roleCacheExpiry = 5 * 60 * 1000 // 5 minutes cache expiry
|
|
26
21
|
}
|
|
27
22
|
|
|
28
|
-
|
|
29
|
-
try {
|
|
30
|
-
const { appKey, authToken } = context || this._context
|
|
31
|
-
|
|
32
|
-
// Get base URL from environment config
|
|
33
|
-
this._apiUrl = environment.apiUrl
|
|
34
|
-
|
|
35
|
-
if (!this._apiUrl) {
|
|
36
|
-
throw new Error('Auth service base URL not configured')
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Initialize token manager
|
|
40
|
-
this._tokenManager = getTokenManager({
|
|
41
|
-
apiUrl: this._apiUrl,
|
|
42
|
-
onTokenRefresh: (tokens) => {
|
|
43
|
-
// Update context with new token
|
|
44
|
-
this.updateContext({ authToken: tokens.accessToken })
|
|
45
|
-
},
|
|
46
|
-
onTokenExpired: () => {
|
|
47
|
-
// Clear context token
|
|
48
|
-
this.updateContext({ authToken: null })
|
|
49
|
-
},
|
|
50
|
-
onTokenError: (error) => {
|
|
51
|
-
console.error('Token management error:', error)
|
|
52
|
-
}
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
if (authToken && !this._tokenManager.hasTokens()) {
|
|
56
|
-
this._tokenManager.setTokens({ access_token: authToken })
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Store masked configuration info
|
|
60
|
-
this._info = {
|
|
61
|
-
config: {
|
|
62
|
-
apiUrl: this._apiUrl,
|
|
63
|
-
appKey: appKey
|
|
64
|
-
? `${appKey.substr(0, 4)}...${appKey.substr(-4)}`
|
|
65
|
-
: null,
|
|
66
|
-
hasToken: Boolean(authToken)
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
this._initialized = true
|
|
71
|
-
this._setReady()
|
|
72
|
-
} catch (error) {
|
|
73
|
-
this._setError(error)
|
|
74
|
-
throw error
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// Helper method to make HTTP requests
|
|
79
|
-
async _request(endpoint, options = {}) {
|
|
80
|
-
const url = `${this._apiUrl}/core${endpoint}`
|
|
81
|
-
|
|
82
|
-
const defaultHeaders = {}
|
|
83
|
-
|
|
84
|
-
// Only set Content-Type for JSON requests, not for FormData
|
|
85
|
-
if (!(options.body instanceof FormData)) {
|
|
86
|
-
defaultHeaders['Content-Type'] = 'application/json'
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Use TokenManager for automatic token management
|
|
90
|
-
if (this._requiresInit(options.methodName) && this._tokenManager) {
|
|
91
|
-
try {
|
|
92
|
-
// Ensure we have a valid token (will refresh if needed)
|
|
93
|
-
const validToken = await this._tokenManager.ensureValidToken()
|
|
94
|
-
|
|
95
|
-
if (validToken) {
|
|
96
|
-
const authHeader = this._tokenManager.getAuthHeader()
|
|
97
|
-
if (authHeader) {
|
|
98
|
-
defaultHeaders.Authorization = authHeader
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
} catch (error) {
|
|
102
|
-
console.warn(
|
|
103
|
-
'Token management failed, proceeding without authentication:',
|
|
104
|
-
error
|
|
105
|
-
)
|
|
106
|
-
}
|
|
107
|
-
} else if (this._requiresInit(options.methodName)) {
|
|
108
|
-
// Fallback to context token if TokenManager not available
|
|
109
|
-
const { authToken } = this._context
|
|
110
|
-
if (authToken) {
|
|
111
|
-
defaultHeaders.Authorization = `Bearer ${authToken}`
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
try {
|
|
116
|
-
const response = await fetch(url, {
|
|
117
|
-
...options,
|
|
118
|
-
headers: {
|
|
119
|
-
...defaultHeaders,
|
|
120
|
-
...options.headers
|
|
121
|
-
}
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
if (!response.ok) {
|
|
125
|
-
let error = {
|
|
126
|
-
message: `HTTP ${response.status}: ${response.statusText}`
|
|
127
|
-
}
|
|
128
|
-
try {
|
|
129
|
-
error = await response.json()
|
|
130
|
-
} catch {
|
|
131
|
-
// Use default error message
|
|
132
|
-
}
|
|
133
|
-
throw new Error(error.message || error.error || 'Request failed')
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return response.status === 204 ? null : response.json()
|
|
137
|
-
} catch (error) {
|
|
138
|
-
throw new Error(`Request failed: ${error.message}`)
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
_requiresInit(methodName) {
|
|
143
|
-
const noInitMethods = new Set([
|
|
144
|
-
'register',
|
|
145
|
-
'login',
|
|
146
|
-
'googleAuth',
|
|
147
|
-
'googleAuthCallback',
|
|
148
|
-
'githubAuth',
|
|
149
|
-
'requestPasswordReset',
|
|
150
|
-
'confirmPasswordReset',
|
|
151
|
-
'confirmRegistration',
|
|
152
|
-
'verifyEmail'
|
|
153
|
-
])
|
|
154
|
-
return !noInitMethods.has(methodName)
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
_requireReady(methodName) {
|
|
158
|
-
if (this._requiresInit(methodName) && !this._initialized) {
|
|
159
|
-
throw new Error('Auth service not initialized')
|
|
160
|
-
}
|
|
161
|
-
}
|
|
23
|
+
// Use BaseService.init/_request/_requireReady implementations
|
|
162
24
|
|
|
163
25
|
// ==================== AUTH METHODS ====================
|
|
164
26
|
|
|
@@ -174,7 +36,7 @@ export class AuthService extends BaseService {
|
|
|
174
36
|
}
|
|
175
37
|
throw new Error(response.message)
|
|
176
38
|
} catch (error) {
|
|
177
|
-
throw new Error(`Registration failed: ${error.message}
|
|
39
|
+
throw new Error(`Registration failed: ${error.message}`, { cause: error })
|
|
178
40
|
}
|
|
179
41
|
}
|
|
180
42
|
|
|
@@ -200,9 +62,6 @@ export class AuthService extends BaseService {
|
|
|
200
62
|
if (this._tokenManager) {
|
|
201
63
|
this._tokenManager.setTokens(tokenData)
|
|
202
64
|
}
|
|
203
|
-
|
|
204
|
-
// Update context for backward compatibility
|
|
205
|
-
this.updateContext({ authToken: tokens.accessToken })
|
|
206
65
|
}
|
|
207
66
|
|
|
208
67
|
if (response.success) {
|
|
@@ -210,7 +69,7 @@ export class AuthService extends BaseService {
|
|
|
210
69
|
}
|
|
211
70
|
throw new Error(response.message)
|
|
212
71
|
} catch (error) {
|
|
213
|
-
throw new Error(`Login failed: ${error.message}
|
|
72
|
+
throw new Error(`Login failed: ${error.message}`, { cause: error })
|
|
214
73
|
}
|
|
215
74
|
}
|
|
216
75
|
|
|
@@ -227,15 +86,13 @@ export class AuthService extends BaseService {
|
|
|
227
86
|
if (this._tokenManager) {
|
|
228
87
|
this._tokenManager.clearTokens()
|
|
229
88
|
}
|
|
230
|
-
this.updateContext({ authToken: null })
|
|
231
89
|
} catch (error) {
|
|
232
90
|
// Even if the API call fails, clear local tokens
|
|
233
91
|
if (this._tokenManager) {
|
|
234
92
|
this._tokenManager.clearTokens()
|
|
235
93
|
}
|
|
236
|
-
this.updateContext({ authToken: null })
|
|
237
94
|
|
|
238
|
-
throw new Error(`Logout failed: ${error.message}
|
|
95
|
+
throw new Error(`Logout failed: ${error.message}`, { cause: error })
|
|
239
96
|
}
|
|
240
97
|
}
|
|
241
98
|
|
|
@@ -251,7 +108,7 @@ export class AuthService extends BaseService {
|
|
|
251
108
|
}
|
|
252
109
|
throw new Error(response.message)
|
|
253
110
|
} catch (error) {
|
|
254
|
-
throw new Error(`Token refresh failed: ${error.message}
|
|
111
|
+
throw new Error(`Token refresh failed: ${error.message}`, { cause: error })
|
|
255
112
|
}
|
|
256
113
|
}
|
|
257
114
|
|
|
@@ -282,9 +139,6 @@ export class AuthService extends BaseService {
|
|
|
282
139
|
if (this._tokenManager) {
|
|
283
140
|
this._tokenManager.setTokens(tokenData)
|
|
284
141
|
}
|
|
285
|
-
|
|
286
|
-
// Update context for backward compatibility
|
|
287
|
-
this.updateContext({ authToken: tokens.accessToken })
|
|
288
142
|
}
|
|
289
143
|
|
|
290
144
|
if (response.success) {
|
|
@@ -292,7 +146,7 @@ export class AuthService extends BaseService {
|
|
|
292
146
|
}
|
|
293
147
|
throw new Error(response.message)
|
|
294
148
|
} catch (error) {
|
|
295
|
-
throw new Error(`Google auth failed: ${error.message}
|
|
149
|
+
throw new Error(`Google auth failed: ${error.message}`, { cause: error })
|
|
296
150
|
}
|
|
297
151
|
}
|
|
298
152
|
|
|
@@ -323,9 +177,6 @@ export class AuthService extends BaseService {
|
|
|
323
177
|
if (this._tokenManager) {
|
|
324
178
|
this._tokenManager.setTokens(tokenData)
|
|
325
179
|
}
|
|
326
|
-
|
|
327
|
-
// Update context for backward compatibility
|
|
328
|
-
this.updateContext({ authToken: tokens.accessToken })
|
|
329
180
|
}
|
|
330
181
|
|
|
331
182
|
if (response.success) {
|
|
@@ -333,7 +184,7 @@ export class AuthService extends BaseService {
|
|
|
333
184
|
}
|
|
334
185
|
throw new Error(response.message)
|
|
335
186
|
} catch (error) {
|
|
336
|
-
throw new Error(`GitHub auth failed: ${error.message}
|
|
187
|
+
throw new Error(`GitHub auth failed: ${error.message}`, { cause: error })
|
|
337
188
|
}
|
|
338
189
|
}
|
|
339
190
|
|
|
@@ -364,9 +215,6 @@ export class AuthService extends BaseService {
|
|
|
364
215
|
if (this._tokenManager) {
|
|
365
216
|
this._tokenManager.setTokens(tokenData)
|
|
366
217
|
}
|
|
367
|
-
|
|
368
|
-
// Update context for backward compatibility
|
|
369
|
-
this.updateContext({ authToken: tokens.accessToken })
|
|
370
218
|
}
|
|
371
219
|
|
|
372
220
|
if (response.success) {
|
|
@@ -374,7 +222,7 @@ export class AuthService extends BaseService {
|
|
|
374
222
|
}
|
|
375
223
|
throw new Error(response.message)
|
|
376
224
|
} catch (error) {
|
|
377
|
-
throw new Error(`Google auth callback failed: ${error.message}
|
|
225
|
+
throw new Error(`Google auth callback failed: ${error.message}`, { cause: error })
|
|
378
226
|
}
|
|
379
227
|
}
|
|
380
228
|
|
|
@@ -390,7 +238,7 @@ export class AuthService extends BaseService {
|
|
|
390
238
|
}
|
|
391
239
|
throw new Error(response.message)
|
|
392
240
|
} catch (error) {
|
|
393
|
-
throw new Error(`Password reset request failed: ${error.message}
|
|
241
|
+
throw new Error(`Password reset request failed: ${error.message}`, { cause: error })
|
|
394
242
|
}
|
|
395
243
|
}
|
|
396
244
|
|
|
@@ -406,7 +254,7 @@ export class AuthService extends BaseService {
|
|
|
406
254
|
}
|
|
407
255
|
throw new Error(response.message)
|
|
408
256
|
} catch (error) {
|
|
409
|
-
throw new Error(`Password reset confirmation failed: ${error.message}
|
|
257
|
+
throw new Error(`Password reset confirmation failed: ${error.message}`, { cause: error })
|
|
410
258
|
}
|
|
411
259
|
}
|
|
412
260
|
|
|
@@ -422,7 +270,7 @@ export class AuthService extends BaseService {
|
|
|
422
270
|
}
|
|
423
271
|
throw new Error(response.message)
|
|
424
272
|
} catch (error) {
|
|
425
|
-
throw new Error(`Registration confirmation failed: ${error.message}
|
|
273
|
+
throw new Error(`Registration confirmation failed: ${error.message}`, { cause: error })
|
|
426
274
|
}
|
|
427
275
|
}
|
|
428
276
|
|
|
@@ -438,7 +286,7 @@ export class AuthService extends BaseService {
|
|
|
438
286
|
}
|
|
439
287
|
throw new Error(response.message)
|
|
440
288
|
} catch (error) {
|
|
441
|
-
throw new Error(`Password change request failed: ${error.message}
|
|
289
|
+
throw new Error(`Password change request failed: ${error.message}`, { cause: error })
|
|
442
290
|
}
|
|
443
291
|
}
|
|
444
292
|
|
|
@@ -455,7 +303,7 @@ export class AuthService extends BaseService {
|
|
|
455
303
|
}
|
|
456
304
|
throw new Error(response.message)
|
|
457
305
|
} catch (error) {
|
|
458
|
-
throw new Error(`Password change confirmation failed: ${error.message}
|
|
306
|
+
throw new Error(`Password change confirmation failed: ${error.message}`, { cause: error })
|
|
459
307
|
}
|
|
460
308
|
}
|
|
461
309
|
|
|
@@ -471,7 +319,7 @@ export class AuthService extends BaseService {
|
|
|
471
319
|
}
|
|
472
320
|
throw new Error(response.message)
|
|
473
321
|
} catch (error) {
|
|
474
|
-
throw new Error(`Failed to get user profile: ${error.message}
|
|
322
|
+
throw new Error(`Failed to get user profile: ${error.message}`, { cause: error })
|
|
475
323
|
}
|
|
476
324
|
}
|
|
477
325
|
|
|
@@ -595,7 +443,7 @@ export class AuthService extends BaseService {
|
|
|
595
443
|
}
|
|
596
444
|
throw new Error(response.message)
|
|
597
445
|
} catch (error) {
|
|
598
|
-
throw new Error(`Failed to get user profile: ${error.message}
|
|
446
|
+
throw new Error(`Failed to get user profile: ${error.message}`, { cause: error })
|
|
599
447
|
}
|
|
600
448
|
}
|
|
601
449
|
|
|
@@ -612,7 +460,7 @@ export class AuthService extends BaseService {
|
|
|
612
460
|
}
|
|
613
461
|
throw new Error(response.message)
|
|
614
462
|
} catch (error) {
|
|
615
|
-
throw new Error(`Failed to update user profile: ${error.message}
|
|
463
|
+
throw new Error(`Failed to update user profile: ${error.message}`, { cause: error })
|
|
616
464
|
}
|
|
617
465
|
}
|
|
618
466
|
|
|
@@ -636,7 +484,7 @@ export class AuthService extends BaseService {
|
|
|
636
484
|
}
|
|
637
485
|
throw new Error(response.message)
|
|
638
486
|
} catch (error) {
|
|
639
|
-
throw new Error(`Failed to get user projects: ${error.message}
|
|
487
|
+
throw new Error(`Failed to get user projects: ${error.message}`, { cause: error })
|
|
640
488
|
}
|
|
641
489
|
}
|
|
642
490
|
|
|
@@ -655,7 +503,7 @@ export class AuthService extends BaseService {
|
|
|
655
503
|
}
|
|
656
504
|
throw new Error(response.message)
|
|
657
505
|
} catch (error) {
|
|
658
|
-
throw new Error(`Failed to get user: ${error.message}
|
|
506
|
+
throw new Error(`Failed to get user: ${error.message}`, { cause: error })
|
|
659
507
|
}
|
|
660
508
|
}
|
|
661
509
|
|
|
@@ -674,7 +522,7 @@ export class AuthService extends BaseService {
|
|
|
674
522
|
}
|
|
675
523
|
throw new Error(response.message)
|
|
676
524
|
} catch (error) {
|
|
677
|
-
throw new Error(`Failed to get user by email: ${error.message}
|
|
525
|
+
throw new Error(`Failed to get user by email: ${error.message}`, { cause: error })
|
|
678
526
|
}
|
|
679
527
|
}
|
|
680
528
|
|
|
@@ -690,6 +538,11 @@ export class AuthService extends BaseService {
|
|
|
690
538
|
throw new Error('Project ID is required')
|
|
691
539
|
}
|
|
692
540
|
|
|
541
|
+
// If there are no valid tokens, treat user as guest for public access
|
|
542
|
+
if (!this.hasValidTokens()) {
|
|
543
|
+
return 'guest'
|
|
544
|
+
}
|
|
545
|
+
|
|
693
546
|
// Check cache first
|
|
694
547
|
const cacheKey = `role_${projectId}`
|
|
695
548
|
const cached = this._projectRoleCache.get(cacheKey)
|
|
@@ -715,7 +568,12 @@ export class AuthService extends BaseService {
|
|
|
715
568
|
}
|
|
716
569
|
throw new Error(response.message)
|
|
717
570
|
} catch (error) {
|
|
718
|
-
|
|
571
|
+
const message = error?.message || ''
|
|
572
|
+
// If request failed due to missing/invalid auth, default to guest
|
|
573
|
+
if (/401|403|unauthorized|no token|invalid token/iu.test(message)) {
|
|
574
|
+
return 'guest'
|
|
575
|
+
}
|
|
576
|
+
throw new Error(`Failed to get project role: ${message}`, { cause: error })
|
|
719
577
|
}
|
|
720
578
|
}
|
|
721
579
|
|
|
@@ -729,6 +587,11 @@ export class AuthService extends BaseService {
|
|
|
729
587
|
throw new Error('Project key is required')
|
|
730
588
|
}
|
|
731
589
|
|
|
590
|
+
// If there are no valid tokens, treat user as guest for public access
|
|
591
|
+
if (!this.hasValidTokens()) {
|
|
592
|
+
return 'guest'
|
|
593
|
+
}
|
|
594
|
+
|
|
732
595
|
// Check cache first
|
|
733
596
|
const cacheKey = `role_key_${projectKey}`
|
|
734
597
|
const cached = this._projectRoleCache.get(cacheKey)
|
|
@@ -754,7 +617,12 @@ export class AuthService extends BaseService {
|
|
|
754
617
|
}
|
|
755
618
|
throw new Error(response.message)
|
|
756
619
|
} catch (error) {
|
|
757
|
-
|
|
620
|
+
const message = error?.message || ''
|
|
621
|
+
// If request failed due to missing/invalid auth, default to guest
|
|
622
|
+
if (/401|403|unauthorized|no token|invalid token/iu.test(message)) {
|
|
623
|
+
return 'guest'
|
|
624
|
+
}
|
|
625
|
+
throw new Error(`Failed to get project role by key: ${message}`, { cause: error })
|
|
758
626
|
}
|
|
759
627
|
}
|
|
760
628
|
|
|
@@ -882,7 +750,7 @@ export class AuthService extends BaseService {
|
|
|
882
750
|
try {
|
|
883
751
|
return await this.getMe()
|
|
884
752
|
} catch (error) {
|
|
885
|
-
throw new Error(`Failed to get current user: ${error.message}
|
|
753
|
+
throw new Error(`Failed to get current user: ${error.message}`, { cause: error })
|
|
886
754
|
}
|
|
887
755
|
}
|
|
888
756
|
|
|
@@ -1082,7 +950,6 @@ export class AuthService extends BaseService {
|
|
|
1082
950
|
}
|
|
1083
951
|
// Clear project role cache
|
|
1084
952
|
this._projectRoleCache.clear()
|
|
1085
|
-
this._initialized = false
|
|
1086
953
|
this._setReady(false)
|
|
1087
954
|
}
|
|
1088
955
|
}
|
|
@@ -23,28 +23,14 @@ export class BaseService {
|
|
|
23
23
|
throw new Error('Service base URL not configured')
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
// Initialize token manager
|
|
26
|
+
// Initialize token manager (singleton). TokenManager handles persistence
|
|
27
27
|
this._tokenManager = getTokenManager({
|
|
28
28
|
apiUrl: this._apiUrl,
|
|
29
|
-
onTokenRefresh: tokens => {
|
|
30
|
-
// Update context with new token
|
|
31
|
-
this.updateContext({ authToken: tokens.accessToken })
|
|
32
|
-
},
|
|
33
|
-
onTokenExpired: () => {
|
|
34
|
-
// Clear context token
|
|
35
|
-
this.updateContext({ authToken: null })
|
|
36
|
-
},
|
|
37
29
|
onTokenError: error => {
|
|
38
30
|
console.error('Token management error:', error)
|
|
39
31
|
}
|
|
40
32
|
})
|
|
41
33
|
|
|
42
|
-
// Set initial token if provided
|
|
43
|
-
const { authToken } = this._context
|
|
44
|
-
if (authToken && !this._tokenManager.hasTokens()) {
|
|
45
|
-
this._tokenManager.setTokens({ access_token: authToken })
|
|
46
|
-
}
|
|
47
|
-
|
|
48
34
|
this._setReady()
|
|
49
35
|
} catch (error) {
|
|
50
36
|
this._setError(error)
|
|
@@ -54,7 +40,10 @@ export class BaseService {
|
|
|
54
40
|
|
|
55
41
|
// Update context
|
|
56
42
|
updateContext (context) {
|
|
57
|
-
|
|
43
|
+
// Mutate in place to preserve the shared reference with the SDK context
|
|
44
|
+
if (context && typeof context === 'object') {
|
|
45
|
+
Object.assign(this._context, context)
|
|
46
|
+
}
|
|
58
47
|
}
|
|
59
48
|
|
|
60
49
|
// Get service status
|
|
@@ -123,12 +112,6 @@ export class BaseService {
|
|
|
123
112
|
error
|
|
124
113
|
)
|
|
125
114
|
}
|
|
126
|
-
} else if (this._requiresInit(options.methodName)) {
|
|
127
|
-
// Fallback to context token if TokenManager not available
|
|
128
|
-
const { authToken } = this._context
|
|
129
|
-
if (authToken) {
|
|
130
|
-
defaultHeaders.Authorization = `Bearer ${authToken}`
|
|
131
|
-
}
|
|
132
115
|
}
|
|
133
116
|
|
|
134
117
|
try {
|
|
@@ -149,12 +132,12 @@ export class BaseService {
|
|
|
149
132
|
} catch {
|
|
150
133
|
// Use default error message
|
|
151
134
|
}
|
|
152
|
-
throw new Error(error.message || error.error || 'Request failed')
|
|
135
|
+
throw new Error(error.message || error.error || 'Request failed', { cause: error })
|
|
153
136
|
}
|
|
154
137
|
|
|
155
138
|
return response.status === 204 ? null : response.json()
|
|
156
139
|
} catch (error) {
|
|
157
|
-
throw new Error(`Request failed: ${error.message}
|
|
140
|
+
throw new Error(`Request failed: ${error.message}`, { cause: error })
|
|
158
141
|
}
|
|
159
142
|
}
|
|
160
143
|
|
|
@@ -22,7 +22,7 @@ export class BranchService extends BaseService {
|
|
|
22
22
|
}
|
|
23
23
|
throw new Error(response.message)
|
|
24
24
|
} catch (error) {
|
|
25
|
-
throw new Error(`Failed to list branches: ${error.message}
|
|
25
|
+
throw new Error(`Failed to list branches: ${error.message}`, { cause: error })
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
|
|
@@ -51,7 +51,7 @@ export class BranchService extends BaseService {
|
|
|
51
51
|
}
|
|
52
52
|
throw new Error(response.message)
|
|
53
53
|
} catch (error) {
|
|
54
|
-
throw new Error(`Failed to create branch: ${error.message}
|
|
54
|
+
throw new Error(`Failed to create branch: ${error.message}`, { cause: error })
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
|
|
@@ -83,7 +83,7 @@ export class BranchService extends BaseService {
|
|
|
83
83
|
}
|
|
84
84
|
throw new Error(response.message)
|
|
85
85
|
} catch (error) {
|
|
86
|
-
throw new Error(`Failed to delete branch: ${error.message}
|
|
86
|
+
throw new Error(`Failed to delete branch: ${error.message}`, { cause: error })
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
|
|
@@ -121,7 +121,7 @@ export class BranchService extends BaseService {
|
|
|
121
121
|
}
|
|
122
122
|
throw new Error(response.message)
|
|
123
123
|
} catch (error) {
|
|
124
|
-
throw new Error(`Failed to rename branch: ${error.message}
|
|
124
|
+
throw new Error(`Failed to rename branch: ${error.message}`, { cause: error })
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
127
|
|
|
@@ -165,7 +165,7 @@ export class BranchService extends BaseService {
|
|
|
165
165
|
}
|
|
166
166
|
throw new Error(response.message)
|
|
167
167
|
} catch (error) {
|
|
168
|
-
throw new Error(`Failed to get branch changes: ${error.message}
|
|
168
|
+
throw new Error(`Failed to get branch changes: ${error.message}`, { cause: error })
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
171
|
|
|
@@ -220,7 +220,7 @@ export class BranchService extends BaseService {
|
|
|
220
220
|
) {
|
|
221
221
|
throw new Error(`Merge conflicts detected: ${error.message}`)
|
|
222
222
|
}
|
|
223
|
-
throw new Error(`Failed to merge branch: ${error.message}
|
|
223
|
+
throw new Error(`Failed to merge branch: ${error.message}`, { cause: error })
|
|
224
224
|
}
|
|
225
225
|
}
|
|
226
226
|
|
|
@@ -251,7 +251,7 @@ export class BranchService extends BaseService {
|
|
|
251
251
|
}
|
|
252
252
|
throw new Error(response.message)
|
|
253
253
|
} catch (error) {
|
|
254
|
-
throw new Error(`Failed to reset branch: ${error.message}
|
|
254
|
+
throw new Error(`Failed to reset branch: ${error.message}`, { cause: error })
|
|
255
255
|
}
|
|
256
256
|
}
|
|
257
257
|
|
|
@@ -280,7 +280,7 @@ export class BranchService extends BaseService {
|
|
|
280
280
|
}
|
|
281
281
|
throw new Error(response.message)
|
|
282
282
|
} catch (error) {
|
|
283
|
-
throw new Error(`Failed to publish version: ${error.message}
|
|
283
|
+
throw new Error(`Failed to publish version: ${error.message}`, { cause: error })
|
|
284
284
|
}
|
|
285
285
|
}
|
|
286
286
|
|
|
@@ -322,7 +322,7 @@ export class BranchService extends BaseService {
|
|
|
322
322
|
const branches = await this.listBranches(projectId)
|
|
323
323
|
return branches?.data?.includes(branchName) || false
|
|
324
324
|
} catch (error) {
|
|
325
|
-
throw new Error(`Failed to check if branch exists: ${error.message}
|
|
325
|
+
throw new Error(`Failed to check if branch exists: ${error.message}`, { cause: error })
|
|
326
326
|
}
|
|
327
327
|
}
|
|
328
328
|
|
|
@@ -405,7 +405,7 @@ export class BranchService extends BaseService {
|
|
|
405
405
|
canRename: exists && branchName !== 'main'
|
|
406
406
|
}
|
|
407
407
|
} catch (error) {
|
|
408
|
-
throw new Error(`Failed to get branch status: ${error.message}
|
|
408
|
+
throw new Error(`Failed to get branch status: ${error.message}`, { cause: error })
|
|
409
409
|
}
|
|
410
410
|
}
|
|
411
411
|
|