@sitecore-jss/sitecore-jss-nextjs 21.5.0-canary.9 → 21.5.1-canary.1

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.
@@ -14,6 +14,7 @@ const server_1 = require("next/server");
14
14
  const personalize_1 = require("@sitecore-jss/sitecore-jss/personalize");
15
15
  const sitecore_jss_1 = require("@sitecore-jss/sitecore-jss");
16
16
  const middleware_1 = require("./middleware");
17
+ const engage_1 = require("@sitecore/engage");
17
18
  /**
18
19
  * Middleware / handler to support Sitecore Personalize
19
20
  */
@@ -25,19 +26,20 @@ class PersonalizeMiddleware extends middleware_1.MiddlewareBase {
25
26
  super(config);
26
27
  this.config = config;
27
28
  this.handler = (req, res) => __awaiter(this, void 0, void 0, function* () {
29
+ var _a;
28
30
  const pathname = req.nextUrl.pathname;
29
31
  const language = this.getLanguage(req);
30
32
  const hostname = this.getHostHeader(req) || this.defaultHostname;
31
33
  const startTimestamp = Date.now();
32
- let browserId = this.getBrowserId(req);
34
+ const timeout = this.config.cdpConfig.timeout;
35
+ // Response will be provided if other middleware is run before us (e.g. redirects)
36
+ let response = res || server_1.NextResponse.next();
33
37
  sitecore_jss_1.debug.personalize('personalize middleware start: %o', {
34
38
  pathname,
35
39
  language,
36
40
  hostname,
37
- browserId,
41
+ headers: this.extractDebugHeaders(req.headers),
38
42
  });
39
- // Response will be provided if other middleware is run before us (e.g. redirects)
40
- let response = res || server_1.NextResponse.next();
41
43
  if (this.config.disabled && this.config.disabled(req, response)) {
42
44
  sitecore_jss_1.debug.personalize('skipped (personalize middleware is disabled)');
43
45
  return response;
@@ -48,7 +50,7 @@ class PersonalizeMiddleware extends middleware_1.MiddlewareBase {
48
50
  sitecore_jss_1.debug.personalize('skipped (%s)', response.redirected ? 'redirected' : this.isPreview(req) ? 'preview' : 'route excluded');
49
51
  return response;
50
52
  }
51
- const site = this.getSite(req, res);
53
+ const site = this.getSite(req, response);
52
54
  // Get personalization info from Experience Edge
53
55
  const personalizeInfo = yield this.personalizeService.getPersonalizeInfo(pathname, language, site.name);
54
56
  if (!personalizeInfo) {
@@ -60,20 +62,34 @@ class PersonalizeMiddleware extends middleware_1.MiddlewareBase {
60
62
  sitecore_jss_1.debug.personalize('skipped (no personalization configured)');
61
63
  return response;
62
64
  }
63
- if (!browserId) {
64
- browserId = yield this.cdpService.generateBrowserId();
65
- if (!browserId) {
66
- sitecore_jss_1.debug.personalize('skipped (browser id generation failed)');
67
- return response;
68
- }
65
+ const engageServer = this.initializeEngageServer(hostname, site, language);
66
+ // creates the browser ID cookie on the server side
67
+ // and includes the cookie in the response header
68
+ try {
69
+ yield engageServer.handleCookie(req, response, timeout);
70
+ }
71
+ catch (error) {
72
+ sitecore_jss_1.debug.personalize('skipped (browser id generation failed)');
73
+ throw error;
69
74
  }
70
- // Execute targeted experience in CDP
71
- const { ua } = (0, server_1.userAgent)(req);
72
75
  const params = this.getExperienceParams(req);
73
- const pointOfSale = this.config.getPointOfSale
74
- ? this.config.getPointOfSale(site, language)
75
- : personalize_1.PosResolver.resolve(site, language);
76
- const variantId = yield this.cdpService.executeExperience(personalizeInfo.contentId, browserId, ua, pointOfSale, params);
76
+ sitecore_jss_1.debug.personalize('executing experience for %s %s %o', personalizeInfo.contentId, params);
77
+ const personalizationData = {
78
+ channel: this.config.cdpConfig.channel || 'WEB',
79
+ currency: (_a = this.config.cdpConfig.currency) !== null && _a !== void 0 ? _a : 'USA',
80
+ friendlyId: personalizeInfo.contentId,
81
+ params,
82
+ language,
83
+ };
84
+ let variantId;
85
+ // Execute targeted experience in CDP
86
+ // eslint-disable-next-line no-useless-catch
87
+ try {
88
+ variantId = (yield engageServer.personalize(personalizationData, req, timeout)).variantId;
89
+ }
90
+ catch (error) {
91
+ throw error;
92
+ }
77
93
  if (!variantId) {
78
94
  sitecore_jss_1.debug.personalize('skipped (no variant identified)');
79
95
  return response;
@@ -88,20 +104,24 @@ class PersonalizeMiddleware extends middleware_1.MiddlewareBase {
88
104
  const rewritePath = (0, personalize_1.getPersonalizedRewrite)(basePath, { variantId });
89
105
  // Note an absolute URL is required: https://nextjs.org/docs/messages/middleware-relative-urls
90
106
  const rewriteUrl = req.nextUrl.clone();
107
+ // Preserve cookies from previous response
108
+ const cookies = response.cookies.getAll();
91
109
  rewriteUrl.pathname = rewritePath;
92
- response = server_1.NextResponse.rewrite(rewriteUrl);
110
+ response = server_1.NextResponse.rewrite(rewriteUrl, response);
93
111
  // Disable preflight caching to force revalidation on client-side navigation (personalization may be influenced)
94
112
  // See https://github.com/vercel/next.js/issues/32727
95
113
  response.headers.set('x-middleware-cache', 'no-cache');
96
- // Share rewrite path with following executed middlewares
114
+ // Share rewrite path with following executed middleware
97
115
  response.headers.set('x-sc-rewrite', rewritePath);
98
- // Set browserId cookie on the response
99
- this.setBrowserId(response, browserId);
100
116
  // Share site name with the following executed middlewares
101
117
  response.cookies.set(this.SITE_SYMBOL, site.name);
118
+ // Restore cookies from previous response since
119
+ // browserId cookie gets omitted after rewrite
120
+ cookies.forEach((cookie) => {
121
+ response.cookies.set(cookie);
122
+ });
102
123
  sitecore_jss_1.debug.personalize('personalize middleware end in %dms: %o', Date.now() - startTimestamp, {
103
124
  rewritePath,
104
- browserId,
105
125
  headers: this.extractDebugHeaders(response.headers),
106
126
  });
107
127
  return response;
@@ -109,15 +129,6 @@ class PersonalizeMiddleware extends middleware_1.MiddlewareBase {
109
129
  // NOTE: we provide native fetch for compatibility on Next.js Edge Runtime
110
130
  // (underlying default 'cross-fetch' is not currently compatible: https://github.com/lquixada/cross-fetch/issues/78)
111
131
  this.personalizeService = new personalize_1.GraphQLPersonalizeService(Object.assign(Object.assign({}, config.edgeConfig), { fetch: fetch }));
112
- // NOTE: same here, we provide NativeDataFetcher for compatibility on Next.js Edge Runtime
113
- this.cdpService = new personalize_1.CdpService(Object.assign(Object.assign({}, config.cdpConfig), { dataFetcherResolver: ({ timeout, headers, }) => {
114
- const fetcher = new sitecore_jss_1.NativeDataFetcher({
115
- debugger: sitecore_jss_1.debug.personalize,
116
- timeout,
117
- headers,
118
- });
119
- return (url, data) => fetcher.fetch(url, data);
120
- } }));
121
132
  }
122
133
  /**
123
134
  * Gets the Next.js middleware handler with error handling
@@ -135,31 +146,31 @@ class PersonalizeMiddleware extends middleware_1.MiddlewareBase {
135
146
  }
136
147
  });
137
148
  }
138
- get browserIdCookieName() {
139
- // Each user should have saved identifier to connect between session, CDP uses bid cookies + local storage
140
- return `BID_${this.config.cdpConfig.clientKey}`;
141
- }
142
- getBrowserId(req) {
143
- var _a;
144
- return ((_a = req.cookies.get(this.browserIdCookieName)) === null || _a === void 0 ? void 0 : _a.value) || undefined;
145
- }
146
- setBrowserId(res, browserId) {
147
- const expiryDate = new Date(new Date().setFullYear(new Date().getFullYear() + 2));
148
- const options = { expires: expiryDate, secure: true };
149
- res.cookies.set(this.browserIdCookieName, browserId, options);
149
+ initializeEngageServer(hostName, site, language) {
150
+ const engageServer = (0, engage_1.initServer)({
151
+ clientKey: this.config.cdpConfig.clientKey,
152
+ targetURL: this.config.cdpConfig.endpoint,
153
+ pointOfSale: this.config.getPointOfSale
154
+ ? this.config.getPointOfSale(site, language)
155
+ : personalize_1.PosResolver.resolve(site, language),
156
+ cookieDomain: hostName,
157
+ forceServerCookieMode: true,
158
+ });
159
+ return engageServer;
150
160
  }
151
161
  getExperienceParams(req) {
162
+ const utm = {
163
+ campaign: req.nextUrl.searchParams.get('utm_campaign') || undefined,
164
+ content: req.nextUrl.searchParams.get('utm_content') || undefined,
165
+ medium: req.nextUrl.searchParams.get('utm_medium') || undefined,
166
+ source: req.nextUrl.searchParams.get('utm_source') || undefined,
167
+ };
152
168
  return {
153
169
  // It's expected that the header name "referer" is actually a misspelling of the word "referrer"
154
170
  // req.referrer is used during fetching to determine the value of the Referer header of the request being made,
155
171
  // used as a fallback
156
172
  referrer: req.headers.get('referer') || req.referrer,
157
- utm: {
158
- campaign: req.nextUrl.searchParams.get('utm_campaign'),
159
- content: req.nextUrl.searchParams.get('utm_content'),
160
- medium: req.nextUrl.searchParams.get('utm_medium'),
161
- source: req.nextUrl.searchParams.get('utm_source'),
162
- },
173
+ utm: utm,
163
174
  };
164
175
  }
165
176
  excludeRoute(pathname) {
@@ -141,7 +141,8 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
141
141
  redirect.pattern = `/^\/${redirect.pattern
142
142
  .replace(/^\/|\/$/g, '')
143
143
  .replace(/^\^\/|\/\$$/g, '')
144
- .replace(/^\^|\$$/g, '')}$/gi`;
144
+ .replace(/^\^|\$$/g, '')
145
+ .replace(/\$\/gi$/g, '')}$/gi`;
145
146
  return (((0, regex_parser_1.default)(redirect.pattern).test(tragetURL) ||
146
147
  (0, regex_parser_1.default)(redirect.pattern).test(`${tragetURL}${targetQS}`) ||
147
148
  (0, regex_parser_1.default)(redirect.pattern).test(`/${req.nextUrl.locale}${tragetURL}`) ||
@@ -7,10 +7,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { NextResponse, userAgent } from 'next/server';
11
- import { GraphQLPersonalizeService, CdpService, getPersonalizedRewrite, PosResolver, } from '@sitecore-jss/sitecore-jss/personalize';
12
- import { debug, NativeDataFetcher } from '@sitecore-jss/sitecore-jss';
10
+ import { NextResponse } from 'next/server';
11
+ import { GraphQLPersonalizeService, getPersonalizedRewrite, PosResolver, } from '@sitecore-jss/sitecore-jss/personalize';
12
+ import { debug } from '@sitecore-jss/sitecore-jss';
13
13
  import { MiddlewareBase } from './middleware';
14
+ import { initServer } from '@sitecore/engage';
14
15
  /**
15
16
  * Middleware / handler to support Sitecore Personalize
16
17
  */
@@ -22,19 +23,20 @@ export class PersonalizeMiddleware extends MiddlewareBase {
22
23
  super(config);
23
24
  this.config = config;
24
25
  this.handler = (req, res) => __awaiter(this, void 0, void 0, function* () {
26
+ var _a;
25
27
  const pathname = req.nextUrl.pathname;
26
28
  const language = this.getLanguage(req);
27
29
  const hostname = this.getHostHeader(req) || this.defaultHostname;
28
30
  const startTimestamp = Date.now();
29
- let browserId = this.getBrowserId(req);
31
+ const timeout = this.config.cdpConfig.timeout;
32
+ // Response will be provided if other middleware is run before us (e.g. redirects)
33
+ let response = res || NextResponse.next();
30
34
  debug.personalize('personalize middleware start: %o', {
31
35
  pathname,
32
36
  language,
33
37
  hostname,
34
- browserId,
38
+ headers: this.extractDebugHeaders(req.headers),
35
39
  });
36
- // Response will be provided if other middleware is run before us (e.g. redirects)
37
- let response = res || NextResponse.next();
38
40
  if (this.config.disabled && this.config.disabled(req, response)) {
39
41
  debug.personalize('skipped (personalize middleware is disabled)');
40
42
  return response;
@@ -45,7 +47,7 @@ export class PersonalizeMiddleware extends MiddlewareBase {
45
47
  debug.personalize('skipped (%s)', response.redirected ? 'redirected' : this.isPreview(req) ? 'preview' : 'route excluded');
46
48
  return response;
47
49
  }
48
- const site = this.getSite(req, res);
50
+ const site = this.getSite(req, response);
49
51
  // Get personalization info from Experience Edge
50
52
  const personalizeInfo = yield this.personalizeService.getPersonalizeInfo(pathname, language, site.name);
51
53
  if (!personalizeInfo) {
@@ -57,20 +59,34 @@ export class PersonalizeMiddleware extends MiddlewareBase {
57
59
  debug.personalize('skipped (no personalization configured)');
58
60
  return response;
59
61
  }
60
- if (!browserId) {
61
- browserId = yield this.cdpService.generateBrowserId();
62
- if (!browserId) {
63
- debug.personalize('skipped (browser id generation failed)');
64
- return response;
65
- }
62
+ const engageServer = this.initializeEngageServer(hostname, site, language);
63
+ // creates the browser ID cookie on the server side
64
+ // and includes the cookie in the response header
65
+ try {
66
+ yield engageServer.handleCookie(req, response, timeout);
67
+ }
68
+ catch (error) {
69
+ debug.personalize('skipped (browser id generation failed)');
70
+ throw error;
66
71
  }
67
- // Execute targeted experience in CDP
68
- const { ua } = userAgent(req);
69
72
  const params = this.getExperienceParams(req);
70
- const pointOfSale = this.config.getPointOfSale
71
- ? this.config.getPointOfSale(site, language)
72
- : PosResolver.resolve(site, language);
73
- const variantId = yield this.cdpService.executeExperience(personalizeInfo.contentId, browserId, ua, pointOfSale, params);
73
+ debug.personalize('executing experience for %s %s %o', personalizeInfo.contentId, params);
74
+ const personalizationData = {
75
+ channel: this.config.cdpConfig.channel || 'WEB',
76
+ currency: (_a = this.config.cdpConfig.currency) !== null && _a !== void 0 ? _a : 'USA',
77
+ friendlyId: personalizeInfo.contentId,
78
+ params,
79
+ language,
80
+ };
81
+ let variantId;
82
+ // Execute targeted experience in CDP
83
+ // eslint-disable-next-line no-useless-catch
84
+ try {
85
+ variantId = (yield engageServer.personalize(personalizationData, req, timeout)).variantId;
86
+ }
87
+ catch (error) {
88
+ throw error;
89
+ }
74
90
  if (!variantId) {
75
91
  debug.personalize('skipped (no variant identified)');
76
92
  return response;
@@ -85,20 +101,24 @@ export class PersonalizeMiddleware extends MiddlewareBase {
85
101
  const rewritePath = getPersonalizedRewrite(basePath, { variantId });
86
102
  // Note an absolute URL is required: https://nextjs.org/docs/messages/middleware-relative-urls
87
103
  const rewriteUrl = req.nextUrl.clone();
104
+ // Preserve cookies from previous response
105
+ const cookies = response.cookies.getAll();
88
106
  rewriteUrl.pathname = rewritePath;
89
- response = NextResponse.rewrite(rewriteUrl);
107
+ response = NextResponse.rewrite(rewriteUrl, response);
90
108
  // Disable preflight caching to force revalidation on client-side navigation (personalization may be influenced)
91
109
  // See https://github.com/vercel/next.js/issues/32727
92
110
  response.headers.set('x-middleware-cache', 'no-cache');
93
- // Share rewrite path with following executed middlewares
111
+ // Share rewrite path with following executed middleware
94
112
  response.headers.set('x-sc-rewrite', rewritePath);
95
- // Set browserId cookie on the response
96
- this.setBrowserId(response, browserId);
97
113
  // Share site name with the following executed middlewares
98
114
  response.cookies.set(this.SITE_SYMBOL, site.name);
115
+ // Restore cookies from previous response since
116
+ // browserId cookie gets omitted after rewrite
117
+ cookies.forEach((cookie) => {
118
+ response.cookies.set(cookie);
119
+ });
99
120
  debug.personalize('personalize middleware end in %dms: %o', Date.now() - startTimestamp, {
100
121
  rewritePath,
101
- browserId,
102
122
  headers: this.extractDebugHeaders(response.headers),
103
123
  });
104
124
  return response;
@@ -106,15 +126,6 @@ export class PersonalizeMiddleware extends MiddlewareBase {
106
126
  // NOTE: we provide native fetch for compatibility on Next.js Edge Runtime
107
127
  // (underlying default 'cross-fetch' is not currently compatible: https://github.com/lquixada/cross-fetch/issues/78)
108
128
  this.personalizeService = new GraphQLPersonalizeService(Object.assign(Object.assign({}, config.edgeConfig), { fetch: fetch }));
109
- // NOTE: same here, we provide NativeDataFetcher for compatibility on Next.js Edge Runtime
110
- this.cdpService = new CdpService(Object.assign(Object.assign({}, config.cdpConfig), { dataFetcherResolver: ({ timeout, headers, }) => {
111
- const fetcher = new NativeDataFetcher({
112
- debugger: debug.personalize,
113
- timeout,
114
- headers,
115
- });
116
- return (url, data) => fetcher.fetch(url, data);
117
- } }));
118
129
  }
119
130
  /**
120
131
  * Gets the Next.js middleware handler with error handling
@@ -132,31 +143,31 @@ export class PersonalizeMiddleware extends MiddlewareBase {
132
143
  }
133
144
  });
134
145
  }
135
- get browserIdCookieName() {
136
- // Each user should have saved identifier to connect between session, CDP uses bid cookies + local storage
137
- return `BID_${this.config.cdpConfig.clientKey}`;
138
- }
139
- getBrowserId(req) {
140
- var _a;
141
- return ((_a = req.cookies.get(this.browserIdCookieName)) === null || _a === void 0 ? void 0 : _a.value) || undefined;
142
- }
143
- setBrowserId(res, browserId) {
144
- const expiryDate = new Date(new Date().setFullYear(new Date().getFullYear() + 2));
145
- const options = { expires: expiryDate, secure: true };
146
- res.cookies.set(this.browserIdCookieName, browserId, options);
146
+ initializeEngageServer(hostName, site, language) {
147
+ const engageServer = initServer({
148
+ clientKey: this.config.cdpConfig.clientKey,
149
+ targetURL: this.config.cdpConfig.endpoint,
150
+ pointOfSale: this.config.getPointOfSale
151
+ ? this.config.getPointOfSale(site, language)
152
+ : PosResolver.resolve(site, language),
153
+ cookieDomain: hostName,
154
+ forceServerCookieMode: true,
155
+ });
156
+ return engageServer;
147
157
  }
148
158
  getExperienceParams(req) {
159
+ const utm = {
160
+ campaign: req.nextUrl.searchParams.get('utm_campaign') || undefined,
161
+ content: req.nextUrl.searchParams.get('utm_content') || undefined,
162
+ medium: req.nextUrl.searchParams.get('utm_medium') || undefined,
163
+ source: req.nextUrl.searchParams.get('utm_source') || undefined,
164
+ };
149
165
  return {
150
166
  // It's expected that the header name "referer" is actually a misspelling of the word "referrer"
151
167
  // req.referrer is used during fetching to determine the value of the Referer header of the request being made,
152
168
  // used as a fallback
153
169
  referrer: req.headers.get('referer') || req.referrer,
154
- utm: {
155
- campaign: req.nextUrl.searchParams.get('utm_campaign'),
156
- content: req.nextUrl.searchParams.get('utm_content'),
157
- medium: req.nextUrl.searchParams.get('utm_medium'),
158
- source: req.nextUrl.searchParams.get('utm_source'),
159
- },
170
+ utm: utm,
160
171
  };
161
172
  }
162
173
  excludeRoute(pathname) {
@@ -135,7 +135,8 @@ export class RedirectsMiddleware extends MiddlewareBase {
135
135
  redirect.pattern = `/^\/${redirect.pattern
136
136
  .replace(/^\/|\/$/g, '')
137
137
  .replace(/^\^\/|\/\$$/g, '')
138
- .replace(/^\^|\$$/g, '')}$/gi`;
138
+ .replace(/^\^|\$$/g, '')
139
+ .replace(/\$\/gi$/g, '')}$/gi`;
139
140
  return ((regexParser(redirect.pattern).test(tragetURL) ||
140
141
  regexParser(redirect.pattern).test(`${tragetURL}${targetQS}`) ||
141
142
  regexParser(redirect.pattern).test(`/${req.nextUrl.locale}${tragetURL}`) ||
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sitecore-jss/sitecore-jss-nextjs",
3
- "version": "21.5.0-canary.9",
3
+ "version": "21.5.1-canary.1",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/esm/index.js",
6
6
  "sideEffects": false,
@@ -30,6 +30,7 @@
30
30
  "url": "https://github.com/sitecore/jss/issues"
31
31
  },
32
32
  "devDependencies": {
33
+ "@sitecore/engage": "^1.4.1",
33
34
  "@types/chai": "^4.3.4",
34
35
  "@types/chai-as-promised": "^7.1.5",
35
36
  "@types/chai-string": "^1.4.2",
@@ -65,14 +66,15 @@
65
66
  "typescript": "~4.9.4"
66
67
  },
67
68
  "peerDependencies": {
69
+ "@sitecore/engage": "^1.4.1",
68
70
  "next": "^13.4.16",
69
71
  "react": "^18.2.0",
70
72
  "react-dom": "^18.2.0"
71
73
  },
72
74
  "dependencies": {
73
- "@sitecore-jss/sitecore-jss": "^21.5.0-canary.9",
74
- "@sitecore-jss/sitecore-jss-dev-tools": "^21.5.0-canary.9",
75
- "@sitecore-jss/sitecore-jss-react": "^21.5.0-canary.9",
75
+ "@sitecore-jss/sitecore-jss": "^21.5.1-canary.1",
76
+ "@sitecore-jss/sitecore-jss-dev-tools": "^21.5.1-canary.1",
77
+ "@sitecore-jss/sitecore-jss-react": "^21.5.1-canary.1",
76
78
  "@vercel/kv": "^0.2.1",
77
79
  "node-html-parser": "^6.1.4",
78
80
  "prop-types": "^15.8.1",
@@ -81,7 +83,7 @@
81
83
  },
82
84
  "description": "",
83
85
  "types": "types/index.d.ts",
84
- "gitHead": "d04cef72a0eafdaa6654c7741d7fa4ab325a7f38",
86
+ "gitHead": "99505d2da05df33739484ea3d96a91957e17c310",
85
87
  "files": [
86
88
  "dist",
87
89
  "types",
@@ -1,7 +1,30 @@
1
1
  import { NextResponse, NextRequest } from 'next/server';
2
- import { GraphQLPersonalizeServiceConfig, CdpServiceConfig, ExperienceParams } from '@sitecore-jss/sitecore-jss/personalize';
3
- import { MiddlewareBase, MiddlewareBaseConfig } from './middleware';
2
+ import { GraphQLPersonalizeServiceConfig } from '@sitecore-jss/sitecore-jss/personalize';
4
3
  import { SiteInfo } from '@sitecore-jss/sitecore-jss/site';
4
+ import { MiddlewareBase, MiddlewareBaseConfig } from './middleware';
5
+ import { EngageServer } from '@sitecore/engage';
6
+ export type CdpServiceConfig = {
7
+ /**
8
+ * Your Sitecore CDP API endpoint
9
+ */
10
+ endpoint: string;
11
+ /**
12
+ * The client key to use for authentication
13
+ */
14
+ clientKey: string;
15
+ /**
16
+ * The Sitecore CDP channel to use for events. Uses 'WEB' by default.
17
+ */
18
+ channel?: string;
19
+ /**
20
+ * Currency for CDP request. Uses 'USA' as default.
21
+ */
22
+ currency?: string;
23
+ /**
24
+ * Timeout (ms) for CDP request. Default is 400.
25
+ */
26
+ timeout?: number;
27
+ };
5
28
  export type PersonalizeMiddlewareConfig = MiddlewareBaseConfig & {
6
29
  /**
7
30
  * Configuration for your Sitecore Experience Edge endpoint
@@ -10,7 +33,7 @@ export type PersonalizeMiddlewareConfig = MiddlewareBaseConfig & {
10
33
  /**
11
34
  * Configuration for your Sitecore CDP endpoint
12
35
  */
13
- cdpConfig: Omit<CdpServiceConfig, 'dataFetcherResolver'>;
36
+ cdpConfig: CdpServiceConfig;
14
37
  /**
15
38
  * function to resolve point of sale for a site
16
39
  * @param {Siteinfo} site to get info from
@@ -19,13 +42,25 @@ export type PersonalizeMiddlewareConfig = MiddlewareBaseConfig & {
19
42
  */
20
43
  getPointOfSale?: (site: SiteInfo, language: string) => string;
21
44
  };
45
+ /**
46
+ * Object model of Experience Context data
47
+ */
48
+ export type ExperienceParams = {
49
+ referrer: string;
50
+ utm: {
51
+ [key: string]: string | undefined;
52
+ campaign: string | undefined;
53
+ source: string | undefined;
54
+ medium: string | undefined;
55
+ content: string | undefined;
56
+ };
57
+ };
22
58
  /**
23
59
  * Middleware / handler to support Sitecore Personalize
24
60
  */
25
61
  export declare class PersonalizeMiddleware extends MiddlewareBase {
26
62
  protected config: PersonalizeMiddlewareConfig;
27
63
  private personalizeService;
28
- private cdpService;
29
64
  /**
30
65
  * @param {PersonalizeMiddlewareConfig} [config] Personalize middleware config
31
66
  */
@@ -35,9 +70,7 @@ export declare class PersonalizeMiddleware extends MiddlewareBase {
35
70
  * @returns middleware handler
36
71
  */
37
72
  getHandler(): (req: NextRequest, res?: NextResponse) => Promise<NextResponse>;
38
- protected get browserIdCookieName(): string;
39
- protected getBrowserId(req: NextRequest): string | undefined;
40
- protected setBrowserId(res: NextResponse, browserId: string): void;
73
+ protected initializeEngageServer(hostName: string, site: SiteInfo, language: string): EngageServer;
41
74
  protected getExperienceParams(req: NextRequest): ExperienceParams;
42
75
  protected excludeRoute(pathname: string): boolean | undefined;
43
76
  private handler;