@luxexchange/sessions 1.0.1 → 1.0.3
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/.depcheckrc +20 -0
- package/.eslintrc.js +21 -0
- package/README.md +1 -0
- package/env.d.ts +12 -0
- package/package.json +3 -4
- package/project.json +2 -8
- package/src/challenge-solvers/createChallengeSolverService.ts +5 -5
- package/src/challenge-solvers/createHashcashMockSolver.ts +1 -1
- package/src/challenge-solvers/createHashcashSolver.test.ts +10 -10
- package/src/challenge-solvers/createHashcashSolver.ts +22 -7
- package/src/challenge-solvers/createNoneMockSolver.ts +1 -1
- package/src/challenge-solvers/createTurnstileMockSolver.ts +1 -1
- package/src/challenge-solvers/createTurnstileSolver.ts +12 -8
- package/src/challenge-solvers/hashcash/core.native.ts +3 -3
- package/src/challenge-solvers/hashcash/core.test.ts +10 -10
- package/src/challenge-solvers/hashcash/core.ts +3 -3
- package/src/challenge-solvers/hashcash/core.web.ts +4 -4
- package/src/challenge-solvers/hashcash/createWorkerHashcashSolver.test.ts +7 -7
- package/src/challenge-solvers/hashcash/createWorkerHashcashSolver.ts +4 -4
- package/src/challenge-solvers/hashcash/worker/createHashcashMultiWorkerChannel.native.ts +1 -1
- package/src/challenge-solvers/hashcash/worker/createHashcashMultiWorkerChannel.ts +1 -1
- package/src/challenge-solvers/hashcash/worker/createHashcashMultiWorkerChannel.web.ts +2 -2
- package/src/challenge-solvers/hashcash/worker/createHashcashWorkerChannel.native.ts +1 -1
- package/src/challenge-solvers/hashcash/worker/createHashcashWorkerChannel.ts +1 -1
- package/src/challenge-solvers/hashcash/worker/createHashcashWorkerChannel.web.ts +2 -2
- package/src/challenge-solvers/hashcash/worker/hashcash.worker.ts +3 -3
- package/src/challenge-solvers/hashcash/worker/types.ts +1 -1
- package/src/challenge-solvers/turnstileErrors.ts +1 -1
- package/src/challenge-solvers/turnstileScriptLoader.ts +2 -2
- package/src/challenge-solvers/turnstileSolver.integration.test.ts +4 -4
- package/src/challenge-solvers/types.ts +2 -2
- package/src/challengeFlow.integration.test.ts +49 -49
- package/src/device-id/createDeviceIdService.ts +1 -1
- package/src/index.ts +50 -48
- package/src/oauth-service/createOAuthService.ts +2 -2
- package/src/oauth-service/types.ts +1 -1
- package/src/performance/createNoopPerformanceTracker.ts +2 -2
- package/src/performance/createPerformanceTracker.ts +1 -1
- package/src/performance/index.ts +3 -3
- package/src/session-initialization/createSessionInitializationService.test.ts +4 -4
- package/src/session-initialization/createSessionInitializationService.ts +32 -41
- package/src/session-repository/createSessionClient.ts +1 -1
- package/src/session-repository/createSessionRepository.test.ts +5 -5
- package/src/session-repository/createSessionRepository.ts +14 -14
- package/src/session-repository/errors.ts +1 -1
- package/src/session-repository/types.ts +1 -1
- package/src/session-service/createNoopSessionService.ts +2 -2
- package/src/session-service/createSessionService.test.ts +29 -29
- package/src/session-service/createSessionService.ts +8 -8
- package/src/session-service/types.ts +3 -3
- package/src/session-storage/createSessionStorage.ts +1 -1
- package/src/session.integration.test.ts +130 -94
- package/src/sessionLifecycle.integration.test.ts +22 -22
- package/src/test-utils/createLocalCookieTransport.ts +1 -1
- package/src/test-utils/createLocalHeaderTransport.ts +1 -1
- package/src/test-utils/mocks.ts +3 -3
- package/src/test-utils.ts +24 -24
- package/src/uniswap-identifier/createUniswapIdentifierService.ts +19 -0
- package/src/uniswap-identifier/types.ts +11 -0
- package/src/uniswap-identifier/uniswapIdentifierQuery.ts +20 -0
- package/tsconfig.json +10 -3
- package/tsconfig.lint.json +8 -0
- package/tsconfig.spec.json +8 -0
- package/vitest.config.ts +20 -0
- package/vitest.integration.config.ts +14 -0
- package/src/lux-identifier/createLuxIdentifierService.ts +0 -19
- package/src/lux-identifier/luxIdentifierQuery.ts +0 -20
- package/src/lux-identifier/types.ts +0 -11
|
@@ -7,25 +7,25 @@ import {
|
|
|
7
7
|
SignoutResponse,
|
|
8
8
|
VerifyResponse,
|
|
9
9
|
VerifySuccess,
|
|
10
|
-
} from '@
|
|
11
|
-
import { createChallengeSolverService } from '@
|
|
12
|
-
import type { ChallengeSolver } from '@
|
|
13
|
-
import type { PerformanceTracker } from '@
|
|
10
|
+
} from '@luxamm/client-platform-service/dist/uniswap/platformservice/v1/sessionService_pb'
|
|
11
|
+
import { createChallengeSolverService } from '@luxexchange/sessions/src/challenge-solvers/createChallengeSolverService'
|
|
12
|
+
import type { ChallengeSolver } from '@luxexchange/sessions/src/challenge-solvers/types'
|
|
13
|
+
import type { PerformanceTracker } from '@luxexchange/sessions/src/performance/types'
|
|
14
14
|
import {
|
|
15
15
|
createSessionInitializationService,
|
|
16
16
|
type SessionInitializationService,
|
|
17
|
-
} from '@
|
|
18
|
-
import { createSessionRepository } from '@
|
|
19
|
-
import { createSessionService } from '@
|
|
20
|
-
import type { SessionService } from '@
|
|
17
|
+
} from '@luxexchange/sessions/src/session-initialization/createSessionInitializationService'
|
|
18
|
+
import { createSessionRepository } from '@luxexchange/sessions/src/session-repository/createSessionRepository'
|
|
19
|
+
import { createSessionService } from '@luxexchange/sessions/src/session-service/createSessionService'
|
|
20
|
+
import type { SessionService } from '@luxexchange/sessions/src/session-service/types'
|
|
21
21
|
import {
|
|
22
22
|
createMockSessionClient,
|
|
23
23
|
createTestTransport,
|
|
24
24
|
InMemoryDeviceIdService,
|
|
25
25
|
InMemorySessionStorage,
|
|
26
|
-
|
|
26
|
+
InMemoryLxIdentifierService,
|
|
27
27
|
type MockEndpoints,
|
|
28
|
-
} from '@
|
|
28
|
+
} from '@luxexchange/sessions/src/test-utils'
|
|
29
29
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
30
30
|
|
|
31
31
|
// Helper: create a VerifyResponse with a success outcome (proto3 validation requires outcome.case)
|
|
@@ -52,7 +52,7 @@ const mockTurnstileSolve = vi.fn()
|
|
|
52
52
|
describe('Challenge Flow Integration Tests', () => {
|
|
53
53
|
let sessionStorage: InMemorySessionStorage
|
|
54
54
|
let deviceIdService: InMemoryDeviceIdService
|
|
55
|
-
let
|
|
55
|
+
let lxIdentifierService: InMemoryLxIdentifierService
|
|
56
56
|
let sessionService: SessionService
|
|
57
57
|
let sessionInitializationService: SessionInitializationService
|
|
58
58
|
let mockEndpoints: MockEndpoints
|
|
@@ -61,18 +61,18 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
61
61
|
// Initialize in-memory storage
|
|
62
62
|
sessionStorage = new InMemorySessionStorage()
|
|
63
63
|
deviceIdService = new InMemoryDeviceIdService()
|
|
64
|
-
|
|
64
|
+
lxIdentifierService = new InMemoryLxIdentifierService()
|
|
65
65
|
|
|
66
66
|
// Set up mock endpoints with default responses
|
|
67
67
|
mockEndpoints = {
|
|
68
|
-
'/
|
|
68
|
+
'/uniswap.platformservice.v1.SessionService/InitSession': async (): Promise<InitSessionResponse> => {
|
|
69
69
|
return new InitSessionResponse({
|
|
70
70
|
sessionId: 'test-session-123',
|
|
71
71
|
needChallenge: true,
|
|
72
72
|
extra: {},
|
|
73
73
|
})
|
|
74
74
|
},
|
|
75
|
-
'/
|
|
75
|
+
'/uniswap.platformservice.v1.SessionService/Challenge': async (): Promise<ChallengeResponse> => {
|
|
76
76
|
return new ChallengeResponse({
|
|
77
77
|
challengeId: '02c241f3-8d45-4a88-842a-d364c30a6c44',
|
|
78
78
|
challengeType: ChallengeType.TURNSTILE,
|
|
@@ -81,16 +81,16 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
81
81
|
},
|
|
82
82
|
})
|
|
83
83
|
},
|
|
84
|
-
'/
|
|
84
|
+
'/uniswap.platformservice.v1.SessionService/Verify': async (): Promise<VerifyResponse> => {
|
|
85
85
|
return createSuccessVerifyResponse()
|
|
86
86
|
},
|
|
87
|
-
'/
|
|
87
|
+
'/uniswap.platformservice.v1.SessionService/DeleteSession': async (): Promise<DeleteSessionResponse> => {
|
|
88
88
|
return new DeleteSessionResponse({})
|
|
89
89
|
},
|
|
90
|
-
'/
|
|
90
|
+
'/uniswap.platformservice.v1.SessionService/GetChallengeTypes': async (): Promise<GetChallengeTypesResponse> => {
|
|
91
91
|
return new GetChallengeTypesResponse({ challengeTypes: [] })
|
|
92
92
|
},
|
|
93
|
-
'/
|
|
93
|
+
'/uniswap.platformservice.v1.SessionService/Signout': async (): Promise<SignoutResponse> => {
|
|
94
94
|
return new SignoutResponse({})
|
|
95
95
|
},
|
|
96
96
|
} as unknown as MockEndpoints
|
|
@@ -110,7 +110,7 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
110
110
|
sessionService = createSessionService({
|
|
111
111
|
sessionStorage,
|
|
112
112
|
deviceIdService,
|
|
113
|
-
|
|
113
|
+
lxIdentifierService,
|
|
114
114
|
sessionRepository,
|
|
115
115
|
})
|
|
116
116
|
|
|
@@ -149,7 +149,7 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
149
149
|
|
|
150
150
|
it('initializes a session with needChallenge: true and completes challenge flow', async () => {
|
|
151
151
|
// Update mock to return needChallenge: true
|
|
152
|
-
mockEndpoints['/
|
|
152
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] =
|
|
153
153
|
async (): Promise<InitSessionResponse> => {
|
|
154
154
|
return new InitSessionResponse({
|
|
155
155
|
sessionId: '776973bd-bbc2-452b-9c35-1b72c475afbd',
|
|
@@ -164,8 +164,8 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
164
164
|
const verifyCalls: Array<{ request: any; headers: Record<string, string> }> = []
|
|
165
165
|
|
|
166
166
|
// Wrap handlers to track calls
|
|
167
|
-
const originalInit = mockEndpoints['/
|
|
168
|
-
mockEndpoints['/
|
|
167
|
+
const originalInit = mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession']
|
|
168
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] = async (
|
|
169
169
|
request,
|
|
170
170
|
headers,
|
|
171
171
|
): Promise<InitSessionResponse> => {
|
|
@@ -173,8 +173,8 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
173
173
|
return originalInit(request, headers)
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
const originalChallenge = mockEndpoints['/
|
|
177
|
-
mockEndpoints['/
|
|
176
|
+
const originalChallenge = mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge']
|
|
177
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] = async (
|
|
178
178
|
request,
|
|
179
179
|
headers,
|
|
180
180
|
): Promise<ChallengeResponse> => {
|
|
@@ -182,8 +182,8 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
182
182
|
return originalChallenge(request, headers)
|
|
183
183
|
}
|
|
184
184
|
|
|
185
|
-
const originalVerify = mockEndpoints['/
|
|
186
|
-
mockEndpoints['/
|
|
185
|
+
const originalVerify = mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify']
|
|
186
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify'] = async (
|
|
187
187
|
request,
|
|
188
188
|
headers,
|
|
189
189
|
): Promise<VerifyResponse> => {
|
|
@@ -254,7 +254,7 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
254
254
|
|
|
255
255
|
// Track calls
|
|
256
256
|
let initCallCount = 0
|
|
257
|
-
mockEndpoints['/
|
|
257
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] =
|
|
258
258
|
async (): Promise<InitSessionResponse> => {
|
|
259
259
|
initCallCount++
|
|
260
260
|
// Backend returns the same session ID (simulating session reuse)
|
|
@@ -279,7 +279,7 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
279
279
|
|
|
280
280
|
it('handles challenge retry when upgrade fails', async () => {
|
|
281
281
|
// Set up to require challenge
|
|
282
|
-
mockEndpoints['/
|
|
282
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] =
|
|
283
283
|
async (): Promise<InitSessionResponse> => {
|
|
284
284
|
return new InitSessionResponse({
|
|
285
285
|
sessionId: 'retry-session-123',
|
|
@@ -290,7 +290,7 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
290
290
|
|
|
291
291
|
// Make first verify attempt fail with retry
|
|
292
292
|
let verifyAttempts = 0
|
|
293
|
-
mockEndpoints['/
|
|
293
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify'] = async (): Promise<VerifyResponse> => {
|
|
294
294
|
verifyAttempts++
|
|
295
295
|
if (verifyAttempts === 1) {
|
|
296
296
|
return new VerifyResponse({ retry: true })
|
|
@@ -300,8 +300,8 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
300
300
|
|
|
301
301
|
// Track challenge calls
|
|
302
302
|
const challengeCalls: any[] = []
|
|
303
|
-
const originalChallenge = mockEndpoints['/
|
|
304
|
-
mockEndpoints['/
|
|
303
|
+
const originalChallenge = mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge']
|
|
304
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] = async (
|
|
305
305
|
request,
|
|
306
306
|
headers,
|
|
307
307
|
): Promise<ChallengeResponse> => {
|
|
@@ -323,7 +323,7 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
323
323
|
|
|
324
324
|
it('respects maximum retry limit for challenges', async () => {
|
|
325
325
|
// Set up to require challenge
|
|
326
|
-
mockEndpoints['/
|
|
326
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] =
|
|
327
327
|
async (): Promise<InitSessionResponse> => {
|
|
328
328
|
return new InitSessionResponse({
|
|
329
329
|
sessionId: 'max-retry-session',
|
|
@@ -333,7 +333,7 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
333
333
|
}
|
|
334
334
|
|
|
335
335
|
// Always return retry: true
|
|
336
|
-
mockEndpoints['/
|
|
336
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify'] = async (): Promise<VerifyResponse> => {
|
|
337
337
|
return new VerifyResponse({ retry: true })
|
|
338
338
|
}
|
|
339
339
|
|
|
@@ -341,8 +341,8 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
341
341
|
const challengeCalls: any[] = []
|
|
342
342
|
const verifyCalls: any[] = []
|
|
343
343
|
|
|
344
|
-
const originalChallenge = mockEndpoints['/
|
|
345
|
-
mockEndpoints['/
|
|
344
|
+
const originalChallenge = mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge']
|
|
345
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] = async (
|
|
346
346
|
request,
|
|
347
347
|
headers,
|
|
348
348
|
): Promise<ChallengeResponse> => {
|
|
@@ -350,8 +350,8 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
350
350
|
return originalChallenge(request, headers)
|
|
351
351
|
}
|
|
352
352
|
|
|
353
|
-
const originalVerify = mockEndpoints['/
|
|
354
|
-
mockEndpoints['/
|
|
353
|
+
const originalVerify = mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify']
|
|
354
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify'] = async (
|
|
355
355
|
request,
|
|
356
356
|
headers,
|
|
357
357
|
): Promise<VerifyResponse> => {
|
|
@@ -374,8 +374,8 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
374
374
|
|
|
375
375
|
// Track challenge request to verify headers
|
|
376
376
|
let capturedHeaders: Record<string, string> = {}
|
|
377
|
-
const originalChallenge = mockEndpoints['/
|
|
378
|
-
mockEndpoints['/
|
|
377
|
+
const originalChallenge = mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge']
|
|
378
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] = async (
|
|
379
379
|
request,
|
|
380
380
|
headers,
|
|
381
381
|
): Promise<ChallengeResponse> => {
|
|
@@ -397,8 +397,8 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
397
397
|
|
|
398
398
|
// Track challenge request to verify headers
|
|
399
399
|
let capturedHeaders: Record<string, string> = {}
|
|
400
|
-
const originalChallenge = mockEndpoints['/
|
|
401
|
-
mockEndpoints['/
|
|
400
|
+
const originalChallenge = mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge']
|
|
401
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] = async (
|
|
402
402
|
request,
|
|
403
403
|
headers,
|
|
404
404
|
): Promise<ChallengeResponse> => {
|
|
@@ -416,7 +416,7 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
416
416
|
|
|
417
417
|
it('submits empty solution when solver throws, allowing verify-retry fallback', async () => {
|
|
418
418
|
// Set up to require challenge
|
|
419
|
-
mockEndpoints['/
|
|
419
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] =
|
|
420
420
|
async (): Promise<InitSessionResponse> => {
|
|
421
421
|
return new InitSessionResponse({
|
|
422
422
|
sessionId: 'error-session-123',
|
|
@@ -430,7 +430,7 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
430
430
|
|
|
431
431
|
// Verify endpoint accepts empty solution (no retry needed for this test)
|
|
432
432
|
const verifyCalls: Array<{ request: any }> = []
|
|
433
|
-
mockEndpoints['/
|
|
433
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify'] = async (request): Promise<VerifyResponse> => {
|
|
434
434
|
verifyCalls.push({ request })
|
|
435
435
|
return createSuccessVerifyResponse()
|
|
436
436
|
}
|
|
@@ -462,7 +462,7 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
462
462
|
|
|
463
463
|
it('Turnstile solver fails → empty verify → retry → Hashcash succeeds end-to-end', async () => {
|
|
464
464
|
// Set up to require challenge
|
|
465
|
-
mockEndpoints['/
|
|
465
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] =
|
|
466
466
|
async (): Promise<InitSessionResponse> => {
|
|
467
467
|
return new InitSessionResponse({
|
|
468
468
|
sessionId: 'fallback-e2e-session',
|
|
@@ -473,7 +473,7 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
473
473
|
|
|
474
474
|
// First challenge returns Turnstile, second returns Hashcash
|
|
475
475
|
let challengeRequestCount = 0
|
|
476
|
-
mockEndpoints['/
|
|
476
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] = async (): Promise<ChallengeResponse> => {
|
|
477
477
|
challengeRequestCount++
|
|
478
478
|
if (challengeRequestCount === 1) {
|
|
479
479
|
return new ChallengeResponse({
|
|
@@ -495,7 +495,7 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
495
495
|
|
|
496
496
|
// First verify rejects empty solution, second succeeds
|
|
497
497
|
let verifyCount = 0
|
|
498
|
-
mockEndpoints['/
|
|
498
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify'] = async (): Promise<VerifyResponse> => {
|
|
499
499
|
verifyCount++
|
|
500
500
|
if (verifyCount === 1) {
|
|
501
501
|
return new VerifyResponse({ retry: true })
|
|
@@ -544,7 +544,7 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
544
544
|
|
|
545
545
|
it('falls back to Hashcash via verify-retry when mock Turnstile token is rejected', async () => {
|
|
546
546
|
// Set up to require challenge
|
|
547
|
-
mockEndpoints['/
|
|
547
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] =
|
|
548
548
|
async (): Promise<InitSessionResponse> => {
|
|
549
549
|
return new InitSessionResponse({
|
|
550
550
|
sessionId: 'fallback-session-123',
|
|
@@ -556,7 +556,7 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
556
556
|
// First challenge returns Turnstile, second returns Hashcash
|
|
557
557
|
// (backend switches after failed verification)
|
|
558
558
|
let challengeRequestCount = 0
|
|
559
|
-
mockEndpoints['/
|
|
559
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] = async (): Promise<ChallengeResponse> => {
|
|
560
560
|
challengeRequestCount++
|
|
561
561
|
if (challengeRequestCount === 1) {
|
|
562
562
|
return new ChallengeResponse({
|
|
@@ -578,7 +578,7 @@ describe('Challenge Flow Integration Tests', () => {
|
|
|
578
578
|
|
|
579
579
|
// First verify rejects mock token, second succeeds
|
|
580
580
|
let verifyCount = 0
|
|
581
|
-
mockEndpoints['/
|
|
581
|
+
mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify'] = async (): Promise<VerifyResponse> => {
|
|
582
582
|
verifyCount++
|
|
583
583
|
if (verifyCount === 1) {
|
|
584
584
|
return new VerifyResponse({ retry: true })
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** biome-ignore-all assist/source/organizeImports: we want to manually group exports by category */
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @
|
|
4
|
+
* @luxexchange/sessions
|
|
5
5
|
*
|
|
6
6
|
* This is the ONLY public entry point for the Sessions package.
|
|
7
7
|
* All exports must be explicitly listed here.
|
|
@@ -9,16 +9,16 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
// Device ID
|
|
12
|
-
export { createDeviceIdService } from '@
|
|
13
|
-
export type { DeviceIdService } from '@
|
|
14
|
-
//
|
|
15
|
-
export {
|
|
16
|
-
export {
|
|
17
|
-
export type {
|
|
12
|
+
export { createDeviceIdService } from '@luxexchange/sessions/src/device-id/createDeviceIdService'
|
|
13
|
+
export type { DeviceIdService } from '@luxexchange/sessions/src/device-id/types'
|
|
14
|
+
// Uniswap Identifier
|
|
15
|
+
export { createLxIdentifierService } from '@luxexchange/sessions/src/uniswap-identifier/createLxIdentifierService'
|
|
16
|
+
export { lxIdentifierQuery } from '@luxexchange/sessions/src/uniswap-identifier/lxIdentifierQuery'
|
|
17
|
+
export type { LxIdentifierService } from '@luxexchange/sessions/src/uniswap-identifier/types'
|
|
18
18
|
// Session Repository
|
|
19
|
-
export { createSessionRepository } from '@
|
|
20
|
-
export { ChallengeRejectedError } from '@
|
|
21
|
-
export { ChallengeFailureReason, VerifyFailureReason } from '@
|
|
19
|
+
export { createSessionRepository } from '@luxexchange/sessions/src/session-repository/createSessionRepository'
|
|
20
|
+
export { ChallengeRejectedError } from '@luxexchange/sessions/src/session-repository/errors'
|
|
21
|
+
export { ChallengeFailureReason, VerifyFailureReason } from '@luxexchange/sessions/src/session-repository/types'
|
|
22
22
|
export type {
|
|
23
23
|
SessionRepository,
|
|
24
24
|
ChallengeTypeConfig,
|
|
@@ -26,11 +26,11 @@ export type {
|
|
|
26
26
|
TurnstileChallengeData,
|
|
27
27
|
HashCashChallengeData,
|
|
28
28
|
GitHubChallengeData,
|
|
29
|
-
} from '@
|
|
29
|
+
} from '@luxexchange/sessions/src/session-repository/types'
|
|
30
30
|
|
|
31
31
|
// Session Service
|
|
32
|
-
export { createNoopSessionService } from '@
|
|
33
|
-
export { createSessionService } from '@
|
|
32
|
+
export { createNoopSessionService } from '@luxexchange/sessions/src/session-service/createNoopSessionService'
|
|
33
|
+
export { createSessionService } from '@luxexchange/sessions/src/session-service/createSessionService'
|
|
34
34
|
export type {
|
|
35
35
|
SessionService,
|
|
36
36
|
InitSessionResponse,
|
|
@@ -38,74 +38,74 @@ export type {
|
|
|
38
38
|
ChallengeResponse,
|
|
39
39
|
VerifySessionRequest,
|
|
40
40
|
VerifySessionResponse,
|
|
41
|
-
} from '@
|
|
41
|
+
} from '@luxexchange/sessions/src/session-service/types'
|
|
42
42
|
|
|
43
43
|
// Session Storage
|
|
44
|
-
export { createSessionStorage } from '@
|
|
45
|
-
export type { SessionStorage, SessionState } from '@
|
|
44
|
+
export { createSessionStorage } from '@luxexchange/sessions/src/session-storage/createSessionStorage'
|
|
45
|
+
export type { SessionStorage, SessionState } from '@luxexchange/sessions/src/session-storage/types'
|
|
46
46
|
|
|
47
47
|
// Session Client
|
|
48
|
-
export { createSessionClient } from '@
|
|
49
|
-
export type { SessionServiceClient } from '@
|
|
48
|
+
export { createSessionClient } from '@luxexchange/sessions/src/session-repository/createSessionClient'
|
|
49
|
+
export type { SessionServiceClient } from '@luxexchange/sessions/src/session-repository/createSessionClient'
|
|
50
50
|
|
|
51
51
|
// Session Initialization
|
|
52
|
-
export { createSessionInitializationService } from '@
|
|
52
|
+
export { createSessionInitializationService } from '@luxexchange/sessions/src/session-initialization/createSessionInitializationService'
|
|
53
53
|
export {
|
|
54
54
|
SessionError,
|
|
55
55
|
MaxChallengeRetriesError,
|
|
56
56
|
NoSolverAvailableError,
|
|
57
|
-
} from '@
|
|
57
|
+
} from '@luxexchange/sessions/src/session-initialization/sessionErrors'
|
|
58
58
|
export type {
|
|
59
59
|
SessionInitializationService,
|
|
60
60
|
SessionInitOptions,
|
|
61
61
|
SessionInitResult,
|
|
62
62
|
SessionInitAnalytics,
|
|
63
|
-
} from '@
|
|
63
|
+
} from '@luxexchange/sessions/src/session-initialization/createSessionInitializationService'
|
|
64
64
|
|
|
65
65
|
// Challenge Solvers
|
|
66
|
-
export { createChallengeSolverService } from '@
|
|
67
|
-
export { createTurnstileMockSolver } from '@
|
|
68
|
-
export { createHashcashMockSolver } from '@
|
|
69
|
-
export { createNoneMockSolver } from '@
|
|
70
|
-
export { createTurnstileSolver } from '@
|
|
71
|
-
export { createHashcashSolver } from '@
|
|
72
|
-
export { createWorkerHashcashSolver } from '@
|
|
66
|
+
export { createChallengeSolverService } from '@luxexchange/sessions/src/challenge-solvers/createChallengeSolverService'
|
|
67
|
+
export { createTurnstileMockSolver } from '@luxexchange/sessions/src/challenge-solvers/createTurnstileMockSolver'
|
|
68
|
+
export { createHashcashMockSolver } from '@luxexchange/sessions/src/challenge-solvers/createHashcashMockSolver'
|
|
69
|
+
export { createNoneMockSolver } from '@luxexchange/sessions/src/challenge-solvers/createNoneMockSolver'
|
|
70
|
+
export { createTurnstileSolver } from '@luxexchange/sessions/src/challenge-solvers/createTurnstileSolver'
|
|
71
|
+
export { createHashcashSolver } from '@luxexchange/sessions/src/challenge-solvers/createHashcashSolver'
|
|
72
|
+
export { createWorkerHashcashSolver } from '@luxexchange/sessions/src/challenge-solvers/hashcash/createWorkerHashcashSolver'
|
|
73
73
|
export {
|
|
74
74
|
TurnstileScriptLoadError,
|
|
75
75
|
TurnstileApiNotAvailableError,
|
|
76
76
|
TurnstileTimeoutError,
|
|
77
77
|
TurnstileError,
|
|
78
78
|
TurnstileTokenExpiredError,
|
|
79
|
-
} from '@
|
|
79
|
+
} from '@luxexchange/sessions/src/challenge-solvers/turnstileErrors'
|
|
80
80
|
export type {
|
|
81
81
|
ChallengeSolver,
|
|
82
82
|
ChallengeSolverService,
|
|
83
83
|
ChallengeData,
|
|
84
84
|
TurnstileScriptOptions,
|
|
85
|
-
} from '@
|
|
85
|
+
} from '@luxexchange/sessions/src/challenge-solvers/types'
|
|
86
86
|
export type {
|
|
87
87
|
CreateTurnstileSolverContext,
|
|
88
88
|
TurnstileSolveAnalytics,
|
|
89
|
-
} from '@
|
|
89
|
+
} from '@luxexchange/sessions/src/challenge-solvers/createTurnstileSolver'
|
|
90
90
|
export type {
|
|
91
91
|
CreateHashcashWorkerChannelContext,
|
|
92
92
|
HashcashWorkerChannel,
|
|
93
93
|
HashcashWorkerChannelFactory,
|
|
94
|
-
} from '@
|
|
95
|
-
export { createHashcashWorkerChannel } from '@
|
|
96
|
-
export { createHashcashMultiWorkerChannel } from '@
|
|
97
|
-
export type { MultiWorkerConfig } from '@
|
|
98
|
-
export type { CreateWorkerHashcashSolverContext } from '@
|
|
94
|
+
} from '@luxexchange/sessions/src/challenge-solvers/hashcash/worker/types'
|
|
95
|
+
export { createHashcashWorkerChannel } from '@luxexchange/sessions/src/challenge-solvers/hashcash/worker/createHashcashWorkerChannel'
|
|
96
|
+
export { createHashcashMultiWorkerChannel } from '@luxexchange/sessions/src/challenge-solvers/hashcash/worker/createHashcashMultiWorkerChannel'
|
|
97
|
+
export type { MultiWorkerConfig } from '@luxexchange/sessions/src/challenge-solvers/hashcash/worker/createHashcashMultiWorkerChannel'
|
|
98
|
+
export type { CreateWorkerHashcashSolverContext } from '@luxexchange/sessions/src/challenge-solvers/hashcash/createWorkerHashcashSolver'
|
|
99
99
|
export type {
|
|
100
100
|
CreateHashcashSolverContext,
|
|
101
101
|
HashcashSolveAnalytics,
|
|
102
|
-
} from '@
|
|
102
|
+
} from '@luxexchange/sessions/src/challenge-solvers/createHashcashSolver'
|
|
103
103
|
|
|
104
|
-
export { ChallengeType } from '@
|
|
104
|
+
export { ChallengeType } from '@luxexchange/sessions/src/session-service/types'
|
|
105
105
|
|
|
106
106
|
// OAuth Service
|
|
107
|
-
export { createOAuthService } from '@
|
|
108
|
-
export type { CreateOAuthServiceContext } from '@
|
|
107
|
+
export { createOAuthService } from '@luxexchange/sessions/src/oauth-service/createOAuthService'
|
|
108
|
+
export type { CreateOAuthServiceContext } from '@luxexchange/sessions/src/oauth-service/createOAuthService'
|
|
109
109
|
export type {
|
|
110
110
|
OAuthService,
|
|
111
111
|
OAuthInitiationResult,
|
|
@@ -114,24 +114,26 @@ export type {
|
|
|
114
114
|
OAuthInitiateParams,
|
|
115
115
|
OAuthVerifyParams,
|
|
116
116
|
OAuthUserInfo,
|
|
117
|
-
} from '@
|
|
117
|
+
} from '@luxexchange/sessions/src/oauth-service/types'
|
|
118
118
|
|
|
119
119
|
// Performance Tracking
|
|
120
|
-
export type { PerformanceTracker } from '@
|
|
120
|
+
export type { PerformanceTracker } from '@luxexchange/sessions/src/performance/types'
|
|
121
121
|
export {
|
|
122
122
|
createPerformanceTracker,
|
|
123
123
|
PERFORMANCE_TRACKING_DISABLED,
|
|
124
|
-
} from '@
|
|
125
|
-
export type { CreatePerformanceTrackerContext } from '@
|
|
126
|
-
export { createNoopPerformanceTracker } from '@
|
|
124
|
+
} from '@luxexchange/sessions/src/performance/createPerformanceTracker'
|
|
125
|
+
export type { CreatePerformanceTrackerContext } from '@luxexchange/sessions/src/performance/createPerformanceTracker'
|
|
126
|
+
export { createNoopPerformanceTracker } from '@luxexchange/sessions/src/performance/createNoopPerformanceTracker'
|
|
127
127
|
|
|
128
128
|
// Test utilities (for integration testing)
|
|
129
129
|
export {
|
|
130
130
|
InMemorySessionStorage,
|
|
131
131
|
InMemoryDeviceIdService,
|
|
132
|
-
|
|
133
|
-
} from '@
|
|
132
|
+
InMemoryLxIdentifierService,
|
|
133
|
+
} from '@luxexchange/sessions/src/test-utils'
|
|
134
134
|
export {
|
|
135
135
|
createCookieJar,
|
|
136
136
|
createLocalCookieTransport,
|
|
137
|
-
} from '@
|
|
137
|
+
} from '@luxexchange/sessions/src/test-utils/createLocalCookieTransport'
|
|
138
|
+
|
|
139
|
+
export const luxIdentifierQuery = lxIdentifierQuery
|
|
@@ -5,8 +5,8 @@ import type {
|
|
|
5
5
|
OAuthService,
|
|
6
6
|
OAuthVerificationResult,
|
|
7
7
|
OAuthVerifyParams,
|
|
8
|
-
} from '@
|
|
9
|
-
import type { SessionRepository } from '@
|
|
8
|
+
} from '@luxexchange/sessions/src/oauth-service/types'
|
|
9
|
+
import type { SessionRepository } from '@luxexchange/sessions/src/session-repository/types'
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Context (dependencies) for creating an OAuthService
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChallengeType } from '@
|
|
1
|
+
import { ChallengeType } from '@luxamm/client-platform-service/dist/uniswap/platformservice/v1/sessionService_pb'
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Result from initiating an OAuth flow
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PERFORMANCE_TRACKING_DISABLED } from '@
|
|
2
|
-
import type { PerformanceTracker } from '@
|
|
1
|
+
import { PERFORMANCE_TRACKING_DISABLED } from '@luxexchange/sessions/src/performance/createPerformanceTracker'
|
|
2
|
+
import type { PerformanceTracker } from '@luxexchange/sessions/src/performance/types'
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Creates a noop performance tracker that always returns the disabled sentinel.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PerformanceTracker } from '@
|
|
1
|
+
import type { PerformanceTracker } from '@luxexchange/sessions/src/performance/types'
|
|
2
2
|
|
|
3
3
|
/** Sentinel value indicating performance tracking is disabled */
|
|
4
4
|
export const PERFORMANCE_TRACKING_DISABLED = -1
|
package/src/performance/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable check-file/no-index */
|
|
2
|
-
export type { CreatePerformanceTrackerContext } from '@
|
|
2
|
+
export type { CreatePerformanceTrackerContext } from '@luxexchange/sessions/src/performance/createPerformanceTracker'
|
|
3
3
|
export {
|
|
4
4
|
createPerformanceTracker,
|
|
5
5
|
PERFORMANCE_TRACKING_DISABLED,
|
|
6
|
-
} from '@
|
|
7
|
-
export type { PerformanceTracker } from '@
|
|
6
|
+
} from '@luxexchange/sessions/src/performance/createPerformanceTracker'
|
|
7
|
+
export type { PerformanceTracker } from '@luxexchange/sessions/src/performance/types'
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type { PerformanceTracker } from '@
|
|
2
|
-
import { createSessionInitializationService } from '@
|
|
3
|
-
import { ChallengeType } from '@
|
|
1
|
+
import type { PerformanceTracker } from '@luxexchange/sessions/src/performance/types'
|
|
2
|
+
import { createSessionInitializationService } from '@luxexchange/sessions/src/session-initialization/createSessionInitializationService'
|
|
3
|
+
import { ChallengeType } from '@luxexchange/sessions/src/session-service/types'
|
|
4
4
|
import {
|
|
5
5
|
createMockChallengeSolverService,
|
|
6
6
|
createMockSessionService,
|
|
7
7
|
TestScenarios,
|
|
8
|
-
} from '@
|
|
8
|
+
} from '@luxexchange/sessions/src/test-utils/mocks'
|
|
9
9
|
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
10
10
|
|
|
11
11
|
// Mock performance tracker for testing
|