@lwrjs/lwc-ssr 0.8.0-alpha.13 → 0.8.0-alpha.15

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.
@@ -49,7 +49,7 @@ import Ctor, * as rootComponent from '${rootSpecifier}';
49
49
  const result = renderComponent('${(0, import_shared_utils.moduleSpecifierToKebabCase)(rootSpecifier)}', Ctor, props || {});
50
50
 
51
51
  // 3. relay results
52
- globalThis.postMessage({ result, props, markup });
52
+ globalThis.resolver({ result, props, markup });
53
53
  })()`;
54
54
  }
55
55
  var LwcSsrModuleProvider = class {
@@ -70,7 +70,7 @@ function lwcSsrViewTranformer(options, {moduleBundler}) {
70
70
  });
71
71
  stringBuilder.overwrite(startOffset, endOffset, html);
72
72
  }).catch((err) => {
73
- import_shared_utils.logger.warn(`Server-side rendering for "${specifier}" failed. Falling back to client-side rendering. Reason: `, err);
73
+ import_shared_utils.logger.warn(`Server-side rendering for "${specifier}" failed. Falling back to client-side rendering. Reason: `, err.stack);
74
74
  });
75
75
  }));
76
76
  if (Object.keys(ssrProps).length) {
@@ -0,0 +1,54 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getProtoOf = Object.getPrototypeOf;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, {get: all[name], enumerable: true});
11
+ };
12
+ var __exportStar = (target, module2, desc) => {
13
+ if (module2 && typeof module2 === "object" || typeof module2 === "function") {
14
+ for (let key of __getOwnPropNames(module2))
15
+ if (!__hasOwnProp.call(target, key) && key !== "default")
16
+ __defProp(target, key, {get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable});
17
+ }
18
+ return target;
19
+ };
20
+ var __toModule = (module2) => {
21
+ return __exportStar(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
22
+ };
23
+
24
+ // packages/@lwrjs/lwc-ssr/src/viewTransformer/sandbox-locker.ts
25
+ __markAsModule(exports);
26
+ __export(exports, {
27
+ default: () => runCode
28
+ });
29
+ var import_near_membrane_node = __toModule(require("@locker/near-membrane-node"));
30
+ var import_node_fetch = __toModule(require("node-fetch"));
31
+ function runCode(codes, context) {
32
+ return new Promise((resolve, reject) => {
33
+ let resolver;
34
+ const p = new Promise((r) => resolver = r);
35
+ function getContext() {
36
+ return context;
37
+ }
38
+ const endowments = Object.getOwnPropertyDescriptors({
39
+ getContext,
40
+ fetch: import_node_fetch.default,
41
+ resolver,
42
+ process,
43
+ setTimeout,
44
+ clearTimeout
45
+ });
46
+ const ve = (0, import_near_membrane_node.default)(globalThis, {endowments});
47
+ try {
48
+ ve.evaluate(codes.join("\n"));
49
+ p.then(resolve);
50
+ } catch (e) {
51
+ reject(e);
52
+ }
53
+ });
54
+ }
@@ -0,0 +1,49 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getProtoOf = Object.getPrototypeOf;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, {get: all[name], enumerable: true});
11
+ };
12
+ var __exportStar = (target, module2, desc) => {
13
+ if (module2 && typeof module2 === "object" || typeof module2 === "function") {
14
+ for (let key of __getOwnPropNames(module2))
15
+ if (!__hasOwnProp.call(target, key) && key !== "default")
16
+ __defProp(target, key, {get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable});
17
+ }
18
+ return target;
19
+ };
20
+ var __toModule = (module2) => {
21
+ return __exportStar(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
22
+ };
23
+
24
+ // packages/@lwrjs/lwc-ssr/src/viewTransformer/sandbox-worker.ts
25
+ __markAsModule(exports);
26
+ __export(exports, {
27
+ default: () => runCode
28
+ });
29
+ var import_worker_threads = __toModule(require("worker_threads"));
30
+ var HEADER = "/* This module is generated and meant to be used in a Server context */";
31
+ var WORKER_CODE_SANDBOX_APIS = [
32
+ `const { parentPort, workerData } = require('worker_threads');`,
33
+ `globalThis.getContext = () => workerData;`,
34
+ `globalThis.fetch = require('node-fetch');`,
35
+ `globalThis.resolver = (...args) => parentPort.postMessage(...args);`
36
+ ];
37
+ function runCode(codes, workerData) {
38
+ const workerCode = [HEADER, ...WORKER_CODE_SANDBOX_APIS, ...codes].join("\n");
39
+ return new Promise((resolve, reject) => {
40
+ const worker = new import_worker_threads.Worker(workerCode, {eval: true, workerData});
41
+ worker.on("message", resolve);
42
+ worker.on("error", reject);
43
+ worker.on("exit", (code) => {
44
+ if (code !== 0) {
45
+ reject(new Error(`SSR worker stopped with exit code: ${code}`));
46
+ }
47
+ });
48
+ });
49
+ }
@@ -26,27 +26,11 @@ __markAsModule(exports);
26
26
  __export(exports, {
27
27
  default: () => runCode
28
28
  });
29
- var import_worker_threads = __toModule(require("worker_threads"));
30
- var HEADER = "/* This module is generated and meant to be used in a Server context */";
31
- var WORKER_CODE_SANDBOX_APIS = [
32
- `const { parentPort, workerData } = require('worker_threads');`,
33
- `globalThis.getContext = () => workerData;`,
34
- `globalThis.fetch = require('node-fetch');`,
35
- `globalThis.postMessage = (...args) => parentPort.postMessage(...args);`
36
- ];
37
- function runCodeOnWorker(codes, workerData) {
38
- const workerCode = [HEADER, ...WORKER_CODE_SANDBOX_APIS, ...codes].join("\n");
39
- return new Promise((resolve, reject) => {
40
- const worker = new import_worker_threads.Worker(workerCode, {eval: true, workerData});
41
- worker.on("message", resolve);
42
- worker.on("error", reject);
43
- worker.on("exit", (code) => {
44
- if (code !== 0) {
45
- reject(new Error(`SSR worker stopped with exit code: ${code}`));
46
- }
47
- });
48
- });
49
- }
29
+ var import_sandbox_worker = __toModule(require("./sandbox-worker.cjs"));
30
+ var import_sandbox_locker = __toModule(require("./sandbox-locker.cjs"));
50
31
  function runCode(codes, context) {
51
- return runCodeOnWorker(codes, context);
32
+ if (process.env.LOCKER_SB === "true") {
33
+ return (0, import_sandbox_locker.default)(codes, context);
34
+ }
35
+ return (0, import_sandbox_worker.default)(codes, context);
52
36
  }
@@ -28,6 +28,7 @@ __export(exports, {
28
28
  });
29
29
  var import_amd_utils = __toModule(require("./amd-utils.cjs"));
30
30
  var import_sandbox = __toModule(require("./sandbox.cjs"));
31
+ var import_perf_hooks = __toModule(require("perf_hooks"));
31
32
  async function ssrElement({specifier, props: templateProps}, moduleBundler, {runtimeEnvironment, runtimeParams}) {
32
33
  const {format} = runtimeEnvironment;
33
34
  const {
@@ -49,9 +50,13 @@ async function ssrElement({specifier, props: templateProps}, moduleBundler, {run
49
50
  query: runtimeParams.query || {},
50
51
  locale: runtimeParams.locale || runtimeEnvironment.defaultLocale
51
52
  };
53
+ const startTime = import_perf_hooks.performance.now();
52
54
  const {result, props, markup} = format === "amd" ? await (0, import_sandbox.default)([
53
55
  ...await (0, import_amd_utils.default)(runtimeEnvironment, version.replace(/\./g, "_"), bundleSpecifier, bundleRecord.includedModules),
54
56
  code
55
57
  ], context) : await (0, import_sandbox.default)([code], context);
58
+ const endTime = import_perf_hooks.performance.now();
59
+ const timeDiff = endTime - startTime;
60
+ console.log(`[${specifier} SSR] complete in ${timeDiff} ms`);
56
61
  return {html: result, props, markup};
57
62
  }
@@ -33,7 +33,7 @@ import Ctor, * as rootComponent from '${rootSpecifier}';
33
33
  const result = renderComponent('${moduleSpecifierToKebabCase(rootSpecifier)}', Ctor, props || {});
34
34
 
35
35
  // 3. relay results
36
- globalThis.postMessage({ result, props, markup });
36
+ globalThis.resolver({ result, props, markup });
37
37
  })()`;
