@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.
@@ -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 : host;
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 || host && finalUrl.startsWith(host)) {
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: {url: finalUrl, fetchType: "cdn", coreProxy: proxyStr, hasCookies}
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, host, coreProxy, span).then((res) => addInfoToSpan(res)).catch((err) => {
139
- const {finalRequest: cdnRequest, finalUrl: cdnUrl} = this.getFinalRequest(request, host);
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, host) {
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 = host + curUrl;
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("/") ? host + curUrl : curUrl;
169
+ finalRequest = finalUrl = curUrl.startsWith("/") ? origin + curUrl : curUrl;
164
170
  }
165
171
  return {finalRequest, finalUrl};
166
172
  }
167
- async fetchWithAgent(rawUrl, init, forwardedHost, coreProxy, span) {
173
+ async fetchWithAgent(rawUrl, init, forwardedOrigin, coreProxy, span) {
168
174
  let {origin, servername} = coreProxy;
169
- const host = coreProxy.host ?? forwardedHost.replace(/^https?:\/\//, "");
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 (forwardedHost.endsWith(ENHANCED_DOMAIN_TLD)) {
173
- origin = forwardedHost.slice(0, -ENHANCED_DOMAIN_TLD.length) + MY_DOMAIN_TLD;
174
- servername = origin;
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 = forwardedHost + 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: host,
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: 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
- const origin = coreProxy?.origin && coreProxy.origin.startsWith('http') ? coreProxy.origin : host; // The Direct-to-Core proxy origin takes precedence over the Forwarded host
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 || (host && finalUrl.startsWith(host))) {
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: { url: finalUrl, fetchType: 'cdn', coreProxy: proxyStr, hasCookies },
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, host, coreProxy, span)
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, host);
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, host) {
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 host
178
+ // proxy relative URLs through the origin
172
179
  if (curUrl.startsWith('/')) {
173
- finalUrl = host + curUrl;
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('/') ? host + curUrl : curUrl; // proxy relative URLs through the host
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, forwardedHost, coreProxy, span) {
194
+ async fetchWithAgent(rawUrl, init, forwardedOrigin, coreProxy, span) {
188
195
  let { origin, servername } = coreProxy;
189
- const host = coreProxy.host ?? forwardedHost.replace(/^https?:\/\//, '');
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 (forwardedHost.endsWith(ENHANCED_DOMAIN_TLD)) {
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 = forwardedHost.slice(0, -ENHANCED_DOMAIN_TLD.length) + MY_DOMAIN_TLD;
204
+ origin = 'https://' + myHostname;
196
205
  // do not use SNI with the Enhanced Domain route
197
- servername = origin;
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 = forwardedHost + 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: host,
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: 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",
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.7",
46
- "@lwrjs/diagnostics": "0.15.7",
47
- "@lwrjs/instrumentation": "0.15.7",
48
- "@lwrjs/loader": "0.15.7",
49
- "@lwrjs/shared-utils": "0.15.7",
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.7",
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": "9e6803700aef18118f38f0f72006c5c87e10bc13"
66
+ "gitHead": "281108b0e976f7302571a77d7f1d15136b9076e9"
67
67
  }