@lwrjs/lwc-ssr 0.15.7 → 0.15.9
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/build/cjs/fetchController.cjs +25 -17
- package/build/es/fetchController.js +29 -19
- package/package.json +8 -8
|
@@ -106,8 +106,8 @@ var FetchController = class {
|
|
|
106
106
|
}
|
|
107
107
|
createFetchEndowment() {
|
|
108
108
|
return (request, init) => {
|
|
109
|
-
const {host = "", requestDepth = 1, coreProxy} = this;
|
|
110
|
-
const origin = coreProxy?.origin && coreProxy.origin.startsWith("http") ? coreProxy.origin :
|
|
109
|
+
const {host: forwardedOrigin = "", requestDepth = 1, coreProxy} = this;
|
|
110
|
+
const origin = coreProxy?.origin && coreProxy.origin.startsWith("http") ? coreProxy.origin : forwardedOrigin;
|
|
111
111
|
const {finalRequest, finalUrl} = this.getFinalRequest(request, origin);
|
|
112
112
|
const finalInit = {
|
|
113
113
|
...init,
|
|
@@ -116,7 +116,7 @@ var FetchController = class {
|
|
|
116
116
|
[import_shared_utils.REQUEST_DEPTH_HEADER]: String(requestDepth)
|
|
117
117
|
}
|
|
118
118
|
};
|
|
119
|
-
if (coreProxy ||
|
|
119
|
+
if (coreProxy || forwardedOrigin && finalUrl.startsWith(forwardedOrigin)) {
|
|
120
120
|
finalInit.headers[ROUTE_CORE_HEADER] = "true";
|
|
121
121
|
}
|
|
122
122
|
const proxyStr = coreProxy ? JSON.stringify(coreProxy) : "none";
|
|
@@ -127,7 +127,13 @@ var FetchController = class {
|
|
|
127
127
|
});
|
|
128
128
|
return (0, import_instrumentation.getTracer)().trace({
|
|
129
129
|
name: import_instrumentation.ViewSpan.Fetch,
|
|
130
|
-
attributes: {
|
|
130
|
+
attributes: {
|
|
131
|
+
url: finalUrl,
|
|
132
|
+
fetchType: "cdn",
|
|
133
|
+
forwardedOrigin,
|
|
134
|
+
coreProxy: proxyStr,
|
|
135
|
+
hasCookies
|
|
136
|
+
}
|
|
131
137
|
}, (span) => {
|
|
132
138
|
const addInfoToSpan = (res) => {
|
|
133
139
|
res.url && span.setAttributes({url: res.url});
|
|
@@ -135,8 +141,8 @@ var FetchController = class {
|
|
|
135
141
|
return res;
|
|
136
142
|
};
|
|
137
143
|
if (coreProxy) {
|
|
138
|
-
return this.fetchWithAgent(finalUrl, finalInit,
|
|
139
|
-
const {finalRequest: cdnRequest, finalUrl: cdnUrl} = this.getFinalRequest(request,
|
|
144
|
+
return this.fetchWithAgent(finalUrl, finalInit, forwardedOrigin, coreProxy, span).then((res) => addInfoToSpan(res)).catch((err) => {
|
|
145
|
+
const {finalRequest: cdnRequest, finalUrl: cdnUrl} = this.getFinalRequest(request, forwardedOrigin);
|
|
140
146
|
import_diagnostics.logger.warn(`Fetching data directly from Core failed, retrying through CDN: ${cdnUrl} Error is: ${err.message || err}`);
|
|
141
147
|
span.setAttributes({fetchType: "cdnFallback"});
|
|
142
148
|
return fetch(cdnRequest, finalInit).then((res) => addInfoToSpan(res));
|
|
@@ -146,13 +152,13 @@ var FetchController = class {
|
|
|
146
152
|
});
|
|
147
153
|
};
|
|
148
154
|
}
|
|
149
|
-
getFinalRequest(request,
|
|
155
|
+
getFinalRequest(request, origin) {
|
|
150
156
|
let finalRequest;
|
|
151
157
|
let finalUrl;
|
|
152
158
|
if (request instanceof Request) {
|
|
153
159
|
const curUrl = request.url;
|
|
154
160
|
if (curUrl.startsWith("/")) {
|
|
155
|
-
finalUrl =
|
|
161
|
+
finalUrl = origin + curUrl;
|
|
156
162
|
finalRequest = new Request(finalUrl, request);
|
|
157
163
|
} else {
|
|
158
164
|
finalUrl = curUrl;
|
|
@@ -160,20 +166,22 @@ var FetchController = class {
|
|
|
160
166
|
}
|
|
161
167
|
} else {
|
|
162
168
|
const curUrl = typeof request === "string" ? request : request.toString();
|
|
163
|
-
finalRequest = finalUrl = curUrl.startsWith("/") ?
|
|
169
|
+
finalRequest = finalUrl = curUrl.startsWith("/") ? origin + curUrl : curUrl;
|
|
164
170
|
}
|
|
165
171
|
return {finalRequest, finalUrl};
|
|
166
172
|
}
|
|
167
|
-
async fetchWithAgent(rawUrl, init,
|
|
173
|
+
async fetchWithAgent(rawUrl, init, forwardedOrigin, coreProxy, span) {
|
|
168
174
|
let {origin, servername} = coreProxy;
|
|
169
|
-
const
|
|
175
|
+
const forwardedHostname = (0, import_shared_utils.originToHostname)(forwardedOrigin);
|
|
176
|
+
const hostHeader = coreProxy.host ?? forwardedHostname;
|
|
170
177
|
const ENHANCED_DOMAIN_TLD = ".site.com";
|
|
171
178
|
const MY_DOMAIN_TLD = ".salesforce.com";
|
|
172
|
-
if (
|
|
173
|
-
|
|
174
|
-
|
|
179
|
+
if (forwardedHostname.endsWith(ENHANCED_DOMAIN_TLD)) {
|
|
180
|
+
const myHostname = forwardedHostname.slice(0, -ENHANCED_DOMAIN_TLD.length) + MY_DOMAIN_TLD;
|
|
181
|
+
origin = "https://" + myHostname;
|
|
182
|
+
servername = myHostname;
|
|
175
183
|
} else if (origin.startsWith(".")) {
|
|
176
|
-
origin =
|
|
184
|
+
origin = "https://" + forwardedHostname + origin;
|
|
177
185
|
}
|
|
178
186
|
const urlParts = new URL(rawUrl);
|
|
179
187
|
const path = urlParts.pathname + urlParts.search;
|
|
@@ -182,7 +190,7 @@ var FetchController = class {
|
|
|
182
190
|
fetchType: "direct",
|
|
183
191
|
url,
|
|
184
192
|
coreUrl: url,
|
|
185
|
-
coreHostHeader:
|
|
193
|
+
coreHostHeader: hostHeader,
|
|
186
194
|
coreServername: servername
|
|
187
195
|
});
|
|
188
196
|
let client = CORE_CLIENTS.get(origin);
|
|
@@ -197,7 +205,7 @@ var FetchController = class {
|
|
|
197
205
|
...init,
|
|
198
206
|
method: init.method || "GET",
|
|
199
207
|
path,
|
|
200
|
-
headers: {...init?.headers, Host:
|
|
208
|
+
headers: {...init?.headers, Host: hostHeader},
|
|
201
209
|
servername
|
|
202
210
|
}).then(async (res) => {
|
|
203
211
|
span.setAttributes({coreStatusCode: res.statusCode});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Pool as ClientPool } from 'undici';
|
|
2
2
|
import { logger } from '@lwrjs/diagnostics';
|
|
3
3
|
import { getTracer, ViewSpan } from '@lwrjs/instrumentation';
|
|
4
|
-
import { REQUEST_DEPTH_HEADER } from '@lwrjs/shared-utils';
|
|
4
|
+
import { REQUEST_DEPTH_HEADER, originToHostname } from '@lwrjs/shared-utils';
|
|
5
5
|
const ROUTE_CORE_HEADER = 'X-SFDC-Route-Core';
|
|
6
6
|
// a single Lambda only services 1 org, so this cache will not grow too large
|
|
7
7
|
const CORE_CLIENTS = new Map();
|
|
@@ -112,8 +112,9 @@ export class FetchController {
|
|
|
112
112
|
}
|
|
113
113
|
createFetchEndowment() {
|
|
114
114
|
return (request, init) => {
|
|
115
|
-
const { host = '', requestDepth = 1, coreProxy } = this;
|
|
116
|
-
|
|
115
|
+
const { host: forwardedOrigin = '', requestDepth = 1, coreProxy } = this;
|
|
116
|
+
// The Direct-to-Core proxy origin takes precedence over the Forwarded host
|
|
117
|
+
const origin = coreProxy?.origin && coreProxy.origin.startsWith('http') ? coreProxy.origin : forwardedOrigin;
|
|
117
118
|
const { finalRequest, finalUrl } = this.getFinalRequest(request, origin);
|
|
118
119
|
const finalInit = {
|
|
119
120
|
...init,
|
|
@@ -122,7 +123,7 @@ export class FetchController {
|
|
|
122
123
|
[REQUEST_DEPTH_HEADER]: String(requestDepth),
|
|
123
124
|
},
|
|
124
125
|
};
|
|
125
|
-
if (coreProxy || (
|
|
126
|
+
if (coreProxy || (forwardedOrigin && finalUrl.startsWith(forwardedOrigin))) {
|
|
126
127
|
// hint for the CDN that the request is targeted to Core
|
|
127
128
|
finalInit.headers[ROUTE_CORE_HEADER] = 'true';
|
|
128
129
|
}
|
|
@@ -137,7 +138,13 @@ export class FetchController {
|
|
|
137
138
|
// Default URL to final URL if successful addInfoToSpan will replace with response.url
|
|
138
139
|
{
|
|
139
140
|
name: ViewSpan.Fetch,
|
|
140
|
-
attributes: {
|
|
141
|
+
attributes: {
|
|
142
|
+
url: finalUrl,
|
|
143
|
+
fetchType: 'cdn',
|
|
144
|
+
forwardedOrigin,
|
|
145
|
+
coreProxy: proxyStr,
|
|
146
|
+
hasCookies,
|
|
147
|
+
},
|
|
141
148
|
}, (span) => {
|
|
142
149
|
// this trace will NOT fail if fetch fails; it is meant to log the URLs fetched from the server
|
|
143
150
|
// the fetch caller (ie: getServerData) should handle the error if response.ok is false
|
|
@@ -150,10 +157,10 @@ export class FetchController {
|
|
|
150
157
|
return res;
|
|
151
158
|
};
|
|
152
159
|
if (coreProxy) {
|
|
153
|
-
return this.fetchWithAgent(finalUrl, finalInit,
|
|
160
|
+
return this.fetchWithAgent(finalUrl, finalInit, forwardedOrigin, coreProxy, span)
|
|
154
161
|
.then((res) => addInfoToSpan(res))
|
|
155
162
|
.catch((err) => {
|
|
156
|
-
const { finalRequest: cdnRequest, finalUrl: cdnUrl } = this.getFinalRequest(request,
|
|
163
|
+
const { finalRequest: cdnRequest, finalUrl: cdnUrl } = this.getFinalRequest(request, forwardedOrigin);
|
|
157
164
|
logger.warn(`Fetching data directly from Core failed, retrying through CDN: ${cdnUrl} Error is: ${err.message || err}`);
|
|
158
165
|
span.setAttributes({ fetchType: 'cdnFallback' });
|
|
159
166
|
return fetch(cdnRequest, finalInit).then((res) => addInfoToSpan(res));
|
|
@@ -163,14 +170,14 @@ export class FetchController {
|
|
|
163
170
|
});
|
|
164
171
|
};
|
|
165
172
|
}
|
|
166
|
-
getFinalRequest(request,
|
|
173
|
+
getFinalRequest(request, origin) {
|
|
167
174
|
let finalRequest;
|
|
168
175
|
let finalUrl;
|
|
169
176
|
if (request instanceof Request) {
|
|
170
177
|
const curUrl = request.url;
|
|
171
|
-
// proxy relative URLs through the
|
|
178
|
+
// proxy relative URLs through the origin
|
|
172
179
|
if (curUrl.startsWith('/')) {
|
|
173
|
-
finalUrl =
|
|
180
|
+
finalUrl = origin + curUrl;
|
|
174
181
|
finalRequest = new Request(finalUrl, request);
|
|
175
182
|
}
|
|
176
183
|
else {
|
|
@@ -180,25 +187,28 @@ export class FetchController {
|
|
|
180
187
|
}
|
|
181
188
|
else {
|
|
182
189
|
const curUrl = typeof request === 'string' ? request : request.toString(); // handle string-able types, eg: URL
|
|
183
|
-
finalRequest = finalUrl = curUrl.startsWith('/') ?
|
|
190
|
+
finalRequest = finalUrl = curUrl.startsWith('/') ? origin + curUrl : curUrl; // proxy relative URLs through the origin
|
|
184
191
|
}
|
|
185
192
|
return { finalRequest, finalUrl };
|
|
186
193
|
}
|
|
187
|
-
async fetchWithAgent(rawUrl, init,
|
|
194
|
+
async fetchWithAgent(rawUrl, init, forwardedOrigin, coreProxy, span) {
|
|
188
195
|
let { origin, servername } = coreProxy;
|
|
189
|
-
const
|
|
196
|
+
const forwardedHostname = originToHostname(forwardedOrigin);
|
|
197
|
+
const hostHeader = coreProxy.host ?? forwardedHostname;
|
|
190
198
|
const ENHANCED_DOMAIN_TLD = '.site.com';
|
|
191
199
|
const MY_DOMAIN_TLD = '.salesforce.com';
|
|
192
|
-
if (
|
|
200
|
+
if (forwardedHostname.endsWith(ENHANCED_DOMAIN_TLD)) {
|
|
201
|
+
const myHostname = forwardedHostname.slice(0, -ENHANCED_DOMAIN_TLD.length) + MY_DOMAIN_TLD;
|
|
193
202
|
// use the Salesforce TLD by replacing the Site TLD
|
|
194
203
|
// caller must be an Enhanced Domain on Cloudflare
|
|
195
|
-
origin =
|
|
204
|
+
origin = 'https://' + myHostname;
|
|
196
205
|
// do not use SNI with the Enhanced Domain route
|
|
197
|
-
|
|
206
|
+
// never include a protocol in the servername
|
|
207
|
+
servername = myHostname;
|
|
198
208
|
}
|
|
199
209
|
else if (origin.startsWith('.')) {
|
|
200
210
|
// use the CDN origin if the leading '.' is missing in the coreProxy origin
|
|
201
|
-
origin =
|
|
211
|
+
origin = 'https://' + forwardedHostname + origin;
|
|
202
212
|
}
|
|
203
213
|
const urlParts = new URL(rawUrl);
|
|
204
214
|
const path = urlParts.pathname + urlParts.search;
|
|
@@ -209,7 +219,7 @@ export class FetchController {
|
|
|
209
219
|
fetchType: 'direct',
|
|
210
220
|
url,
|
|
211
221
|
coreUrl: url,
|
|
212
|
-
coreHostHeader:
|
|
222
|
+
coreHostHeader: hostHeader,
|
|
213
223
|
coreServername: servername,
|
|
214
224
|
});
|
|
215
225
|
let client = CORE_CLIENTS.get(origin);
|
|
@@ -227,7 +237,7 @@ export class FetchController {
|
|
|
227
237
|
// @ts-ignore - HttpMethod not available for typecasting :|
|
|
228
238
|
method: init.method || 'GET',
|
|
229
239
|
path,
|
|
230
|
-
headers: { ...init?.headers, Host:
|
|
240
|
+
headers: { ...init?.headers, Host: hostHeader },
|
|
231
241
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
232
242
|
// @ts-ignore - not properly typed >:|
|
|
233
243
|
servername,
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
|
-
"version": "0.15.
|
|
7
|
+
"version": "0.15.9",
|
|
8
8
|
"homepage": "https://developer.salesforce.com/docs/platform/lwr/overview",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
@@ -42,17 +42,17 @@
|
|
|
42
42
|
"build/**/*.d.ts"
|
|
43
43
|
],
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@lwrjs/config": "0.15.
|
|
46
|
-
"@lwrjs/diagnostics": "0.15.
|
|
47
|
-
"@lwrjs/instrumentation": "0.15.
|
|
48
|
-
"@lwrjs/loader": "0.15.
|
|
49
|
-
"@lwrjs/shared-utils": "0.15.
|
|
45
|
+
"@lwrjs/config": "0.15.9",
|
|
46
|
+
"@lwrjs/diagnostics": "0.15.9",
|
|
47
|
+
"@lwrjs/instrumentation": "0.15.9",
|
|
48
|
+
"@lwrjs/loader": "0.15.9",
|
|
49
|
+
"@lwrjs/shared-utils": "0.15.9",
|
|
50
50
|
"fs-extra": "^11.2.0",
|
|
51
51
|
"lru-cache": "^10.4.3",
|
|
52
52
|
"undici": "^6.19.8"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@lwrjs/types": "0.15.
|
|
55
|
+
"@lwrjs/types": "0.15.9",
|
|
56
56
|
"jest": "^26.6.3",
|
|
57
57
|
"memfs": "^4.13.0",
|
|
58
58
|
"ts-jest": "^26.5.6"
|
|
@@ -63,5 +63,5 @@
|
|
|
63
63
|
"volta": {
|
|
64
64
|
"extends": "../../../package.json"
|
|
65
65
|
},
|
|
66
|
-
"gitHead": "
|
|
66
|
+
"gitHead": "281108b0e976f7302571a77d7f1d15136b9076e9"
|
|
67
67
|
}
|