Skip to content

Commit 98f2577

Browse files
y-lakhdarCopilot
andauthored
chore(headless-ssr): apply token fix to search (#6422)
Co-authored-by: Copilot <[email protected]>
1 parent 97c0649 commit 98f2577

File tree

6 files changed

+85
-5
lines changed

6 files changed

+85
-5
lines changed

packages/headless/src/ssr-next/search/engine/search-engine.ssr.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/**
22
* Utility functions to be used for Server Side Rendering.
33
*/
4+
import {createAccessTokenManager} from '../../common/access-token-manager.js';
45
import {defineSearchParameterManager} from '../controllers/search-parameter-manager/headless-search-parameter-manager.ssr.js';
56
import {hydratedStaticStateFactory} from '../factories/hydrated-state-factory.js';
67
import {fetchStaticStateFactory} from '../factories/static-state-factory.js';
@@ -43,13 +44,23 @@ export function defineSearchEngine<
4344
): SearchEngineDefinition<SSRSearchEngine, TControllerDefinitions> {
4445
const {controllers: controllerDefinitions, ...engineOptions} = options;
4546

46-
const getOptions = () => engineOptions;
47+
const tokenManager = createAccessTokenManager(
48+
engineOptions.configuration.accessToken
49+
);
50+
51+
const onAccessTokenUpdate = (
52+
updateCallback: (accessToken: string) => void
53+
) => {
54+
tokenManager.registerCallback(updateCallback);
55+
};
56+
57+
const definitionOptions = {...engineOptions, onAccessTokenUpdate};
4758

48-
const getAccessToken = () => engineOptions.configuration.accessToken;
59+
const getAccessToken = () => tokenManager.getAccessToken();
4960

5061
const setAccessToken = (accessToken: string) => {
51-
// TODO: KIT-5150 - Apply `setAccessToken` propagation fix for SSR search
5262
engineOptions.configuration.accessToken = accessToken;
63+
tokenManager.setAccessToken(accessToken);
5364
};
5465

5566
const augmentedControllerDefinition = {
@@ -59,12 +70,12 @@ export function defineSearchEngine<
5970

6071
const fetchStaticState = fetchStaticStateFactory<TControllerDefinitions>(
6172
augmentedControllerDefinition,
62-
getOptions()
73+
definitionOptions
6374
);
6475

6576
const hydrateStaticState = hydratedStaticStateFactory<TControllerDefinitions>(
6677
augmentedControllerDefinition,
67-
getOptions()
78+
definitionOptions
6879
);
6980

7081
return {

packages/headless/src/ssr-next/search/factories/build-factory.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
buildSearchEngine,
44
type SearchEngineOptions,
55
} from '../../../app/search-engine/search-engine.js';
6+
import {loadConfigurationActions} from '../../../features/configuration/configuration-actions-loader.js';
67
import {createWaitForActionMiddleware} from '../../../utils/utils.js';
78
import {buildControllerDefinitions} from '../controller-utils.js';
89
import type {SearchCompletedAction, SSRSearchEngine} from '../types/build.js';
@@ -63,6 +64,19 @@ export const buildFactory =
6364

6465
const engine = buildSSRSearchEngine(engineOptions);
6566

67+
const updateEngineConfiguration = (accessToken: string) => {
68+
const {updateBasicConfiguration} = loadConfigurationActions(engine);
69+
engine.dispatch(
70+
updateBasicConfiguration({
71+
accessToken,
72+
})
73+
);
74+
};
75+
76+
if (options.onAccessTokenUpdate) {
77+
options.onAccessTokenUpdate(updateEngineConfiguration);
78+
}
79+
6680
const controllers = buildControllerDefinitions({
6781
definitionsMap: controllerDefinitions,
6882
engine,

packages/headless/src/ssr-next/search/types/engine.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ export type SearchEngineDefinitionOptions<
3737
* The controllers to initialize with the search engine.
3838
*/
3939
controllers?: ValidateControllerNames<TControllers>;
40+
/**
41+
* Callback invoked when the access token changes.
42+
*/
43+
onAccessTokenUpdate?: (updateCallback: (token: string) => void) => void;
4044
};
4145

4246
export interface SearchEngineDefinition<

packages/headless/src/ssr/common/types/engine.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,17 @@ export interface EngineDefinition<
7878
InferControllersMapFromDefinition<TControllers>,
7979
InferControllerPropsMapFromDefinitions<TControllers>
8080
>;
81+
82+
/**
83+
* Returns the access token.
84+
*/
85+
getAccessToken: () => string;
86+
87+
/**
88+
* Updates the access token.
89+
* @param accessToken - The access token to update.
90+
*/
91+
setAccessToken: (accessToken: string) => void;
8192
}
8293

8394
/**

packages/headless/src/ssr/search/engine/search-engine.ssr.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,5 +293,18 @@ describe('SSR', () => {
293293
});
294294
});
295295
});
296+
297+
describe('access token management', () => {
298+
it('#getAccessToken should return the access token', () => {
299+
expect(engineDefinition.getAccessToken()).toBe(
300+
getSampleSearchEngineConfiguration().accessToken
301+
);
302+
});
303+
304+
it('#setAccessToken should update the access token', () => {
305+
engineDefinition.setAccessToken('new-access-token');
306+
expect(engineDefinition.getAccessToken()).toBe('new-access-token');
307+
});
308+
});
296309
});
297310
});

packages/headless/src/ssr/search/engine/search-engine.ssr.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import {
1111
} from '../../../app/search-engine/search-engine.js';
1212
import type {Controller} from '../../../controllers/controller/headless-controller.js';
1313
import type {LegacySearchAction} from '../../../features/analytics/analytics-utils.js';
14+
import {loadConfigurationActions} from '../../../features/configuration/configuration-actions-loader.js';
1415
import {createWaitForActionMiddleware} from '../../../utils/utils.js';
16+
import {createAccessTokenManager} from '../../common/access-token-manager.js';
1517
import {augmentPreprocessRequestWithForwardedFor} from '../../common/augment-preprocess-request.js';
1618
import {
1719
buildControllerDefinitions,
@@ -123,6 +125,10 @@ export function defineSearchEngine<
123125
type HydrateStaticStateFromBuildResultParameters =
124126
Parameters<HydrateStaticStateFromBuildResultFunction>;
125127

128+
const tokenManager = createAccessTokenManager(
129+
engineOptions.configuration.accessToken
130+
);
131+
126132
const getOptions = () => {
127133
return engineOptions;
128134
};
@@ -133,6 +139,13 @@ export function defineSearchEngine<
133139
engineOptions.navigatorContextProvider = navigatorContextProvider;
134140
};
135141

142+
const getAccessToken = () => tokenManager.getAccessToken();
143+
144+
const setAccessToken = (accessToken: string) => {
145+
engineOptions.configuration.accessToken = accessToken;
146+
tokenManager.setAccessToken(accessToken);
147+
};
148+
136149
const build: BuildFunction = async (...[buildOptions]: BuildParameters) => {
137150
const logger = buildLogger(options.loggerOptions);
138151
if (!getOptions().navigatorContextProvider) {
@@ -145,6 +158,18 @@ export function defineSearchEngine<
145158
? await buildOptions.extend(getOptions())
146159
: getOptions()
147160
);
161+
162+
const updateEngineConfiguration = (accessToken: string) => {
163+
const {updateBasicConfiguration} = loadConfigurationActions(engine);
164+
engine.dispatch(
165+
updateBasicConfiguration({
166+
accessToken,
167+
})
168+
);
169+
};
170+
171+
tokenManager.registerCallback(updateEngineConfiguration);
172+
148173
const controllers = buildControllerDefinitions({
149174
definitionsMap: (controllerDefinitions ?? {}) as TControllerDefinitions,
150175
engine,
@@ -226,5 +251,7 @@ export function defineSearchEngine<
226251
fetchStaticState,
227252
hydrateStaticState,
228253
setNavigatorContextProvider,
254+
getAccessToken,
255+
setAccessToken,
229256
};
230257
}

0 commit comments

Comments
 (0)