Skip to content

Commit 7c92d24

Browse files
authored
Merge pull request #544 from ForgeRock/SDKS-4815-fix-middleware
SDKS-4815: Fix journey client middleware
2 parents 8ea79b4 + 29220e2 commit 7c92d24

9 files changed

Lines changed: 45 additions & 53 deletions

File tree

.changeset/hip-lands-call.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@forgerock/journey-client': patch
3+
---
4+
5+
Removed duplicate middleware config and added support for typed middleware

e2e/journey-app/main.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ const searchParams = new URLSearchParams(qs);
2121
const config = serverConfigs[searchParams.get('clientId') || 'basic'];
2222

2323
const journeyName = searchParams.get('journey') ?? 'UsernamePassword';
24-
let requestMiddleware: RequestMiddleware[] = [];
24+
let requestMiddleware: RequestMiddleware<'JOURNEY_START' | 'JOURNEY_NEXT' | 'JOURNEY_TERMINATE'>[] =
25+
[];
2526

2627
if (searchParams.get('middleware') === 'true') {
2728
requestMiddleware = [
@@ -30,10 +31,12 @@ if (searchParams.get('middleware') === 'true') {
3031
case 'JOURNEY_START':
3132
req.url.searchParams.set('start-authenticate-middleware', 'start-authentication');
3233
req.headers.append('x-start-authenticate-middleware', 'start-authentication');
34+
req.headers?.set('Accept-Language', 'xx-XX');
3335
break;
3436
case 'JOURNEY_NEXT':
3537
req.url.searchParams.set('authenticate-middleware', 'authentication');
3638
req.headers.append('x-authenticate-middleware', 'authentication');
39+
req.headers?.set('Accept-Language', 'yy-YY');
3740
break;
3841
}
3942
next();
@@ -43,6 +46,7 @@ if (searchParams.get('middleware') === 'true') {
4346
case 'JOURNEY_TERMINATE':
4447
req.url.searchParams.set('end-session-middleware', 'end-session');
4548
req.headers.append('x-end-session-middleware', 'end-session');
49+
req.headers?.set('Accept-Language', 'zz-ZZ');
4650
break;
4751
}
4852
next();

e2e/journey-suites/src/request-middleware.test.ts

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { expect, test } from '@playwright/test';
99
import { asyncEvents } from './utils/async-events.js';
1010
import { username, password } from './utils/demo-user.js';
1111

12-
test.skip('Test happy paths on test page', async ({ page }) => {
12+
test('Test middleware on test page', async ({ page }) => {
1313
const { clickButton, navigate } = asyncEvents(page);
1414
await navigate('/?middleware=true&journey=Login');
1515

@@ -24,7 +24,7 @@ test.skip('Test happy paths on test page', async ({ page }) => {
2424
});
2525

2626
page.on('request', async (req) => {
27-
networkArray.push(`${new URL(req.url()).pathname}, ${req.resourceType()}`);
27+
networkArray.push(req.url().toString());
2828
});
2929

3030
page.on('request', async (req) => {
@@ -46,17 +46,33 @@ test.skip('Test happy paths on test page', async ({ page }) => {
4646
await clickButton('Logout', '/authenticate');
4747

4848
// Test assertions
49-
// test URL query parameters added to URL on networkArray
5049

51-
expect(networkArray).toContain('start-authenticate-middleware, fetch');
52-
expect(networkArray).toContain('authenticate-middleware, fetch');
53-
expect(networkArray).toContain('end-session-middleware, fetch');
50+
// Test URL query parameters added to URL on networkArray
51+
const startRequest = networkArray.find((url) => url.includes('start-authenticate-middleware'));
52+
const nextRequest = networkArray.find((url) => url.includes('authenticate-middleware'));
53+
const endRequest = networkArray.find((url) => url.includes('end-session-middleware'));
5454

55-
expect(
56-
headerArray.find((headers) => headers.get('x-start-authenticate-middleware')),
57-
).toBeTruthy();
58-
expect(headerArray.find((headers) => headers.get('x-authenticate-middleware'))).toBeTruthy();
59-
expect(headerArray.find((headers) => headers.get('x-end-session-middleware'))).toBeTruthy();
55+
expect(startRequest?.includes('start-authenticate-middleware=start-authentication')).toBeTruthy();
56+
expect(nextRequest?.includes('authenticate-middleware=authentication')).toBeTruthy();
57+
expect(endRequest?.includes('end-session-middleware=end-session')).toBeTruthy();
58+
59+
// Check for addition of custom headers
60+
const startHeader = headerArray.find((headers) => headers.get('x-start-authenticate-middleware'));
61+
const nextHeader = headerArray.find((headers) => headers.get('x-authenticate-middleware'));
62+
const endHeader = headerArray.find((headers) => headers.get('x-end-session-middleware'));
63+
64+
expect(startHeader?.get('x-start-authenticate-middleware')).toBe('start-authentication');
65+
expect(nextHeader?.get('x-authenticate-middleware')).toBe('authentication');
66+
expect(endHeader?.get('x-end-session-middleware')).toBe('end-session');
67+
68+
// Check that Accept-Language header was modified from default en-US locale and set to correct value in each middleware
69+
expect(startHeader?.get('Accept-Language')).not.toContain('en-US');
70+
expect(nextHeader?.get('Accept-Language')).not.toContain('en-US');
71+
expect(endHeader?.get('Accept-Language')).not.toContain('en-US');
72+
73+
expect(startHeader?.get('Accept-Language')).toBe('xx-XX');
74+
expect(nextHeader?.get('Accept-Language')).toBe('yy-YY');
75+
expect(endHeader?.get('Accept-Language')).toBe('zz-ZZ');
6076

6177
expect(messageArray.includes('Journey completed successfully')).toBe(true);
6278
expect(messageArray.includes('Logout successful')).toBe(true);

packages/journey-client/src/lib/client.store.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ import {
1414
} from '@forgerock/sdk-utilities';
1515

1616
import type { GenericError } from '@forgerock/sdk-types';
17-
18-
import type { RequestMiddleware } from '@forgerock/sdk-request-middleware';
17+
import type { ActionTypes, RequestMiddleware } from '@forgerock/sdk-request-middleware';
1918
import type { Step } from '@forgerock/sdk-types';
2019

2120
import { createJourneyStore } from './client.store.utils.js';
@@ -28,7 +27,7 @@ import { wellknownApi } from './wellknown.api.js';
2827
import type { JourneyStep } from './step.utils.js';
2928
import type { JourneyClientConfig } from './config.types.js';
3029
import type { RedirectCallback } from './callbacks/redirect-callback.js';
31-
import { NextOptions, StartParam, ResumeOptions } from './interfaces.js';
30+
import type { NextOptions, StartParam, ResumeOptions } from './interfaces.js';
3231
import type { JourneyLoginFailure } from './login-failure.utils.js';
3332
import type { JourneyLoginSuccess } from './login-success.utils.js';
3433

@@ -78,13 +77,13 @@ export interface JourneyClient {
7877
* }
7978
* ```
8079
*/
81-
export async function journey({
80+
export async function journey<ActionType extends ActionTypes = ActionTypes>({
8281
config,
8382
requestMiddleware,
8483
logger,
8584
}: {
8685
config: JourneyClientConfig;
87-
requestMiddleware?: RequestMiddleware[];
86+
requestMiddleware?: RequestMiddleware<ActionType>[];
8887
logger?: {
8988
level: LogLevel;
9089
custom?: CustomLogger;
@@ -116,7 +115,6 @@ export async function journey({
116115
store.dispatch(
117116
configSlice.actions.set({
118117
wellknownResponse: wellknownResponse,
119-
middleware: config.middleware ?? requestMiddleware,
120118
}),
121119
);
122120

packages/journey-client/src/lib/client.store.utils.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77

88
import { logger as loggerFn } from '@forgerock/sdk-logger';
9-
import { RequestMiddleware } from '@forgerock/sdk-request-middleware';
9+
import { ActionTypes, RequestMiddleware } from '@forgerock/sdk-request-middleware';
1010
import { combineReducers, configureStore } from '@reduxjs/toolkit';
1111

1212
import { configSlice } from './config.slice.js';
@@ -19,11 +19,11 @@ const rootReducer = combineReducers({
1919
[wellknownApi.reducerPath]: wellknownApi.reducer,
2020
});
2121

22-
export const createJourneyStore = ({
22+
export const createJourneyStore = <ActionType extends ActionTypes>({
2323
requestMiddleware,
2424
logger,
2525
}: {
26-
requestMiddleware?: RequestMiddleware[];
26+
requestMiddleware?: RequestMiddleware<ActionType, unknown>[];
2727
logger?: ReturnType<typeof loggerFn>;
2828
}) => {
2929
return configureStore({

packages/journey-client/src/lib/config.slice.test.ts

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { describe, it, expect } from 'vitest';
99
import { configSlice } from './config.slice.js';
1010

1111
import type { WellknownResponse } from '@forgerock/sdk-types';
12-
import type { RequestMiddleware } from '@forgerock/sdk-request-middleware';
1312
import type { ResolvedConfig } from './config.slice.js';
1413

1514
function createMockWellknown(overrides: Partial<WellknownResponse> = {}): WellknownResponse {
@@ -86,21 +85,4 @@ describe('journey-client config.slice', () => {
8685
expect(state.error?.message).toContain('authorization_endpoint');
8786
});
8887
});
89-
90-
describe('configSlice_Middleware_StoresMiddleware', () => {
91-
it('should store the provided middleware array', () => {
92-
// Arrange
93-
const mockMiddleware: RequestMiddleware[] = [(_req, _action, next) => next()];
94-
const payload: ResolvedConfig = {
95-
wellknownResponse: createMockWellknown(),
96-
middleware: mockMiddleware,
97-
};
98-
99-
// Act
100-
const state = configSlice.reducer(undefined, configSlice.actions.set(payload));
101-
102-
// Assert
103-
expect(state.middleware).toEqual(mockMiddleware);
104-
});
105-
});
10688
});

packages/journey-client/src/lib/config.slice.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
*/
77

88
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
9-
109
import type { WellknownResponse } from '@forgerock/sdk-types';
11-
import type { RequestMiddleware } from '@forgerock/sdk-request-middleware';
12-
1310
import type { InternalJourneyClientConfig } from './config.types.js';
1411
import { convertWellknown } from './wellknown.utils.js';
1512

@@ -20,12 +17,10 @@ import { convertWellknown } from './wellknown.utils.js';
2017
*/
2118
export interface ResolvedConfig {
2219
wellknownResponse: WellknownResponse;
23-
middleware?: Array<RequestMiddleware>;
2420
}
2521

2622
const initialState: InternalJourneyClientConfig = {
2723
serverConfig: { baseUrl: '', paths: { authenticate: '', sessions: '' } },
28-
middleware: [],
2924
};
3025

3126
/**
@@ -48,7 +43,6 @@ export const configSlice = createSlice({
4843
state.serverConfig = wellknown;
4944
state.error = undefined;
5045
}
51-
state.middleware = action.payload.middleware;
5246
},
5347
},
5448
});

packages/journey-client/src/lib/config.types.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
*/
77

88
import type { GenericError } from '@forgerock/sdk-types';
9-
import type { RequestMiddleware } from '@forgerock/sdk-request-middleware';
109
import type { ResolvedServerConfig } from './wellknown.utils.js';
1110

1211
/**
@@ -34,8 +33,6 @@ export interface JourneyServerConfig {
3433
*/
3534
export interface JourneyClientConfig {
3635
serverConfig: JourneyServerConfig;
37-
/** Optional middleware for request customization */
38-
middleware?: Array<RequestMiddleware>;
3936
}
4037

4138
/**
@@ -46,9 +43,5 @@ export interface JourneyClientConfig {
4643
*/
4744
export interface InternalJourneyClientConfig {
4845
serverConfig: ResolvedServerConfig;
49-
/** Optional middleware for request customization */
50-
middleware?: Array<RequestMiddleware>;
5146
error?: GenericError;
5247
}
53-
54-
export type { RequestMiddleware };

packages/journey-client/src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
// Re-export types from internal packages that consumers need
99
export type { LogLevel, CustomLogger } from '@forgerock/sdk-logger';
10-
export type { RequestMiddleware } from '@forgerock/sdk-request-middleware';
10+
export type { RequestMiddleware, ActionTypes } from '@forgerock/sdk-request-middleware';
1111
export type {
1212
Step,
1313
Callback,

0 commit comments

Comments
 (0)