Skip to content

Commit c4ac344

Browse files
Follow up - Engage upgrade (#1633)
* refactor middleware, upgrade engage to latest * update changelog * preserve cookie response * Update packages/sitecore-jss-nextjs/src/middleware/personalize-middleware.ts Co-authored-by: Adam Brauer <[email protected]> * fix test related to cookies --------- Co-authored-by: Adam Brauer <[email protected]>
1 parent 6540fae commit c4ac344

File tree

6 files changed

+51
-29
lines changed

6 files changed

+51
-29
lines changed

CHANGELOG.md

+10-5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ Our versioning strategy is as follows:
2323
* `[templates/nextjs-sxa]` Fix shown horizontal scrollbar in EE mode. ([#1625](https://github.com/Sitecore/jss/pull/1625)), ([#1626](https://github.com/Sitecore/jss/pull/1626))
2424
* `[sitecore-jss-nextjs]` Fix issue when redirects works each every other times. ([#1629](https://github.com/Sitecore/jss/pull/1629))
2525

26+
## 21.5.0
27+
28+
### 🐛 Bug Fixes
29+
30+
* `[templates/nextjs-personalize]` Fix cookie domain for localhost ([#1609](https://github.com/Sitecore/jss/pull/1609))
31+
32+
### 🛠 Breaking Changes
33+
34+
* `[templates/nextjs]` `[sitecore-jss-nextjs]` Upgrade of @sitecore/engage to 1.4.0, now this dependency has been added as a peer dependency to @sitecore-jss-nextjs package in order to replace the existing CDP service in the @sitecore-jss/sitecore-jss with the new functions/features introduced in the engage SDK. ([#1609](https://github.com/Sitecore/jss/pull/1609)) ([#1633](https://github.com/Sitecore/jss/pull/1633))
35+
2636
## 21.4.0
2737

2838
### 🎉 New Features & Improvements
@@ -68,14 +78,9 @@ Our versioning strategy is as follows:
6878
* `[templates/nextjs-sxa]` Don't let Image component wrap <img> with <a> tag when TargetUrl is not configured. ([#1593](https://github.com/Sitecore/jss/issues/1593))
6979
* `[templates/nextjs]` Next config header plugin for CORS. ([#1597](https://github.com/Sitecore/jss/pull/1597))
7080
* `[templates/nextjs]` Ensure dictionary data is only fetched when layout data is present for a route ([#1608](https://github.com/Sitecore/jss/pull/1608))
71-
* `[templates/nextjs-personalize]` Fix cookie domain for localhost ([#1609](https://github.com/Sitecore/jss/pull/1609))
7281
* `[sitecore-jss-react-forms]` Form should be blocked while submit is in progress to avoid submit spam ([#1611](https://github.com/Sitecore/jss/pull/1611))
7382
* `[templates/nextjs]` Fix linting errors, fix type error by upgrading @react/types to v18.2.22 ([#1613](https://github.com/Sitecore/jss/pull/1613))
7483

75-
### 🛠 Breaking Changes
76-
77-
* `[templates/nextjs]` `[sitecore-jss-nextjs]` Upgrade @sitecore/engage to 1.4.0 also, this dependency has been added to @sitecore-jss-nextjs package to make use of the latest features from the SDK. ([#1609](https://github.com/Sitecore/jss/pull/1609))
78-
7984
## 21.3.1
8085

8186
### 🐛 Bug Fixes
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"dependencies": {
3-
"@sitecore/engage": "^1.4.0"
3+
"@sitecore/engage": "^1.4.1"
44
}
55
}

packages/sitecore-jss-nextjs/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
"url": "https://github.com/sitecore/jss/issues"
3131
},
3232
"devDependencies": {
33-
"@sitecore/engage": "^1.4.0",
33+
"@sitecore/engage": "^1.4.1",
3434
"@types/chai": "^4.3.4",
3535
"@types/chai-as-promised": "^7.1.5",
3636
"@types/chai-string": "^1.4.2",
@@ -66,7 +66,7 @@
6666
"typescript": "~4.9.4"
6767
},
6868
"peerDependencies": {
69-
"@sitecore/engage": "^1.4.0",
69+
"@sitecore/engage": "^1.4.1",
7070
"next": "^13.4.16",
7171
"react": "^18.2.0",
7272
"react-dom": "^18.2.0"

packages/sitecore-jss-nextjs/src/middleware/personalize-middleware.test.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ describe('PersonalizeMiddleware', () => {
114114
get(key) {
115115
return { value: res.cookies[key] };
116116
},
117+
getAll() {
118+
return Object.keys(res.cookies).map((key) => ({ name: key, value: res.cookies[key] }));
119+
},
117120
...props.cookieValues,
118121
},
119122
headers: {
@@ -799,7 +802,7 @@ describe('PersonalizeMiddleware', () => {
799802

800803
const finalRes = await middleware.getHandler()(req, res);
801804

802-
expect(engageServer.called).to.be.true;
805+
expect(engageServer.called).to.be.false;
803806

804807
expect(getPersonalizeInfo.called).to.be.true;
805808
expect(errorSpy.getCall(0).calledWith('Personalize middleware failed:')).to.be.true;

packages/sitecore-jss-nextjs/src/middleware/personalize-middleware.ts

+28-14
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,18 @@ export class PersonalizeMiddleware extends MiddlewareBase {
101101
};
102102
}
103103

104-
protected initializeEngageServer(site: SiteInfo, language: string): EngageServer {
104+
protected initializeEngageServer(
105+
hostName: string,
106+
site: SiteInfo,
107+
language: string
108+
): EngageServer {
105109
const engageServer = initServer({
106110
clientKey: this.config.cdpConfig.clientKey,
107111
targetURL: this.config.cdpConfig.endpoint,
108112
pointOfSale: this.config.getPointOfSale
109113
? this.config.getPointOfSale(site, language)
110114
: PosResolver.resolve(site, language),
115+
cookieDomain: hostName,
111116
forceServerCookieMode: true,
112117
});
113118

@@ -171,16 +176,6 @@ export class PersonalizeMiddleware extends MiddlewareBase {
171176
}
172177

173178
const site = this.getSite(req, response);
174-
const engageServer = this.initializeEngageServer(site, language);
175-
176-
// creates the browser ID cookie on the server side
177-
// and includes the cookie in the response header
178-
try {
179-
await engageServer.handleCookie(req, response, timeout);
180-
} catch (error) {
181-
debug.personalize('skipped (browser id generation failed)');
182-
throw error;
183-
}
184179

185180
// Get personalization info from Experience Edge
186181
const personalizeInfo = await this.personalizeService.getPersonalizeInfo(
@@ -199,6 +194,16 @@ export class PersonalizeMiddleware extends MiddlewareBase {
199194
return response;
200195
}
201196

197+
const engageServer = this.initializeEngageServer(hostname, site, language);
198+
199+
// creates the browser ID cookie on the server side
200+
// and includes the cookie in the response header
201+
try {
202+
await engageServer.handleCookie(req, response, timeout);
203+
} catch (error) {
204+
debug.personalize('skipped (browser id generation failed)');
205+
throw error;
206+
}
202207
const params = this.getExperienceParams(req);
203208

204209
debug.personalize('executing experience for %s %s %o', personalizeInfo.contentId, params);
@@ -240,18 +245,27 @@ export class PersonalizeMiddleware extends MiddlewareBase {
240245
const rewritePath = getPersonalizedRewrite(basePath, { variantId });
241246
// Note an absolute URL is required: https://nextjs.org/docs/messages/middleware-relative-urls
242247
const rewriteUrl = req.nextUrl.clone();
248+
249+
// Preserve cookies from previous response
250+
const cookies = response.cookies.getAll();
251+
243252
rewriteUrl.pathname = rewritePath;
244-
response = NextResponse.rewrite(rewriteUrl);
253+
response = NextResponse.rewrite(rewriteUrl, response);
245254

246255
// Disable preflight caching to force revalidation on client-side navigation (personalization may be influenced)
247256
// See https://github.com/vercel/next.js/issues/32727
248257
response.headers.set('x-middleware-cache', 'no-cache');
249-
// Share rewrite path with following executed middlewares
258+
// Share rewrite path with following executed middleware
250259
response.headers.set('x-sc-rewrite', rewritePath);
251-
252260
// Share site name with the following executed middlewares
253261
response.cookies.set(this.SITE_SYMBOL, site.name);
254262

263+
// Restore cookies from previous response since
264+
// browserId cookie gets omitted after rewrite
265+
cookies.forEach((cookie) => {
266+
response.cookies.set(cookie);
267+
});
268+
255269
debug.personalize('personalize middleware end in %dms: %o', Date.now() - startTimestamp, {
256270
rewritePath,
257271
headers: this.extractDebugHeaders(response.headers),

yarn.lock

+6-6
Original file line numberDiff line numberDiff line change
@@ -6623,7 +6623,7 @@ __metadata:
66236623
"@sitecore-jss/sitecore-jss": 21.6.0-canary.6
66246624
"@sitecore-jss/sitecore-jss-dev-tools": 21.6.0-canary.6
66256625
"@sitecore-jss/sitecore-jss-react": 21.6.0-canary.6
6626-
"@sitecore/engage": ^1.4.0
6626+
"@sitecore/engage": ^1.4.1
66276627
"@types/chai": ^4.3.4
66286628
"@types/chai-as-promised": ^7.1.5
66296629
"@types/chai-string": ^1.4.2
@@ -6663,7 +6663,7 @@ __metadata:
66636663
ts-node: ^10.9.1
66646664
typescript: ~4.9.4
66656665
peerDependencies:
6666-
"@sitecore/engage": ^1.4.0
6666+
"@sitecore/engage": ^1.4.1
66676667
next: ^13.4.16
66686668
react: ^18.2.0
66696669
react-dom: ^18.2.0
@@ -6914,10 +6914,10 @@ __metadata:
69146914
languageName: node
69156915
linkType: hard
69166916

6917-
"@sitecore/engage@npm:^1.4.0":
6918-
version: 1.4.0
6919-
resolution: "@sitecore/engage@npm:1.4.0"
6920-
checksum: f656045dfcb65f63ff44af195c9ae92d375a237bdf91a4638e9d296df2d143837145f13ca033aeabd03323c900ee5c78249d2967c7665368fde82ef2e758ad43
6917+
"@sitecore/engage@npm:^1.4.1":
6918+
version: 1.4.1
6919+
resolution: "@sitecore/engage@npm:1.4.1"
6920+
checksum: 582b7a55ba407765def12518114790fb1735c359e60fe4594102a5e643539b148a494b02bf71970bcafc807b92fe19a1ab8ff7c2af3db2c080ab36ec2eb16d57
69216921
languageName: node
69226922
linkType: hard
69236923

0 commit comments

Comments
 (0)