@sitecore-cloudsdk/core 0.3.1 → 0.4.0-rc.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.
- package/README.md +75 -1
- package/browser.cjs +3 -0
- package/browser.d.ts +2 -0
- package/browser.js +3 -0
- package/dist/cjs/package.json +26 -13
- package/dist/cjs/src/browser.d.ts +5 -0
- package/dist/cjs/src/browser.js +12 -0
- package/dist/cjs/src/internal.d.ts +38 -0
- package/dist/cjs/src/{index.js → internal.js} +41 -10
- package/dist/cjs/src/lib/{cookie → browser-id}/get-browser-id.js +9 -2
- package/dist/cjs/src/lib/consts.d.ts +3 -0
- package/dist/cjs/src/lib/consts.js +3 -0
- package/dist/cjs/src/lib/cookie/create-cookies.js +3 -3
- package/dist/cjs/src/lib/cookie/handle-http-cookie.js +2 -3
- package/dist/cjs/src/lib/cookie/handle-next-js-middleware-cookie.js +2 -3
- package/dist/cjs/src/lib/guest-id/fetch-guest-id-from-edge-proxy.d.ts +24 -0
- package/dist/cjs/src/lib/guest-id/fetch-guest-id-from-edge-proxy.js +27 -0
- package/dist/cjs/src/lib/guest-id/get-guest-id.d.ts +6 -0
- package/dist/cjs/src/lib/guest-id/get-guest-id.js +18 -0
- package/dist/cjs/src/lib/init/get-guest-id.js +1 -1
- package/dist/cjs/src/lib/init/init-core-server.d.ts +1 -0
- package/dist/cjs/src/lib/init/init-core-server.js +3 -0
- package/dist/cjs/src/lib/init/init-core.d.ts +15 -0
- package/dist/cjs/src/lib/init/init-core.js +3 -0
- package/dist/cjs/src/lib/initializer/browser/initializer.d.ts +63 -0
- package/dist/cjs/src/lib/initializer/browser/initializer.js +142 -0
- package/dist/cjs/src/lib/initializer/browser/interfaces.d.ts +41 -0
- package/dist/cjs/src/lib/initializer/browser/interfaces.js +2 -0
- package/dist/cjs/src/lib/initializer/browser/package-initializer.d.ts +13 -0
- package/dist/cjs/src/lib/initializer/browser/package-initializer.js +45 -0
- package/dist/cjs/src/lib/initializer/server/initializer.d.ts +58 -0
- package/dist/cjs/src/lib/initializer/server/initializer.js +164 -0
- package/dist/cjs/src/lib/initializer/server/interfaces.d.ts +34 -0
- package/dist/cjs/src/lib/initializer/server/interfaces.js +2 -0
- package/dist/cjs/src/lib/initializer/server/package-initializer.d.ts +10 -0
- package/dist/cjs/src/lib/initializer/server/package-initializer.js +30 -0
- package/dist/cjs/src/server.d.ts +3 -0
- package/dist/cjs/src/server.js +8 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/package.json +26 -13
- package/dist/esm/src/browser.d.ts +5 -0
- package/dist/esm/src/browser.js +5 -0
- package/dist/esm/src/internal.d.ts +38 -0
- package/dist/esm/src/internal.js +36 -0
- package/dist/esm/src/lib/browser-id/get-browser-id.js +18 -0
- package/dist/esm/src/lib/consts.d.ts +3 -0
- package/dist/esm/src/lib/consts.js +3 -0
- package/dist/esm/src/lib/cookie/create-cookies.js +2 -2
- package/dist/esm/src/lib/cookie/handle-http-cookie.js +2 -3
- package/dist/esm/src/lib/cookie/handle-next-js-middleware-cookie.js +2 -3
- package/dist/esm/src/lib/guest-id/fetch-guest-id-from-edge-proxy.d.ts +24 -0
- package/dist/esm/src/lib/guest-id/fetch-guest-id-from-edge-proxy.js +23 -0
- package/dist/esm/src/lib/guest-id/get-guest-id.d.ts +6 -0
- package/dist/esm/src/lib/guest-id/get-guest-id.js +14 -0
- package/dist/esm/src/lib/init/init-core-server.d.ts +1 -0
- package/dist/esm/src/lib/init/init-core-server.js +3 -0
- package/dist/esm/src/lib/init/init-core.d.ts +15 -0
- package/dist/esm/src/lib/init/init-core.js +3 -0
- package/dist/esm/src/lib/initializer/browser/initializer.d.ts +63 -0
- package/dist/esm/src/lib/initializer/browser/initializer.js +136 -0
- package/dist/esm/src/lib/initializer/browser/interfaces.d.ts +41 -0
- package/dist/esm/src/lib/initializer/browser/interfaces.js +1 -0
- package/dist/esm/src/lib/initializer/browser/package-initializer.d.ts +13 -0
- package/dist/esm/src/lib/initializer/browser/package-initializer.js +41 -0
- package/dist/esm/src/lib/initializer/server/initializer.d.ts +58 -0
- package/dist/esm/src/lib/initializer/server/initializer.js +157 -0
- package/dist/esm/src/lib/initializer/server/interfaces.d.ts +34 -0
- package/dist/esm/src/lib/initializer/server/interfaces.js +1 -0
- package/dist/esm/src/lib/initializer/server/package-initializer.d.ts +10 -0
- package/dist/esm/src/lib/initializer/server/package-initializer.js +26 -0
- package/dist/esm/src/server.d.ts +3 -0
- package/dist/esm/src/server.js +3 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/internal.cjs +3 -0
- package/internal.d.ts +2 -0
- package/internal.js +3 -0
- package/package.json +26 -13
- package/server.cjs +3 -0
- package/server.d.ts +2 -0
- package/server.js +3 -0
- package/dist/cjs/src/index.d.ts +0 -21
- package/dist/esm/src/index.d.ts +0 -21
- package/dist/esm/src/index.js +0 -20
- package/dist/esm/src/lib/cookie/get-browser-id.js +0 -11
- /package/dist/cjs/src/lib/{init → browser-id}/construct-get-browser-id-url.d.ts +0 -0
- /package/dist/cjs/src/lib/{init → browser-id}/construct-get-browser-id-url.js +0 -0
- /package/dist/cjs/src/lib/{init → browser-id}/fetch-browser-id-from-edge-proxy.d.ts +0 -0
- /package/dist/cjs/src/lib/{init → browser-id}/fetch-browser-id-from-edge-proxy.js +0 -0
- /package/dist/cjs/src/lib/{cookie → browser-id}/get-browser-id.d.ts +0 -0
- /package/dist/esm/src/lib/{init → browser-id}/construct-get-browser-id-url.d.ts +0 -0
- /package/dist/esm/src/lib/{init → browser-id}/construct-get-browser-id-url.js +0 -0
- /package/dist/esm/src/lib/{init → browser-id}/fetch-browser-id-from-edge-proxy.d.ts +0 -0
- /package/dist/esm/src/lib/{init → browser-id}/fetch-browser-id-from-edge-proxy.js +0 -0
- /package/dist/esm/src/lib/{cookie → browser-id}/get-browser-id.d.ts +0 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { ProxySettings } from '../../interfaces';
|
|
2
|
+
import type { BrowserSettings, Core, Settings } from './interfaces';
|
|
3
|
+
import type { PackageInitializer } from './package-initializer';
|
|
4
|
+
export declare let cloudSDKSettings: Settings;
|
|
5
|
+
export declare const enabledPackages: Map<string, PackageInitializer>;
|
|
6
|
+
export declare let initCoreState: Promise<void> | null;
|
|
7
|
+
export declare let cookiesValuesFromEdge: ProxySettings;
|
|
8
|
+
export declare class CloudSDKBrowserInitializer {
|
|
9
|
+
/**
|
|
10
|
+
* Runs the initialization logic. Enables packages and create cookies for CloudSDK.
|
|
11
|
+
* @param settings - Common settings for the CloudSDK
|
|
12
|
+
* @throws the following errors:
|
|
13
|
+
* {@link ErrorMessages.MV_0001}
|
|
14
|
+
* {@link ErrorMessages.MV_0002}
|
|
15
|
+
* {@link ErrorMessages.IE_0001}
|
|
16
|
+
* {@link ErrorMessages.IV_0001}
|
|
17
|
+
*/
|
|
18
|
+
constructor(settings: BrowserSettings);
|
|
19
|
+
/**
|
|
20
|
+
* Runs the initialization logic. Enables packages and create cookies for CloudSDK.
|
|
21
|
+
*/
|
|
22
|
+
initialize(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Runs any necessary side effects.
|
|
25
|
+
*/
|
|
26
|
+
private sideEffects;
|
|
27
|
+
/**
|
|
28
|
+
* Validates the core settings to ensure they meet required criteria.
|
|
29
|
+
*
|
|
30
|
+
* This function validates the provided core settings object to ensure that essential properties
|
|
31
|
+
* such as "sitecoreEdgeContextId" and "siteName" meet specific criteria and are not empty.
|
|
32
|
+
*
|
|
33
|
+
* @throws Error with specific error codes if any required property is missing or empty.
|
|
34
|
+
*/
|
|
35
|
+
private validateSettings;
|
|
36
|
+
private createSettings;
|
|
37
|
+
private createCookies;
|
|
38
|
+
}
|
|
39
|
+
export declare function getCloudSDKSettings(): Settings;
|
|
40
|
+
export declare function getEnabledPackage(packageName: string): PackageInitializer | undefined;
|
|
41
|
+
export declare let builderInstance: null | CloudSDKBrowserInitializer;
|
|
42
|
+
export declare function getCookiesValuesFromEdge(): ProxySettings;
|
|
43
|
+
/**
|
|
44
|
+
* Runs the initialization logic. Enables packages and create cookies for CloudSDK.
|
|
45
|
+
* @param settings - Common settings for the CloudSDK
|
|
46
|
+
* @returns An instance of {@link CloudSDKBrowserInitializer}
|
|
47
|
+
* @throws the following errors:
|
|
48
|
+
* {@link ErrorMessages.MV_0001}
|
|
49
|
+
* {@link ErrorMessages.MV_0002}
|
|
50
|
+
* {@link ErrorMessages.IE_0001}
|
|
51
|
+
* {@link ErrorMessages.IV_0001}
|
|
52
|
+
*/
|
|
53
|
+
export declare function CloudSDK(settings: BrowserSettings): CloudSDKBrowserInitializer;
|
|
54
|
+
declare global {
|
|
55
|
+
interface Personalize {
|
|
56
|
+
}
|
|
57
|
+
interface Window {
|
|
58
|
+
scCloudSDK: {
|
|
59
|
+
core: Core;
|
|
60
|
+
personalize: Personalize;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// © Sitecore Corporation A/S. All rights reserved. Sitecore® is a registered trademark of Sitecore Corporation A/S.
|
|
2
|
+
import { createCookieString, getCookie } from '@sitecore-cloudsdk/utils';
|
|
3
|
+
import { fetchBrowserIdFromEdgeProxy } from '../../browser-id/fetch-browser-id-from-edge-proxy';
|
|
4
|
+
import { getBrowserId } from '../../browser-id/get-browser-id';
|
|
5
|
+
import { COOKIE_NAME_PREFIX, DEFAULT_COOKIE_EXPIRY_DAYS, ErrorMessages, LIBRARY_VERSION, SITECORE_EDGE_URL } from '../../consts';
|
|
6
|
+
import { getDefaultCookieAttributes } from '../../cookie/get-default-cookie-attributes';
|
|
7
|
+
import { debug } from '../../debug/debug';
|
|
8
|
+
import { CORE_NAMESPACE } from '../../debug/namespaces';
|
|
9
|
+
import { getGuestId } from '../../guest-id/get-guest-id';
|
|
10
|
+
export let cloudSDKSettings;
|
|
11
|
+
export const enabledPackages = new Map();
|
|
12
|
+
export let initCoreState = null;
|
|
13
|
+
export let cookiesValuesFromEdge;
|
|
14
|
+
export class CloudSDKBrowserInitializer {
|
|
15
|
+
/**
|
|
16
|
+
* Runs the initialization logic. Enables packages and create cookies for CloudSDK.
|
|
17
|
+
* @param settings - Common settings for the CloudSDK
|
|
18
|
+
* @throws the following errors:
|
|
19
|
+
* {@link ErrorMessages.MV_0001}
|
|
20
|
+
* {@link ErrorMessages.MV_0002}
|
|
21
|
+
* {@link ErrorMessages.IE_0001}
|
|
22
|
+
* {@link ErrorMessages.IV_0001}
|
|
23
|
+
*/
|
|
24
|
+
constructor(settings) {
|
|
25
|
+
if (typeof window === 'undefined')
|
|
26
|
+
throw new Error(ErrorMessages.IE_0001);
|
|
27
|
+
this.validateSettings(settings);
|
|
28
|
+
cloudSDKSettings = this.createSettings(settings);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Runs the initialization logic. Enables packages and create cookies for CloudSDK.
|
|
32
|
+
*/
|
|
33
|
+
initialize() {
|
|
34
|
+
if (!enabledPackages.size)
|
|
35
|
+
debug(CORE_NAMESPACE)('CloudSDK was initialized with no packages');
|
|
36
|
+
if (cloudSDKSettings.cookieSettings.enableBrowserCookie)
|
|
37
|
+
initCoreState = this.createCookies();
|
|
38
|
+
else
|
|
39
|
+
initCoreState = Promise.resolve();
|
|
40
|
+
this.sideEffects();
|
|
41
|
+
enabledPackages.forEach((pkg) => {
|
|
42
|
+
pkg.exec();
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Runs any necessary side effects.
|
|
47
|
+
*/
|
|
48
|
+
sideEffects() {
|
|
49
|
+
window.scCloudSDK = {
|
|
50
|
+
...window.scCloudSDK,
|
|
51
|
+
core: {
|
|
52
|
+
getBrowserId,
|
|
53
|
+
getGuestId,
|
|
54
|
+
settings: {
|
|
55
|
+
sitecoreEdgeContextId: cloudSDKSettings.sitecoreEdgeContextId,
|
|
56
|
+
sitecoreEdgeUrl: cloudSDKSettings.sitecoreEdgeUrl
|
|
57
|
+
},
|
|
58
|
+
version: LIBRARY_VERSION
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Validates the core settings to ensure they meet required criteria.
|
|
64
|
+
*
|
|
65
|
+
* This function validates the provided core settings object to ensure that essential properties
|
|
66
|
+
* such as "sitecoreEdgeContextId" and "siteName" meet specific criteria and are not empty.
|
|
67
|
+
*
|
|
68
|
+
* @throws Error with specific error codes if any required property is missing or empty.
|
|
69
|
+
*/
|
|
70
|
+
validateSettings(settings) {
|
|
71
|
+
const { sitecoreEdgeContextId, siteName, sitecoreEdgeUrl } = settings;
|
|
72
|
+
if (!sitecoreEdgeContextId || sitecoreEdgeContextId.trim().length === 0)
|
|
73
|
+
throw new Error(ErrorMessages.MV_0001);
|
|
74
|
+
if (!siteName || siteName.trim().length === 0)
|
|
75
|
+
throw new Error(ErrorMessages.MV_0002);
|
|
76
|
+
if (sitecoreEdgeUrl !== undefined)
|
|
77
|
+
try {
|
|
78
|
+
new URL(sitecoreEdgeUrl);
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
throw new Error(ErrorMessages.IV_0001);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
createSettings(settings) {
|
|
85
|
+
const { siteName, sitecoreEdgeContextId, cookieDomain, cookiePath, cookieExpiryDays, sitecoreEdgeUrl, enableBrowserCookie } = settings;
|
|
86
|
+
return {
|
|
87
|
+
cookieSettings: {
|
|
88
|
+
domain: cookieDomain,
|
|
89
|
+
enableBrowserCookie: enableBrowserCookie ?? false,
|
|
90
|
+
expiryDays: cookieExpiryDays || DEFAULT_COOKIE_EXPIRY_DAYS,
|
|
91
|
+
name: {
|
|
92
|
+
browserId: `${COOKIE_NAME_PREFIX}${sitecoreEdgeContextId}`
|
|
93
|
+
},
|
|
94
|
+
path: cookiePath || '/'
|
|
95
|
+
},
|
|
96
|
+
siteName,
|
|
97
|
+
sitecoreEdgeContextId,
|
|
98
|
+
sitecoreEdgeUrl: sitecoreEdgeUrl ?? SITECORE_EDGE_URL
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
async createCookies() {
|
|
102
|
+
const attributes = getDefaultCookieAttributes(cloudSDKSettings.cookieSettings.expiryDays, cloudSDKSettings.cookieSettings.domain);
|
|
103
|
+
const browserIdCookie = getCookie(window.document.cookie, cloudSDKSettings.cookieSettings.name.browserId);
|
|
104
|
+
if (browserIdCookie)
|
|
105
|
+
return;
|
|
106
|
+
const cookiesValues = await fetchBrowserIdFromEdgeProxy(cloudSDKSettings.sitecoreEdgeUrl, cloudSDKSettings.sitecoreEdgeContextId);
|
|
107
|
+
document.cookie = createCookieString(cloudSDKSettings.cookieSettings.name.browserId, cookiesValues.browserId, attributes);
|
|
108
|
+
cookiesValuesFromEdge = cookiesValues;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export function getCloudSDKSettings() {
|
|
112
|
+
if (!cloudSDKSettings)
|
|
113
|
+
throw new Error(ErrorMessages.IE_0012);
|
|
114
|
+
return cloudSDKSettings;
|
|
115
|
+
}
|
|
116
|
+
export function getEnabledPackage(packageName) {
|
|
117
|
+
return enabledPackages.get(packageName);
|
|
118
|
+
}
|
|
119
|
+
export let builderInstance = null;
|
|
120
|
+
export function getCookiesValuesFromEdge() {
|
|
121
|
+
return cookiesValuesFromEdge;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Runs the initialization logic. Enables packages and create cookies for CloudSDK.
|
|
125
|
+
* @param settings - Common settings for the CloudSDK
|
|
126
|
+
* @returns An instance of {@link CloudSDKBrowserInitializer}
|
|
127
|
+
* @throws the following errors:
|
|
128
|
+
* {@link ErrorMessages.MV_0001}
|
|
129
|
+
* {@link ErrorMessages.MV_0002}
|
|
130
|
+
* {@link ErrorMessages.IE_0001}
|
|
131
|
+
* {@link ErrorMessages.IV_0001}
|
|
132
|
+
*/
|
|
133
|
+
export function CloudSDK(settings) {
|
|
134
|
+
builderInstance = new CloudSDKBrowserInitializer(settings);
|
|
135
|
+
return builderInstance;
|
|
136
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface BrowserSettings {
|
|
2
|
+
sitecoreEdgeContextId: string;
|
|
3
|
+
siteName: string;
|
|
4
|
+
enableBrowserCookie?: boolean;
|
|
5
|
+
cookieDomain?: string;
|
|
6
|
+
cookieExpiryDays?: number;
|
|
7
|
+
cookiePath?: string;
|
|
8
|
+
sitecoreEdgeUrl?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface Settings {
|
|
11
|
+
sitecoreEdgeContextId: string;
|
|
12
|
+
siteName: string;
|
|
13
|
+
sitecoreEdgeUrl: string;
|
|
14
|
+
cookieSettings: {
|
|
15
|
+
name: {
|
|
16
|
+
browserId: string;
|
|
17
|
+
};
|
|
18
|
+
domain?: string;
|
|
19
|
+
expiryDays: number;
|
|
20
|
+
path?: string;
|
|
21
|
+
enableBrowserCookie?: boolean;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export interface PackageContextDependency {
|
|
25
|
+
name: string;
|
|
26
|
+
method: string;
|
|
27
|
+
}
|
|
28
|
+
export interface PackageContext {
|
|
29
|
+
sideEffects: () => Promise<void>;
|
|
30
|
+
settings?: unknown;
|
|
31
|
+
dependencies?: PackageContextDependency[];
|
|
32
|
+
}
|
|
33
|
+
export interface Core {
|
|
34
|
+
getBrowserId: () => string;
|
|
35
|
+
getGuestId: () => Promise<string>;
|
|
36
|
+
settings: {
|
|
37
|
+
sitecoreEdgeContextId: string;
|
|
38
|
+
sitecoreEdgeUrl: string;
|
|
39
|
+
};
|
|
40
|
+
version: string;
|
|
41
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { PackageContext } from './interfaces';
|
|
2
|
+
export declare class PackageInitializer {
|
|
3
|
+
private _initState;
|
|
4
|
+
private _settings?;
|
|
5
|
+
private _sideEffects;
|
|
6
|
+
private _dependencies;
|
|
7
|
+
constructor(packageContext: PackageContext);
|
|
8
|
+
private validatePackages;
|
|
9
|
+
exec(): void;
|
|
10
|
+
private wrapSideEffects;
|
|
11
|
+
get initState(): Promise<void> | null;
|
|
12
|
+
get settings(): unknown;
|
|
13
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// © Sitecore Corporation A/S. All rights reserved. Sitecore® is a registered trademark of Sitecore Corporation A/S.
|
|
2
|
+
import { getEnabledPackage, initCoreState } from './initializer';
|
|
3
|
+
export class PackageInitializer {
|
|
4
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
5
|
+
constructor(packageContext) {
|
|
6
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
7
|
+
this._initState = null;
|
|
8
|
+
this._sideEffects = packageContext.sideEffects;
|
|
9
|
+
this._settings = packageContext.settings;
|
|
10
|
+
this._dependencies = packageContext.dependencies ?? [];
|
|
11
|
+
}
|
|
12
|
+
validatePackages() {
|
|
13
|
+
const validatedPackages = [];
|
|
14
|
+
this._dependencies.forEach((dependency) => {
|
|
15
|
+
// The package name is the name found in each package's package.json file e.g. @sitecore-cloudsdk/core"
|
|
16
|
+
const depName = dependency.name.split('/')[1];
|
|
17
|
+
const pkg = getEnabledPackage(dependency.name);
|
|
18
|
+
if (!pkg)
|
|
19
|
+
throw new Error(
|
|
20
|
+
// eslint-disable-next-line max-len
|
|
21
|
+
`[IE-0020] - This functionality also requires the "${depName}" package. Import "${dependency.name}/browser", then run ".${dependency.method}()" on "CloudSDK", before ".initialize()"`);
|
|
22
|
+
validatedPackages.push(pkg);
|
|
23
|
+
});
|
|
24
|
+
return validatedPackages;
|
|
25
|
+
}
|
|
26
|
+
exec() {
|
|
27
|
+
const validatedPackages = this.validatePackages();
|
|
28
|
+
this._initState = this.wrapSideEffects(validatedPackages);
|
|
29
|
+
}
|
|
30
|
+
async wrapSideEffects(validatedPackages) {
|
|
31
|
+
await initCoreState;
|
|
32
|
+
await Promise.all(validatedPackages.map((pkg) => pkg.initState));
|
|
33
|
+
this._sideEffects();
|
|
34
|
+
}
|
|
35
|
+
get initState() {
|
|
36
|
+
return this._initState;
|
|
37
|
+
}
|
|
38
|
+
get settings() {
|
|
39
|
+
return this._settings;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Request, Response } from '@sitecore-cloudsdk/utils';
|
|
2
|
+
import type { ProxySettings } from '../../interfaces';
|
|
3
|
+
import type { ServerSettings, Settings } from './interfaces';
|
|
4
|
+
import type { PackageInitializerServer } from './package-initializer';
|
|
5
|
+
export declare let cloudSDKSettings: Settings;
|
|
6
|
+
export declare const enabledPackages: Map<string, PackageInitializerServer>;
|
|
7
|
+
export declare let cloudSKDRequest: Request;
|
|
8
|
+
export declare let cloudSKDResponse: Response;
|
|
9
|
+
export declare class CloudSDKServerInitializer {
|
|
10
|
+
private request;
|
|
11
|
+
private response;
|
|
12
|
+
/**
|
|
13
|
+
* Runs the initialization logic. Enables packages and create cookies for CloudSDK.
|
|
14
|
+
* @param request - The request object, either a Middleware Request or an HTTP Request
|
|
15
|
+
* @param response - The response object, either a Middleware Next Response or an HTTP Response
|
|
16
|
+
* @param settings - Common settings for the CloudSDK
|
|
17
|
+
* @throws the following errors:
|
|
18
|
+
* {@link ErrorMessages.MV_0001}
|
|
19
|
+
* {@link ErrorMessages.MV_0002}
|
|
20
|
+
* {@link ErrorMessages.IV_0001}
|
|
21
|
+
*/
|
|
22
|
+
constructor(request: Request, response: Response, settings: ServerSettings);
|
|
23
|
+
/**
|
|
24
|
+
* Runs the initialization logic. Enables packages and create cookies for CloudSDK.
|
|
25
|
+
*/
|
|
26
|
+
initialize(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Validates the core settings to ensure they meet required criteria.
|
|
29
|
+
*
|
|
30
|
+
* This function validates the provided core settings object to ensure that essential properties
|
|
31
|
+
* such as "sitecoreEdgeContextId" and "siteName" meet specific criteria and are not empty.
|
|
32
|
+
*
|
|
33
|
+
* @throws Error with specific error codes if any required property is missing or empty.
|
|
34
|
+
*/
|
|
35
|
+
private validateSettings;
|
|
36
|
+
private createSettings;
|
|
37
|
+
private createCookies;
|
|
38
|
+
private handleNextJsMiddlewareCookie;
|
|
39
|
+
private handleHttpCookie;
|
|
40
|
+
}
|
|
41
|
+
export declare function getCloudSDKSettings(): Settings;
|
|
42
|
+
export declare function getEnabledPackage(packageName: string): PackageInitializerServer | undefined;
|
|
43
|
+
export declare function getCloudSDKRequest(): Request;
|
|
44
|
+
export declare function getCloudSDKResponse(): Response;
|
|
45
|
+
export declare function getCookiesValuesFromEdge(): ProxySettings;
|
|
46
|
+
export declare let builderInstance: null | CloudSDKServerInitializer;
|
|
47
|
+
/**
|
|
48
|
+
* Runs the initialization logic. Enables packages and create cookies for CloudSDK.
|
|
49
|
+
* @param request - The request object, either a Middleware Request or an HTTP Request
|
|
50
|
+
* @param response - The response object, either a Middleware Next Response or an HTTP Response
|
|
51
|
+
* @param settings - Common settings for the CloudSDK
|
|
52
|
+
* @returns An instance of {@link CloudSDKServerInitializer}
|
|
53
|
+
* @throws the following errors:
|
|
54
|
+
* {@link ErrorMessages.MV_0001}
|
|
55
|
+
* {@link ErrorMessages.MV_0002}
|
|
56
|
+
* {@link ErrorMessages.IV_0001}
|
|
57
|
+
*/
|
|
58
|
+
export declare function CloudSDK(request: Request, response: Response, settings: ServerSettings): CloudSDKServerInitializer;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { createCookieString, getCookieServerSide, isHttpRequest, isHttpResponse, isNextJsMiddlewareRequest, isNextJsMiddlewareResponse } from '@sitecore-cloudsdk/utils';
|
|
2
|
+
import { fetchBrowserIdFromEdgeProxy } from '../../browser-id/fetch-browser-id-from-edge-proxy';
|
|
3
|
+
import { COOKIE_NAME_PREFIX, DEFAULT_COOKIE_EXPIRY_DAYS, ErrorMessages, SITECORE_EDGE_URL } from '../../consts';
|
|
4
|
+
import { getCookieValueFromMiddlewareRequest } from '../../cookie/get-cookie-value-from-middleware-request';
|
|
5
|
+
import { getDefaultCookieAttributes } from '../../cookie/get-default-cookie-attributes';
|
|
6
|
+
import { debug } from '../../debug/debug';
|
|
7
|
+
import { CORE_NAMESPACE } from '../../debug/namespaces';
|
|
8
|
+
export let cloudSDKSettings;
|
|
9
|
+
export const enabledPackages = new Map();
|
|
10
|
+
let cookiesValuesFromEdge;
|
|
11
|
+
export let cloudSKDRequest;
|
|
12
|
+
export let cloudSKDResponse;
|
|
13
|
+
export class CloudSDKServerInitializer {
|
|
14
|
+
/**
|
|
15
|
+
* Runs the initialization logic. Enables packages and create cookies for CloudSDK.
|
|
16
|
+
* @param request - The request object, either a Middleware Request or an HTTP Request
|
|
17
|
+
* @param response - The response object, either a Middleware Next Response or an HTTP Response
|
|
18
|
+
* @param settings - Common settings for the CloudSDK
|
|
19
|
+
* @throws the following errors:
|
|
20
|
+
* {@link ErrorMessages.MV_0001}
|
|
21
|
+
* {@link ErrorMessages.MV_0002}
|
|
22
|
+
* {@link ErrorMessages.IV_0001}
|
|
23
|
+
*/
|
|
24
|
+
constructor(request, response, settings) {
|
|
25
|
+
this.validateSettings(settings);
|
|
26
|
+
cloudSDKSettings = this.createSettings(settings);
|
|
27
|
+
this.request = request;
|
|
28
|
+
this.response = response;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Runs the initialization logic. Enables packages and create cookies for CloudSDK.
|
|
32
|
+
*/
|
|
33
|
+
async initialize() {
|
|
34
|
+
if (!enabledPackages.size)
|
|
35
|
+
debug(CORE_NAMESPACE)('CloudSDK was initialized with no packages');
|
|
36
|
+
if (cloudSDKSettings.cookieSettings.enableServerCookie)
|
|
37
|
+
await this.createCookies();
|
|
38
|
+
const execs = Array.from(enabledPackages).map(([, value]) => value.exec());
|
|
39
|
+
await Promise.all(execs);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Validates the core settings to ensure they meet required criteria.
|
|
43
|
+
*
|
|
44
|
+
* This function validates the provided core settings object to ensure that essential properties
|
|
45
|
+
* such as "sitecoreEdgeContextId" and "siteName" meet specific criteria and are not empty.
|
|
46
|
+
*
|
|
47
|
+
* @throws Error with specific error codes if any required property is missing or empty.
|
|
48
|
+
*/
|
|
49
|
+
validateSettings(settings) {
|
|
50
|
+
const { sitecoreEdgeContextId, siteName, sitecoreEdgeUrl } = settings;
|
|
51
|
+
if (!sitecoreEdgeContextId || sitecoreEdgeContextId.trim().length === 0)
|
|
52
|
+
throw new Error(ErrorMessages.MV_0001);
|
|
53
|
+
if (!siteName || siteName.trim().length === 0)
|
|
54
|
+
throw new Error(ErrorMessages.MV_0002);
|
|
55
|
+
if (sitecoreEdgeUrl !== undefined)
|
|
56
|
+
try {
|
|
57
|
+
new URL(sitecoreEdgeUrl);
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
throw new Error(ErrorMessages.IV_0001);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
createSettings(settings) {
|
|
64
|
+
const { siteName, sitecoreEdgeContextId, cookieDomain, cookiePath, cookieExpiryDays, sitecoreEdgeUrl, enableServerCookie, timeout } = settings;
|
|
65
|
+
return {
|
|
66
|
+
cookieSettings: {
|
|
67
|
+
domain: cookieDomain,
|
|
68
|
+
enableServerCookie: enableServerCookie ?? false,
|
|
69
|
+
expiryDays: cookieExpiryDays || DEFAULT_COOKIE_EXPIRY_DAYS,
|
|
70
|
+
name: {
|
|
71
|
+
browserId: `${COOKIE_NAME_PREFIX}${sitecoreEdgeContextId}`
|
|
72
|
+
},
|
|
73
|
+
path: cookiePath || '/'
|
|
74
|
+
},
|
|
75
|
+
siteName,
|
|
76
|
+
sitecoreEdgeContextId,
|
|
77
|
+
sitecoreEdgeUrl: sitecoreEdgeUrl ?? SITECORE_EDGE_URL,
|
|
78
|
+
timeout
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
async createCookies() {
|
|
82
|
+
if (isNextJsMiddlewareRequest(this.request) && isNextJsMiddlewareResponse(this.response))
|
|
83
|
+
await this.handleNextJsMiddlewareCookie();
|
|
84
|
+
else if (isHttpRequest(this.request) && isHttpResponse(this.response))
|
|
85
|
+
await this.handleHttpCookie();
|
|
86
|
+
}
|
|
87
|
+
async handleNextJsMiddlewareCookie() {
|
|
88
|
+
const request = this.request;
|
|
89
|
+
const response = this.response;
|
|
90
|
+
const { browserId: browserIdName } = cloudSDKSettings.cookieSettings.name;
|
|
91
|
+
let browserIdCookieValue = getCookieValueFromMiddlewareRequest(request, browserIdName);
|
|
92
|
+
if (!browserIdCookieValue) {
|
|
93
|
+
const cookieValues = await fetchBrowserIdFromEdgeProxy(cloudSDKSettings.sitecoreEdgeUrl, cloudSDKSettings.sitecoreEdgeContextId, cloudSDKSettings.timeout);
|
|
94
|
+
browserIdCookieValue = cookieValues.browserId;
|
|
95
|
+
cookiesValuesFromEdge = cookieValues;
|
|
96
|
+
}
|
|
97
|
+
const defaultCookieAttributes = getDefaultCookieAttributes(cloudSDKSettings.cookieSettings.expiryDays, cloudSDKSettings.cookieSettings.domain);
|
|
98
|
+
request.cookies.set(browserIdName, browserIdCookieValue, defaultCookieAttributes);
|
|
99
|
+
response.cookies.set(browserIdName, browserIdCookieValue, defaultCookieAttributes);
|
|
100
|
+
}
|
|
101
|
+
async handleHttpCookie() {
|
|
102
|
+
const request = this.request;
|
|
103
|
+
const response = this.response;
|
|
104
|
+
const browserIdName = cloudSDKSettings.cookieSettings.name.browserId;
|
|
105
|
+
const browserIdCookie = getCookieServerSide(request.headers.cookie, browserIdName);
|
|
106
|
+
let browserIdCookieValue;
|
|
107
|
+
const defaultCookieAttributes = getDefaultCookieAttributes(cloudSDKSettings.cookieSettings.expiryDays, cloudSDKSettings.cookieSettings.domain);
|
|
108
|
+
if (!browserIdCookie) {
|
|
109
|
+
const cookieValues = await fetchBrowserIdFromEdgeProxy(cloudSDKSettings.sitecoreEdgeUrl, cloudSDKSettings.sitecoreEdgeContextId, cloudSDKSettings.timeout);
|
|
110
|
+
browserIdCookieValue = cookieValues.browserId;
|
|
111
|
+
cookiesValuesFromEdge = cookieValues;
|
|
112
|
+
}
|
|
113
|
+
else
|
|
114
|
+
browserIdCookieValue = browserIdCookie.value;
|
|
115
|
+
const browserIdCookieString = createCookieString(browserIdName, browserIdCookieValue, defaultCookieAttributes);
|
|
116
|
+
if (!browserIdCookie)
|
|
117
|
+
request.headers.cookie = request.headers.cookie
|
|
118
|
+
? request.headers.cookie + '; ' + browserIdCookieString
|
|
119
|
+
: browserIdCookieString;
|
|
120
|
+
response.setHeader('Set-Cookie', browserIdCookieString);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export function getCloudSDKSettings() {
|
|
124
|
+
if (!cloudSDKSettings)
|
|
125
|
+
throw new Error(ErrorMessages.IE_0013);
|
|
126
|
+
return cloudSDKSettings;
|
|
127
|
+
}
|
|
128
|
+
export function getEnabledPackage(packageName) {
|
|
129
|
+
return enabledPackages.get(packageName);
|
|
130
|
+
}
|
|
131
|
+
export function getCloudSDKRequest() {
|
|
132
|
+
return cloudSKDRequest;
|
|
133
|
+
}
|
|
134
|
+
export function getCloudSDKResponse() {
|
|
135
|
+
return cloudSKDResponse;
|
|
136
|
+
}
|
|
137
|
+
export function getCookiesValuesFromEdge() {
|
|
138
|
+
return cookiesValuesFromEdge;
|
|
139
|
+
}
|
|
140
|
+
export let builderInstance = null;
|
|
141
|
+
/**
|
|
142
|
+
* Runs the initialization logic. Enables packages and create cookies for CloudSDK.
|
|
143
|
+
* @param request - The request object, either a Middleware Request or an HTTP Request
|
|
144
|
+
* @param response - The response object, either a Middleware Next Response or an HTTP Response
|
|
145
|
+
* @param settings - Common settings for the CloudSDK
|
|
146
|
+
* @returns An instance of {@link CloudSDKServerInitializer}
|
|
147
|
+
* @throws the following errors:
|
|
148
|
+
* {@link ErrorMessages.MV_0001}
|
|
149
|
+
* {@link ErrorMessages.MV_0002}
|
|
150
|
+
* {@link ErrorMessages.IV_0001}
|
|
151
|
+
*/
|
|
152
|
+
export function CloudSDK(request, response, settings) {
|
|
153
|
+
cloudSKDRequest = request;
|
|
154
|
+
cloudSKDResponse = response;
|
|
155
|
+
builderInstance = new CloudSDKServerInitializer(request, response, settings);
|
|
156
|
+
return builderInstance;
|
|
157
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface ServerSettings {
|
|
2
|
+
sitecoreEdgeContextId: string;
|
|
3
|
+
siteName: string;
|
|
4
|
+
enableServerCookie?: boolean;
|
|
5
|
+
cookieDomain?: string;
|
|
6
|
+
cookieExpiryDays?: number;
|
|
7
|
+
cookiePath?: string;
|
|
8
|
+
sitecoreEdgeUrl?: string;
|
|
9
|
+
timeout?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface Settings {
|
|
12
|
+
sitecoreEdgeContextId: string;
|
|
13
|
+
siteName: string;
|
|
14
|
+
sitecoreEdgeUrl: string;
|
|
15
|
+
timeout?: number;
|
|
16
|
+
cookieSettings: {
|
|
17
|
+
name: {
|
|
18
|
+
browserId: string;
|
|
19
|
+
};
|
|
20
|
+
domain?: string;
|
|
21
|
+
expiryDays: number;
|
|
22
|
+
path?: string;
|
|
23
|
+
enableServerCookie?: boolean;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export interface PackageContextDependencyServer {
|
|
27
|
+
name: string;
|
|
28
|
+
method: string;
|
|
29
|
+
}
|
|
30
|
+
export interface PackageContext {
|
|
31
|
+
sideEffects: () => Promise<void>;
|
|
32
|
+
settings?: unknown;
|
|
33
|
+
dependencies?: PackageContextDependencyServer[];
|
|
34
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PackageContext } from './interfaces';
|
|
2
|
+
export declare class PackageInitializerServer {
|
|
3
|
+
private _settings;
|
|
4
|
+
private _sideEffects;
|
|
5
|
+
private _dependencies;
|
|
6
|
+
constructor(packageContext: PackageContext);
|
|
7
|
+
private checkDependencies;
|
|
8
|
+
exec(): Promise<void>;
|
|
9
|
+
get settings(): unknown;
|
|
10
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// © Sitecore Corporation A/S. All rights reserved. Sitecore® is a registered trademark of Sitecore Corporation A/S.
|
|
2
|
+
import { getEnabledPackage } from './initializer';
|
|
3
|
+
export class PackageInitializerServer {
|
|
4
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
5
|
+
constructor(packageContext) {
|
|
6
|
+
this._sideEffects = packageContext.sideEffects;
|
|
7
|
+
this._settings = packageContext.settings;
|
|
8
|
+
this._dependencies = packageContext.dependencies ?? [];
|
|
9
|
+
}
|
|
10
|
+
checkDependencies() {
|
|
11
|
+
this._dependencies.forEach((dependency) => {
|
|
12
|
+
// The package name is the name found in each package's package.json file e.g. @sitecore-cloudsdk/core"
|
|
13
|
+
const depName = dependency.name.split('/')[1];
|
|
14
|
+
if (!getEnabledPackage(dependency.name))
|
|
15
|
+
throw new Error(// eslint-disable-next-line max-len
|
|
16
|
+
`[IE-0021] - This functionality also requires the "${depName}" package. Import "${dependency.name}/server", then run ".${dependency.method}()" on "CloudSDK", before ".initialize()"`);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
async exec() {
|
|
20
|
+
this.checkDependencies();
|
|
21
|
+
await this._sideEffects();
|
|
22
|
+
}
|
|
23
|
+
get settings() {
|
|
24
|
+
return this._settings;
|
|
25
|
+
}
|
|
26
|
+
}
|