38
38
  }
39
39
  export default class LwcSsrModuleProvider {
@@ -69,7 +69,7 @@ export default function lwcSsrViewTranformer(options, { moduleBundler }) {
69
69
  stringBuilder.overwrite(startOffset, endOffset, html);
70
70
  })
71
71
  .catch((err) => {
72
- logger.warn(`Server-side rendering for "${specifier}" failed. Falling back to client-side rendering. Reason: `, err);
72
+ logger.warn(`Server-side rendering for "${specifier}" failed. Falling back to client-side rendering. Reason: `, err.stack);
73
73
  });
74
74
  }));
75
75
  if (Object.keys(ssrProps).length) {
@@ -0,0 +1,7 @@
1
+ import { PageDataResponse, SsrRequestContext } from '@lwrjs/types';
2
+ interface SandboxResults extends PageDataResponse {
3
+ result?: string;
4
+ }
5
+ export default function runCode(codes: string[], context: SsrRequestContext): Promise<SandboxResults>;
6
+ export {};
7
+ //# sourceMappingURL=sandbox-locker.d.ts.map
@@ -0,0 +1,29 @@
1
+ import createVirtualEnvironment from '@locker/near-membrane-node';
2
+ import fetch from 'node-fetch';
3
+ export default function runCode(codes, context) {
4
+ return new Promise((resolve, reject) => {
5
+ let resolver;
6
+ const p = new Promise((r) => (resolver = r));
7
+ function getContext() {
8
+ return context;
9
+ }
10
+ const endowments = Object.getOwnPropertyDescriptors({
11
+ getContext,
12
+ fetch,
13
+ resolver,
14
+ // for AMD loader ModuleRegistry
15
+ process,
16
+ setTimeout,
17
+ clearTimeout,
18
+ });
19
+ const ve = createVirtualEnvironment(globalThis, { endowments });
20
+ try {
21
+ ve.evaluate(codes.join('\n'));
22
+ p.then(resolve);
23
+ }
24
+ catch (e) {
25
+ reject(e);
26
+ }
27
+ });
28
+ }
29
+ //# sourceMappingURL=sandbox-locker.js.map
@@ -0,0 +1,12 @@
1
+ import { PageDataResponse, SsrRequestContext } from '@lwrjs/types';
2
+ interface SandboxResults extends PageDataResponse {
3
+ result?: string;
4
+ }
5
+ /**
6
+ * Run the SSR module code in a worker, and return the results to the main thread.
7
+ * @param codes - Code strings which SSR a root component
8
+ * @returns a promise to the SSRed code string, or an error message
9
+ */
10
+ export default function runCode(codes: string[], workerData: SsrRequestContext): Promise<SandboxResults>;
11
+ export {};
12
+ //# sourceMappingURL=sandbox-worker.d.ts.map
@@ -0,0 +1,38 @@
1
+ import { Worker } from 'worker_threads';
2
+ const HEADER = '/* This module is generated and meant to be used in a Server context */';
3
+ /**
4
+ * Sandbox APIs
5
+ * @param globalThis.getContext
6
+ * function to provide prop request context object with properties such as props, params, and locale
7
+ *
8
+ * @param globalThis.fetch
9
+ * fetch function for external data fetching
10
+ *
11
+ * @param globalThis.postMessage
12
+ * postbacks from sandbox to main thread
13
+ */
14
+ const WORKER_CODE_SANDBOX_APIS = [
15
+ `const { parentPort, workerData } = require('worker_threads');`,
16
+ `globalThis.getContext = () => workerData;`,
17
+ `globalThis.fetch = require('node-fetch');`,
18
+ `globalThis.resolver = (...args) => parentPort.postMessage(...args);`,
19
+ ];
20
+ /**
21
+ * Run the SSR module code in a worker, and return the results to the main thread.
22
+ * @param codes - Code strings which SSR a root component
23
+ * @returns a promise to the SSRed code string, or an error message
24
+ */
25
+ export default function runCode(codes, workerData) {
26
+ const workerCode = [HEADER, ...WORKER_CODE_SANDBOX_APIS, ...codes].join('\n');
27
+ return new Promise((resolve, reject) => {
28
+ const worker = new Worker(workerCode, { eval: true, workerData });
29
+ worker.on('message', resolve);
30
+ worker.on('error', reject);
31
+ worker.on('exit', (code) => {
32
+ if (code !== 0) {
33
+ reject(new Error(`SSR worker stopped with exit code: ${code}`));
34
+ }
35
+ });
36
+ });
37
+ }
38
+ //# sourceMappingURL=sandbox-worker.js.map
@@ -1,41 +1,9 @@
1
- import { Worker } from 'worker_threads';
2
- const HEADER = '/* This module is generated and meant to be used in a Server context */';
3
- /**
4
- * Sandbox APIs
5
- * @param globalThis.getContext
6
- * function to provide prop request context object with properties such as props, params, and locale
7
- *
8
- * @param globalThis.fetch
9
- * fetch function for external data fetching
10
- *
11
- * @param globalThis.postMessage
12
- * postbacks from sandbox to main thread
13
- */
14
- const WORKER_CODE_SANDBOX_APIS = [
15
- `const { parentPort, workerData } = require('worker_threads');`,
16
- `globalThis.getContext = () => workerData;`,
17
- `globalThis.fetch = require('node-fetch');`,
18
- `globalThis.postMessage = (...args) => parentPort.postMessage(...args);`,
19
- ];
20
- /**
21
- * Run the SSR module code in a worker, and return the results to the main thread.
22
- * @param codes - Code strings which SSR a root component
23
- * @returns a promise to the SSRed code string, or an error message
24
- */
25
- function runCodeOnWorker(codes, workerData) {
26
- const workerCode = [HEADER, ...WORKER_CODE_SANDBOX_APIS, ...codes].join('\n');
27
- return new Promise((resolve, reject) => {
28
- const worker = new Worker(workerCode, { eval: true, workerData });
29
- worker.on('message', resolve);
30
- worker.on('error', reject);
31
- worker.on('exit', (code) => {
32
- if (code !== 0) {
33
- reject(new Error(`SSR worker stopped with exit code: ${code}`));
34
- }
35
- });
36
- });
37
- }
1
+ import runCodeOnWorker from './sandbox-worker.js';
2
+ import runCodeOnLocker from './sandbox-locker.js';
38
3
  export default function runCode(codes, context) {
4
+ if (process.env.LOCKER_SB === 'true') {
5
+ return runCodeOnLocker(codes, context);
6
+ }
39
7
  return runCodeOnWorker(codes, context);
40
8
  }
41
9
  //# sourceMappingURL=sandbox.js.map
@@ -1,5 +1,6 @@
1
1
  import getCode from './amd-utils.js';
2
2
  import runCode from './sandbox.js';
3
+ import { performance } from 'perf_hooks';
3
4
  /**
4
5
  * Create a bundle for the given SSR module and run the code in a sandbox.
5
6
  * @param moduleInfo - specifier: The ID of the module, generated by "lwc-ssr/moduleProvider", which SSRs a component
@@ -34,12 +35,16 @@ export async function ssrElement({ specifier, props: templateProps }, moduleBund
34
35
  locale: runtimeParams.locale || runtimeEnvironment.defaultLocale,
35
36
  };
36
37
  // Get the SSR string and properties bag
38
+ const startTime = performance.now();
37
39
  const { result, props, markup } = format === 'amd'
38
40
  ? await runCode([
39
41
  ...(await getCode(runtimeEnvironment, version.replace(/\./g, '_'), bundleSpecifier, bundleRecord.includedModules)),
40
42
  code,
41
43
  ], context)
42
44
  : await runCode([code], context);
45
+ const endTime = performance.now();
46
+ const timeDiff = endTime - startTime;
47
+ console.log(`[${specifier} SSR] complete in ${timeDiff} ms`);
43
48
  return { html: result, props, markup };
44
49
  }
45
50
  //# sourceMappingURL=ssr-element.js.map
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "0.8.0-alpha.13",
7
+ "version": "0.8.0-alpha.15",
8
8
  "homepage": "https://developer.salesforce.com/docs/platform/lwr/overview",
9
9
  "repository": {
10
10
  "type": "git",
@@ -33,14 +33,16 @@
33
33
  "build/**/*.d.ts"
34
34
  ],
35
35
  "dependencies": {
36
- "@lwrjs/diagnostics": "0.8.0-alpha.13",
37
- "@lwrjs/shared-utils": "0.8.0-alpha.13"
36
+ "@locker/near-membrane-node": "^0.11.6",
37
+ "@lwrjs/diagnostics": "0.8.0-alpha.15",
38
+ "@lwrjs/shared-utils": "0.8.0-alpha.15",
39
+ "node-fetch": "^2.6.1"
38
40
  },
39
41
  "devDependencies": {
40
- "@lwrjs/types": "0.8.0-alpha.13"
42
+ "@lwrjs/types": "0.8.0-alpha.15"
41
43
  },
42
44
  "engines": {
43
45
  "node": ">=14.15.4 <19"
44
46
  },
45
- "gitHead": "cc4bc856f34d2ec15df550503dd7463fa31b30e5"
47
+ "gitHead": "4e6550cae87627aab7d51d22a80c0012b397918d"
46
48
  }