@dcl/sdk 7.0.6-4006744889.commit-c6aff5f → 7.0.6-4009803567.commit-112733c

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.
Files changed (88) hide show
  1. package/cli/commands/build/helpers.d.ts +25 -0
  2. package/cli/commands/build/helpers.js +50 -0
  3. package/cli/commands/build/helpers.ts +95 -0
  4. package/cli/commands/build/index.d.ts +19 -0
  5. package/cli/commands/build/index.js +64 -0
  6. package/cli/commands/build/index.ts +91 -0
  7. package/cli/commands/init/index.d.ts +1 -1
  8. package/cli/commands/init/index.js +8 -14
  9. package/cli/commands/init/index.ts +8 -18
  10. package/cli/commands/init/repos.js +1 -1
  11. package/cli/commands/init/repos.ts +1 -2
  12. package/cli/commands/preview/bff.d.ts +3 -0
  13. package/cli/commands/preview/bff.js +50 -0
  14. package/cli/commands/preview/bff.ts +59 -0
  15. package/cli/commands/preview/catalyst.d.ts +5 -0
  16. package/cli/commands/preview/catalyst.js +24 -0
  17. package/cli/commands/preview/catalyst.ts +31 -0
  18. package/cli/commands/preview/coordinates.d.ts +20 -0
  19. package/cli/commands/preview/coordinates.js +90 -0
  20. package/cli/commands/preview/coordinates.ts +146 -0
  21. package/cli/commands/preview/endpoints.d.ts +10 -0
  22. package/cli/commands/preview/endpoints.js +500 -0
  23. package/cli/commands/preview/endpoints.ts +594 -0
  24. package/cli/commands/preview/eth.d.ts +2 -0
  25. package/cli/commands/preview/eth.js +6 -0
  26. package/cli/commands/preview/eth.ts +3 -0
  27. package/cli/commands/preview/index.d.ts +18 -0
  28. package/cli/commands/preview/index.js +75 -0
  29. package/cli/commands/preview/index.ts +88 -0
  30. package/cli/commands/preview/port.d.ts +1 -0
  31. package/cli/commands/preview/port.js +21 -0
  32. package/cli/commands/preview/port.ts +15 -0
  33. package/cli/commands/preview/project.d.ts +14 -0
  34. package/cli/commands/preview/project.js +77 -0
  35. package/cli/commands/preview/project.ts +112 -0
  36. package/cli/commands/preview/types.d.ts +13 -0
  37. package/cli/commands/preview/types.js +3 -0
  38. package/cli/commands/preview/types.ts +19 -0
  39. package/cli/commands/preview/wire.d.ts +14 -0
  40. package/cli/commands/preview/wire.js +28 -0
  41. package/cli/commands/preview/wire.ts +48 -0
  42. package/cli/commands/preview/ws.d.ts +7 -0
  43. package/cli/commands/preview/ws.js +16 -0
  44. package/cli/commands/preview/ws.ts +24 -0
  45. package/cli/commands/start/index.d.ts +29 -0
  46. package/cli/commands/start/index.js +121 -0
  47. package/cli/commands/start/index.ts +132 -0
  48. package/cli/components/fs.d.ts +2 -1
  49. package/cli/components/fs.js +1 -1
  50. package/cli/components/fs.ts +2 -11
  51. package/cli/index.js +4 -6
  52. package/cli/index.ts +9 -10
  53. package/cli/utils/args.js +2 -2
  54. package/cli/utils/args.ts +2 -8
  55. package/cli/utils/commands.js +2 -2
  56. package/cli/utils/commands.ts +3 -7
  57. package/cli/utils/exec.d.ts +8 -0
  58. package/cli/utils/exec.js +33 -0
  59. package/cli/utils/exec.ts +38 -0
  60. package/cli/utils/fs.js +1 -1
  61. package/cli/utils/fs.ts +1 -4
  62. package/cli/utils/handler.d.ts +6 -0
  63. package/cli/utils/handler.js +19 -0
  64. package/cli/utils/handler.ts +23 -0
  65. package/cli/utils/object.d.ts +9 -0
  66. package/cli/utils/object.js +45 -0
  67. package/cli/utils/object.ts +62 -0
  68. package/cli/utils/out-messages.d.ts +1 -0
  69. package/cli/utils/out-messages.js +8 -0
  70. package/cli/utils/out-messages.ts +3 -0
  71. package/index.d.ts +0 -1
  72. package/index.js +12 -3
  73. package/internal/Observable.js +3 -7
  74. package/internal/provider.js +1 -1
  75. package/internal/transports/rendererTransport.js +2 -3
  76. package/messageBus.js +1 -1
  77. package/observables.js +1 -1
  78. package/package.json +20 -9
  79. package/src/index.ts +16 -2
  80. package/src/internal/Observable.ts +9 -44
  81. package/src/internal/provider.ts +3 -11
  82. package/src/internal/transports/rendererTransport.ts +4 -12
  83. package/src/messageBus.ts +1 -4
  84. package/src/observables.ts +27 -63
  85. package/tsconfig.cli.json +10 -1
  86. package/cli/utils/spinner.d.ts +0 -15
  87. package/cli/utils/spinner.js +0 -41
  88. package/cli/utils/spinner.ts +0 -44
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.main = exports.args = exports.help = void 0;
7
+ const path_1 = require("path");
8
+ const interfaces_1 = require("@well-known-components/interfaces");
9
+ const rooms_1 = require("@dcl/mini-comms/dist/adapters/rooms");
10
+ const env_config_provider_1 = require("@well-known-components/env-config-provider");
11
+ const http_server_1 = require("@well-known-components/http-server");
12
+ const logger_1 = require("@well-known-components/logger");
13
+ const metrics_1 = require("@well-known-components/metrics");
14
+ const ws_1 = require("./ws");
15
+ const fp_future_1 = __importDefault(require("fp-future"));
16
+ const args_1 = require("../../utils/args");
17
+ const handler_1 = require("../../utils/handler");
18
+ const project_1 = require("./project");
19
+ const port_1 = require("./port");
20
+ const eth_1 = require("./eth");
21
+ const wire_1 = require("./wire");
22
+ function help() {
23
+ return ``;
24
+ }
25
+ exports.help = help;
26
+ exports.args = (0, args_1.getArgs)({
27
+ '--watch': Boolean,
28
+ '-w': '--watch',
29
+ '--dir': String,
30
+ '--port': Number,
31
+ '-p': '--port'
32
+ });
33
+ exports.main = (0, handler_1.main)(async function main(options) {
34
+ const dir = (0, path_1.resolve)(process.cwd(), options.args['--dir'] || '.');
35
+ await (0, project_1.validateExistingProject)(options.components, dir);
36
+ await (0, project_1.validateSceneOptions)(options.components, dir);
37
+ const port = options.args['--port'] || (await (0, port_1.previewPort)());
38
+ const startedFuture = (0, fp_future_1.default)();
39
+ setTimeout(() => startedFuture.reject(new Error('Timed out starting the server')), 3000);
40
+ await interfaces_1.Lifecycle.run({
41
+ async initComponents() {
42
+ const metrics = (0, metrics_1.createTestMetricsComponent)(rooms_1.roomsMetrics);
43
+ const config = (0, env_config_provider_1.createRecordConfigComponent)(Object.assign({ HTTP_SERVER_PORT: port.toString(), HTTP_SERVER_HOST: '0.0.0.0' }, process.env));
44
+ const logs = await (0, logger_1.createConsoleLogComponent)({});
45
+ const ws = await (0, ws_1.createWsComponent)({ logs });
46
+ const server = await (0, http_server_1.createServerComponent)({ config, logs, ws: ws.ws }, { cors: {} });
47
+ const rooms = await (0, rooms_1.createRoomsComponent)({
48
+ metrics,
49
+ logs,
50
+ config
51
+ });
52
+ return {
53
+ logs,
54
+ ethereumProvider: eth_1.providerInstance,
55
+ rooms,
56
+ config,
57
+ metrics,
58
+ server,
59
+ ws
60
+ };
61
+ },
62
+ async main({ components, startComponents }) {
63
+ try {
64
+ await (0, wire_1.wire)(dir, components, !!options.args['--watch']);
65
+ await startComponents();
66
+ startedFuture.resolve();
67
+ }
68
+ catch (err) {
69
+ startedFuture.reject(err);
70
+ }
71
+ }
72
+ });
73
+ return;
74
+ });
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwrQkFBOEI7QUFDOUIsa0VBQTZEO0FBQzdELCtEQUF3RjtBQUN4RixvRkFBd0Y7QUFDeEYsb0VBQTBFO0FBQzFFLDBEQUF5RTtBQUN6RSw0REFBMkU7QUFDM0UsNkJBQXdDO0FBQ3hDLDBEQUE4QjtBQUc5QiwyQ0FBMEM7QUFDMUMsaURBQXFEO0FBRXJELHVDQUF5RTtBQUN6RSxpQ0FBb0M7QUFDcEMsK0JBQXdDO0FBQ3hDLGlDQUE2QjtBQUU3QixTQUFnQixJQUFJO0lBQ2xCLE9BQU8sRUFBRSxDQUFBO0FBQ1gsQ0FBQztBQUZELG9CQUVDO0FBT1ksUUFBQSxJQUFJLEdBQUcsSUFBQSxjQUFPLEVBQUM7SUFDMUIsU0FBUyxFQUFFLE9BQU87SUFDbEIsSUFBSSxFQUFFLFNBQVM7SUFDZixPQUFPLEVBQUUsTUFBTTtJQUNmLFFBQVEsRUFBRSxNQUFNO0lBQ2hCLElBQUksRUFBRSxRQUFRO0NBQ2YsQ0FBQyxDQUFBO0FBSVcsUUFBQSxJQUFJLEdBQUcsSUFBQSxjQUFPLEVBQUMsS0FBSyxVQUFVLElBQUksQ0FBQyxPQUFnQjtJQUM5RCxNQUFNLEdBQUcsR0FBRyxJQUFBLGNBQU8sRUFBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTtJQUNoRSxNQUFNLElBQUEsaUNBQXVCLEVBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUN0RCxNQUFNLElBQUEsOEJBQW9CLEVBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUVuRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFBLGtCQUFXLEdBQUUsQ0FBQyxDQUFBO0lBQzVELE1BQU0sYUFBYSxHQUFHLElBQUEsbUJBQU0sR0FBUSxDQUFBO0lBRXBDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUV4RixNQUFNLHNCQUFTLENBQUMsR0FBRyxDQUFvQjtRQUNyQyxLQUFLLENBQUMsY0FBYztZQUNsQixNQUFNLE9BQU8sR0FBRyxJQUFBLG9DQUEwQixFQUFDLG9CQUFZLENBQUMsQ0FBQTtZQUN4RCxNQUFNLE1BQU0sR0FBRyxJQUFBLGlEQUEyQixrQkFDeEMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNqQyxnQkFBZ0IsRUFBRSxTQUFTLElBQ3hCLE9BQU8sQ0FBQyxHQUFHLEVBQ2QsQ0FBQTtZQUNGLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSxrQ0FBeUIsRUFBQyxFQUFFLENBQUMsQ0FBQTtZQUNoRCxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEsc0JBQWlCLEVBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1lBQzVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSxtQ0FBcUIsRUFBb0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUN4RyxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUEsNEJBQW9CLEVBQUM7Z0JBQ3ZDLE9BQU87Z0JBQ1AsSUFBSTtnQkFDSixNQUFNO2FBQ1AsQ0FBQyxDQUFBO1lBRUYsT0FBTztnQkFDTCxJQUFJO2dCQUNKLGdCQUFnQixFQUFFLHNCQUFnQjtnQkFDbEMsS0FBSztnQkFDTCxNQUFNO2dCQUNOLE9BQU87Z0JBQ1AsTUFBTTtnQkFDTixFQUFFO2FBQ0gsQ0FBQTtRQUNILENBQUM7UUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRTtZQUN4QyxJQUFJO2dCQUNGLE1BQU0sSUFBQSxXQUFJLEVBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO2dCQUN0RCxNQUFNLGVBQWUsRUFBRSxDQUFBO2dCQUN2QixhQUFhLENBQUMsT0FBTyxFQUFFLENBQUE7YUFDeEI7WUFBQyxPQUFPLEdBQVEsRUFBRTtnQkFDakIsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTthQUMxQjtRQUNILENBQUM7S0FDRixDQUFDLENBQUE7SUFFRixPQUFNO0FBQ1IsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCdcbmltcG9ydCB7IExpZmVjeWNsZSB9IGZyb20gJ0B3ZWxsLWtub3duLWNvbXBvbmVudHMvaW50ZXJmYWNlcydcbmltcG9ydCB7IHJvb21zTWV0cmljcywgY3JlYXRlUm9vbXNDb21wb25lbnQgfSBmcm9tICdAZGNsL21pbmktY29tbXMvZGlzdC9hZGFwdGVycy9yb29tcydcbmltcG9ydCB7IGNyZWF0ZVJlY29yZENvbmZpZ0NvbXBvbmVudCB9IGZyb20gJ0B3ZWxsLWtub3duLWNvbXBvbmVudHMvZW52LWNvbmZpZy1wcm92aWRlcidcbmltcG9ydCB7IGNyZWF0ZVNlcnZlckNvbXBvbmVudCB9IGZyb20gJ0B3ZWxsLWtub3duLWNvbXBvbmVudHMvaHR0cC1zZXJ2ZXInXG5pbXBvcnQgeyBjcmVhdGVDb25zb2xlTG9nQ29tcG9uZW50IH0gZnJvbSAnQHdlbGwta25vd24tY29tcG9uZW50cy9sb2dnZXInXG5pbXBvcnQgeyBjcmVhdGVUZXN0TWV0cmljc0NvbXBvbmVudCB9IGZyb20gJ0B3ZWxsLWtub3duLWNvbXBvbmVudHMvbWV0cmljcydcbmltcG9ydCB7IGNyZWF0ZVdzQ29tcG9uZW50IH0gZnJvbSAnLi93cydcbmltcG9ydCBmdXR1cmUgZnJvbSAnZnAtZnV0dXJlJ1xuXG5pbXBvcnQgeyBDbGlDb21wb25lbnRzIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cydcbmltcG9ydCB7IGdldEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9hcmdzJ1xuaW1wb3J0IHsgbWFpbiBhcyBoYW5kbGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvaGFuZGxlcidcbmltcG9ydCB7IFByZXZpZXdDb21wb25lbnRzIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IHZhbGlkYXRlRXhpc3RpbmdQcm9qZWN0LCB2YWxpZGF0ZVNjZW5lT3B0aW9ucyB9IGZyb20gJy4vcHJvamVjdCdcbmltcG9ydCB7IHByZXZpZXdQb3J0IH0gZnJvbSAnLi9wb3J0J1xuaW1wb3J0IHsgcHJvdmlkZXJJbnN0YW5jZSB9IGZyb20gJy4vZXRoJ1xuaW1wb3J0IHsgd2lyZSB9IGZyb20gJy4vd2lyZSdcblxuZXhwb3J0IGZ1bmN0aW9uIGhlbHAoKSB7XG4gIHJldHVybiBgYFxufVxuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGFyZ3M6IE9taXQ8dHlwZW9mIGFyZ3MsICdfJz5cbiAgY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZmV0Y2gnIHwgJ2ZzJz5cbn1cblxuZXhwb3J0IGNvbnN0IGFyZ3MgPSBnZXRBcmdzKHtcbiAgJy0td2F0Y2gnOiBCb29sZWFuLFxuICAnLXcnOiAnLS13YXRjaCcsXG4gICctLWRpcic6IFN0cmluZyxcbiAgJy0tcG9ydCc6IE51bWJlcixcbiAgJy1wJzogJy0tcG9ydCdcbn0pXG5cbi8vIGNvcHkvcGFzdGUgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZGVjZW50cmFsYW5kL2NsaS9ibG9iLzMyZGU5NmJjZmM0ZWYxYzI2YzU1ODBjNzc2N2FkNmM4Y2FjM2IzNjcvc3JjL2xpYi9EZWNlbnRyYWxhbmQudHNcbi8vIFRPRE86IHJlZmFjdG9yIHRoaXMgc3R1ZmYgY29tcGxldGVseVxuZXhwb3J0IGNvbnN0IG1haW4gPSBoYW5kbGVyKGFzeW5jIGZ1bmN0aW9uIG1haW4ob3B0aW9uczogT3B0aW9ucykge1xuICBjb25zdCBkaXIgPSByZXNvbHZlKHByb2Nlc3MuY3dkKCksIG9wdGlvbnMuYXJnc1snLS1kaXInXSB8fCAnLicpXG4gIGF3YWl0IHZhbGlkYXRlRXhpc3RpbmdQcm9qZWN0KG9wdGlvbnMuY29tcG9uZW50cywgZGlyKVxuICBhd2FpdCB2YWxpZGF0ZVNjZW5lT3B0aW9ucyhvcHRpb25zLmNvbXBvbmVudHMsIGRpcilcblxuICBjb25zdCBwb3J0ID0gb3B0aW9ucy5hcmdzWyctLXBvcnQnXSB8fCAoYXdhaXQgcHJldmlld1BvcnQoKSlcbiAgY29uc3Qgc3RhcnRlZEZ1dHVyZSA9IGZ1dHVyZTx2b2lkPigpXG5cbiAgc2V0VGltZW91dCgoKSA9PiBzdGFydGVkRnV0dXJlLnJlamVjdChuZXcgRXJyb3IoJ1RpbWVkIG91dCBzdGFydGluZyB0aGUgc2VydmVyJykpLCAzMDAwKVxuXG4gIGF3YWl0IExpZmVjeWNsZS5ydW48UHJldmlld0NvbXBvbmVudHM+KHtcbiAgICBhc3luYyBpbml0Q29tcG9uZW50cygpIHtcbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBjcmVhdGVUZXN0TWV0cmljc0NvbXBvbmVudChyb29tc01ldHJpY3MpXG4gICAgICBjb25zdCBjb25maWcgPSBjcmVhdGVSZWNvcmRDb25maWdDb21wb25lbnQoe1xuICAgICAgICBIVFRQX1NFUlZFUl9QT1JUOiBwb3J0LnRvU3RyaW5nKCksXG4gICAgICAgIEhUVFBfU0VSVkVSX0hPU1Q6ICcwLjAuMC4wJyxcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnZcbiAgICAgIH0pXG4gICAgICBjb25zdCBsb2dzID0gYXdhaXQgY3JlYXRlQ29uc29sZUxvZ0NvbXBvbmVudCh7fSlcbiAgICAgIGNvbnN0IHdzID0gYXdhaXQgY3JlYXRlV3NDb21wb25lbnQoeyBsb2dzIH0pXG4gICAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBjcmVhdGVTZXJ2ZXJDb21wb25lbnQ8UHJldmlld0NvbXBvbmVudHM+KHsgY29uZmlnLCBsb2dzLCB3czogd3Mud3MgfSwgeyBjb3JzOiB7fSB9KVxuICAgICAgY29uc3Qgcm9vbXMgPSBhd2FpdCBjcmVhdGVSb29tc0NvbXBvbmVudCh7XG4gICAgICAgIG1ldHJpY3MsXG4gICAgICAgIGxvZ3MsXG4gICAgICAgIGNvbmZpZ1xuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9ncyxcbiAgICAgICAgZXRoZXJldW1Qcm92aWRlcjogcHJvdmlkZXJJbnN0YW5jZSxcbiAgICAgICAgcm9vbXMsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgbWV0cmljcyxcbiAgICAgICAgc2VydmVyLFxuICAgICAgICB3c1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgbWFpbih7IGNvbXBvbmVudHMsIHN0YXJ0Q29tcG9uZW50cyB9KSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3aXJlKGRpciwgY29tcG9uZW50cywgISFvcHRpb25zLmFyZ3NbJy0td2F0Y2gnXSlcbiAgICAgICAgYXdhaXQgc3RhcnRDb21wb25lbnRzKClcbiAgICAgICAgc3RhcnRlZEZ1dHVyZS5yZXNvbHZlKClcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIHN0YXJ0ZWRGdXR1cmUucmVqZWN0KGVycilcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuXG59KVxuIl19
@@ -0,0 +1,88 @@
1
+ import { resolve } from 'path'
2
+ import { Lifecycle } from '@well-known-components/interfaces'
3
+ import { roomsMetrics, createRoomsComponent } from '@dcl/mini-comms/dist/adapters/rooms'
4
+ import { createRecordConfigComponent } from '@well-known-components/env-config-provider'
5
+ import { createServerComponent } from '@well-known-components/http-server'
6
+ import { createConsoleLogComponent } from '@well-known-components/logger'
7
+ import { createTestMetricsComponent } from '@well-known-components/metrics'
8
+ import { createWsComponent } from './ws'
9
+ import future from 'fp-future'
10
+
11
+ import { CliComponents } from '../../components'
12
+ import { getArgs } from '../../utils/args'
13
+ import { main as handler } from '../../utils/handler'
14
+ import { PreviewComponents } from './types'
15
+ import { validateExistingProject, validateSceneOptions } from './project'
16
+ import { previewPort } from './port'
17
+ import { providerInstance } from './eth'
18
+ import { wire } from './wire'
19
+
20
+ export function help() {
21
+ return ``
22
+ }
23
+
24
+ interface Options {
25
+ args: Omit<typeof args, '_'>
26
+ components: Pick<CliComponents, 'fetch' | 'fs'>
27
+ }
28
+
29
+ export const args = getArgs({
30
+ '--watch': Boolean,
31
+ '-w': '--watch',
32
+ '--dir': String,
33
+ '--port': Number,
34
+ '-p': '--port'
35
+ })
36
+
37
+ // copy/paste from https://github.com/decentraland/cli/blob/32de96bcfc4ef1c26c5580c7767ad6c8cac3b367/src/lib/Decentraland.ts
38
+ // TODO: refactor this stuff completely
39
+ export const main = handler(async function main(options: Options) {
40
+ const dir = resolve(process.cwd(), options.args['--dir'] || '.')
41
+ await validateExistingProject(options.components, dir)
42
+ await validateSceneOptions(options.components, dir)
43
+
44
+ const port = options.args['--port'] || (await previewPort())
45
+ const startedFuture = future<void>()
46
+
47
+ setTimeout(() => startedFuture.reject(new Error('Timed out starting the server')), 3000)
48
+
49
+ await Lifecycle.run<PreviewComponents>({
50
+ async initComponents() {
51
+ const metrics = createTestMetricsComponent(roomsMetrics)
52
+ const config = createRecordConfigComponent({
53
+ HTTP_SERVER_PORT: port.toString(),
54
+ HTTP_SERVER_HOST: '0.0.0.0',
55
+ ...process.env
56
+ })
57
+ const logs = await createConsoleLogComponent({})
58
+ const ws = await createWsComponent({ logs })
59
+ const server = await createServerComponent<PreviewComponents>({ config, logs, ws: ws.ws }, { cors: {} })
60
+ const rooms = await createRoomsComponent({
61
+ metrics,
62
+ logs,
63
+ config
64
+ })
65
+
66
+ return {
67
+ logs,
68
+ ethereumProvider: providerInstance,
69
+ rooms,
70
+ config,
71
+ metrics,
72
+ server,
73
+ ws
74
+ }
75
+ },
76
+ async main({ components, startComponents }) {
77
+ try {
78
+ await wire(dir, components, !!options.args['--watch'])
79
+ await startComponents()
80
+ startedFuture.resolve()
81
+ } catch (err: any) {
82
+ startedFuture.reject(err)
83
+ }
84
+ }
85
+ })
86
+
87
+ return
88
+ })
@@ -0,0 +1 @@
1
+ export declare function previewPort(): Promise<number>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.previewPort = void 0;
7
+ const portfinder_1 = __importDefault(require("portfinder"));
8
+ async function previewPort() {
9
+ let resolvedPort = 0;
10
+ if (!resolvedPort) {
11
+ try {
12
+ resolvedPort = await portfinder_1.default.getPortPromise();
13
+ }
14
+ catch (e) {
15
+ resolvedPort = 2044;
16
+ }
17
+ }
18
+ return resolvedPort;
19
+ }
20
+ exports.previewPort = previewPort;
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNERBQW1DO0FBRTVCLEtBQUssVUFBVSxXQUFXO0lBQy9CLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQTtJQUVwQixJQUFJLENBQUMsWUFBWSxFQUFFO1FBQ2pCLElBQUk7WUFDRixZQUFZLEdBQUcsTUFBTSxvQkFBVSxDQUFDLGNBQWMsRUFBRSxDQUFBO1NBQ2pEO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixZQUFZLEdBQUcsSUFBSSxDQUFBO1NBQ3BCO0tBQ0Y7SUFFRCxPQUFPLFlBQVksQ0FBQTtBQUNyQixDQUFDO0FBWkQsa0NBWUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcG9ydGZpbmRlciBmcm9tICdwb3J0ZmluZGVyJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJldmlld1BvcnQoKSB7XG4gIGxldCByZXNvbHZlZFBvcnQgPSAwXG5cbiAgaWYgKCFyZXNvbHZlZFBvcnQpIHtcbiAgICB0cnkge1xuICAgICAgcmVzb2x2ZWRQb3J0ID0gYXdhaXQgcG9ydGZpbmRlci5nZXRQb3J0UHJvbWlzZSgpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzb2x2ZWRQb3J0ID0gMjA0NFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXNvbHZlZFBvcnRcbn1cbiJdfQ==
@@ -0,0 +1,15 @@
1
+ import portfinder from 'portfinder'
2
+
3
+ export async function previewPort() {
4
+ let resolvedPort = 0
5
+
6
+ if (!resolvedPort) {
7
+ try {
8
+ resolvedPort = await portfinder.getPortPromise()
9
+ } catch (e) {
10
+ resolvedPort = 2044
11
+ }
12
+ }
13
+
14
+ return resolvedPort
15
+ }
@@ -0,0 +1,14 @@
1
+ import { Scene } from '@dcl/schemas';
2
+ import { IFileSystemComponent } from '../../components/fs';
3
+ export declare const SCENE_FILE = "scene.json";
4
+ export declare function getSceneFilePath(dir: string): string;
5
+ export declare function getSceneFile(components: {
6
+ fs: IFileSystemComponent;
7
+ }, dir: string): Promise<Scene>;
8
+ export declare function validateSceneData(sceneFile: Scene): void;
9
+ export declare function validateSceneOptions(components: {
10
+ fs: IFileSystemComponent;
11
+ }, dir: string): Promise<void>;
12
+ export declare function validateExistingProject(components: {
13
+ fs: IFileSystemComponent;
14
+ }, dir: string): Promise<void>;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateExistingProject = exports.validateSceneOptions = exports.validateSceneData = exports.getSceneFile = exports.getSceneFilePath = exports.SCENE_FILE = void 0;
4
+ const path_1 = require("path");
5
+ const error_1 = require("../../utils/error");
6
+ const coordinates_1 = require("./coordinates");
7
+ exports.SCENE_FILE = 'scene.json';
8
+ function isWebSocket(url) {
9
+ return /wss?\:\/\//gi.test(url);
10
+ }
11
+ function isValidMainFormat(path) {
12
+ const supportedExtensions = new Set(['js', 'html', 'xml']);
13
+ const mainExt = path ? path.split('.').pop() : null;
14
+ return path === null || !!(mainExt && supportedExtensions.has(mainExt));
15
+ }
16
+ function getSceneFilePath(dir) {
17
+ return (0, path_1.resolve)(dir, exports.SCENE_FILE);
18
+ }
19
+ exports.getSceneFilePath = getSceneFilePath;
20
+ async function getSceneFile(components, dir) {
21
+ try {
22
+ const sceneFile = JSON.parse(await components.fs.readFile(getSceneFilePath(dir), 'utf-8'));
23
+ return sceneFile;
24
+ }
25
+ catch (e) {
26
+ throw new error_1.CliError(`Unable to read 'scene.json' file. Try initializing the project using 'dcl init'.
27
+ \t > Folder: ${dir}
28
+ `);
29
+ }
30
+ }
31
+ exports.getSceneFile = getSceneFile;
32
+ function validateSceneData(sceneFile) {
33
+ const { base, parcels } = sceneFile.scene;
34
+ const parcelSet = new Set(parcels);
35
+ if (!base) {
36
+ throw new error_1.CliError('Missing scene base attribute at scene.json');
37
+ }
38
+ if (!parcels) {
39
+ throw new error_1.CliError('Missing scene parcels attribute at scene.json');
40
+ }
41
+ if (parcelSet.size < parcels.length) {
42
+ throw new error_1.CliError(`There are duplicated parcels at scene.json.`);
43
+ }
44
+ if (!parcelSet.has(base)) {
45
+ throw new error_1.CliError(`Your base parcel ${base} should be included on parcels attribute at scene.json`);
46
+ }
47
+ const objParcels = parcels.map(coordinates_1.getObject);
48
+ objParcels.forEach(({ x, y }) => {
49
+ if ((0, coordinates_1.inBounds)(x, y)) {
50
+ return;
51
+ }
52
+ const { minX, maxX } = (0, coordinates_1.getBounds)();
53
+ throw new error_1.CliError(`Coordinates ${x},${y} are outside of allowed limits (from ${minX} to ${maxX})`);
54
+ });
55
+ if (!(0, coordinates_1.areConnected)(objParcels)) {
56
+ throw new error_1.CliError('Parcels described on scene.json are not connected. They should be one next to each other');
57
+ }
58
+ }
59
+ exports.validateSceneData = validateSceneData;
60
+ async function validateSceneOptions(components, dir) {
61
+ const sceneFile = await getSceneFile(components, dir);
62
+ return validateSceneData(sceneFile);
63
+ }
64
+ exports.validateSceneOptions = validateSceneOptions;
65
+ async function validateExistingProject(components, dir) {
66
+ const sceneFile = await getSceneFile(components, dir);
67
+ if (!isWebSocket(sceneFile.main)) {
68
+ if (!isValidMainFormat(sceneFile.main)) {
69
+ throw new error_1.CliError(`Main scene format file (${sceneFile.main}) is not a supported format`);
70
+ }
71
+ if (sceneFile.main !== null && !(await components.fs.existPath((0, path_1.resolve)(dir, sceneFile.main)))) {
72
+ throw new error_1.CliError(`Main scene file ${sceneFile.main} is missing in folder ${dir}`);
73
+ }
74
+ }
75
+ }
76
+ exports.validateExistingProject = validateExistingProject;
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInByb2plY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQThCO0FBRzlCLDZDQUE0QztBQUM1QywrQ0FBNEU7QUFHL0QsUUFBQSxVQUFVLEdBQUcsWUFBWSxDQUFBO0FBTXRDLFNBQVMsV0FBVyxDQUFDLEdBQVc7SUFDOUIsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ2pDLENBQUM7QUFNRCxTQUFTLGlCQUFpQixDQUFDLElBQW1CO0lBQzVDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDMUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDbkQsT0FBTyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtBQUN6RSxDQUFDO0FBTUQsU0FBZ0IsZ0JBQWdCLENBQUMsR0FBVztJQUMxQyxPQUFPLElBQUEsY0FBTyxFQUFDLEdBQUcsRUFBRSxrQkFBVSxDQUFDLENBQUE7QUFDakMsQ0FBQztBQUZELDRDQUVDO0FBS00sS0FBSyxVQUFVLFlBQVksQ0FBQyxVQUF3QyxFQUFFLEdBQVc7SUFDdEYsSUFBSTtRQUNGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxVQUFVLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQzFGLE9BQU8sU0FBeUIsQ0FBQTtLQUNqQztJQUFDLE9BQU8sQ0FB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cm9tICdwYXRoJ1xuaW1wb3J0IHsgU2NlbmUgfSBmcm9tICdAZGNsL3NjaGVtYXMnXG5cbmltcG9ydCB7IENsaUVycm9yIH0gZnJvbSAnLi4vLi4vdXRpbHMvZXJyb3InXG5pbXBvcnQgeyBnZXRPYmplY3QsIGluQm91bmRzLCBnZXRCb3VuZHMsIGFyZUNvbm5lY3RlZCB9IGZyb20gJy4vY29vcmRpbmF0ZXMnXG5pbXBvcnQgeyBJRmlsZVN5c3RlbUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvZnMnXG5cbmV4cG9ydCBjb25zdCBTQ0VORV9GSUxFID0gJ3NjZW5lLmpzb24nXG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBVUkwgaXMgYSB2YWxpZCB3ZWJzb2NrZXQgVVJMLlxuICogQHBhcmFtIHVybCBUaGUgZ2l2ZW4gVVJMLlxuICovXG5mdW5jdGlvbiBpc1dlYlNvY2tldCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL3dzcz9cXDpcXC9cXC8vZ2kudGVzdCh1cmwpXG59XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3ZpZGVkIHBhdGggY29udGFpbnMgYSB2YWxpZCBtYWluIGZpbGUgZm9ybWF0LlxuICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdGhlIG1haW4gZmlsZS5cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZE1haW5Gb3JtYXQocGF0aDogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICBjb25zdCBzdXBwb3J0ZWRFeHRlbnNpb25zID0gbmV3IFNldChbJ2pzJywgJ2h0bWwnLCAneG1sJ10pXG4gIGNvbnN0IG1haW5FeHQgPSBwYXRoID8gcGF0aC5zcGxpdCgnLicpLnBvcCgpIDogbnVsbFxuICByZXR1cm4gcGF0aCA9PT0gbnVsbCB8fCAhIShtYWluRXh0ICYmIHN1cHBvcnRlZEV4dGVuc2lvbnMuaGFzKG1haW5FeHQpKVxufVxuXG4vKipcbiAqIENvbXBvc2VzIHRoZSBwYXRoIHRvIHRoZSBgc2NlbmUuanNvbmAgZmlsZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGF0aC5cbiAqIEBwYXJhbSBkaXIgVGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzY2VuZSBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NlbmVGaWxlUGF0aChkaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByZXNvbHZlKGRpciwgU0NFTkVfRklMRSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYHNjZW5lLmpzb25gIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTY2VuZUZpbGUoY29tcG9uZW50czogeyBmczogSUZpbGVTeXN0ZW1Db21wb25lbnQgfSwgZGlyOiBzdHJpbmcpOiBQcm9taXNlPFNjZW5lPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2NlbmVGaWxlID0gSlNPTi5wYXJzZShhd2FpdCBjb21wb25lbnRzLmZzLnJlYWRGaWxlKGdldFNjZW5lRmlsZVBhdGgoZGlyKSwgJ3V0Zi04JykpXG4gICAgcmV0dXJuIHNjZW5lRmlsZSBhcyBhbnkgYXMgU2NlbmVcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBDbGlFcnJvcihgVW5hYmxlIHRvIHJlYWQgJ3NjZW5lLmpzb24nIGZpbGUuIFRyeSBpbml0aWFsaXppbmcgdGhlIHByb2plY3QgdXNpbmcgJ2RjbCBpbml0Jy5cbiAgICAgICAgXFx0ID4gRm9sZGVyOiAke2Rpcn1cbiAgICAgICAgYClcbiAgfVxufVxuXG4vKipcbiAqIEZhaWxzIHRoZSBleGVjdXRpb24gaWYgb25lIG9mIHRoZSBwYXJjZWwgZGF0YSBpcyBpbnZhbGlkXG4gKiBAcGFyYW0gc2NlbmVGaWxlIFRoZSBKU09OIHBhcnNlZCBmaWxlIG9mIHNjZW5lLmpzb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2NlbmVEYXRhKHNjZW5lRmlsZTogU2NlbmUpOiB2b2lkIHtcbiAgY29uc3QgeyBiYXNlLCBwYXJjZWxzIH0gPSBzY2VuZUZpbGUuc2NlbmVcbiAgY29uc3QgcGFyY2VsU2V0ID0gbmV3IFNldChwYXJjZWxzKVxuXG4gIGlmICghYmFzZSkge1xuICAgIHRocm93IG5ldyBDbGlFcnJvcignTWlzc2luZyBzY2VuZSBiYXNlIGF0dHJpYnV0ZSBhdCBzY2VuZS5qc29uJylcbiAgfVxuXG4gIGlmICghcGFyY2Vscykge1xuICAgIHRocm93IG5ldyBDbGlFcnJvcignTWlzc2luZyBzY2VuZSBwYXJjZWxzIGF0dHJpYnV0ZSBhdCBzY2VuZS5qc29uJylcbiAgfVxuXG4gIGlmIChwYXJjZWxTZXQuc2l6ZSA8IHBhcmNlbHMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IENsaUVycm9yKGBUaGVyZSBhcmUgZHVwbGljYXRlZCBwYXJjZWxzIGF0IHNjZW5lLmpzb24uYClcbiAgfVxuXG4gIGlmICghcGFyY2VsU2V0LmhhcyhiYXNlKSkge1xuICAgIHRocm93IG5ldyBDbGlFcnJvcihgWW91ciBiYXNlIHBhcmNlbCAke2Jhc2V9IHNob3VsZCBiZSBpbmNsdWRlZCBvbiBwYXJjZWxzIGF0dHJpYnV0ZSBhdCBzY2VuZS5qc29uYClcbiAgfVxuXG4gIGNvbnN0IG9ialBhcmNlbHMgPSBwYXJjZWxzLm1hcChnZXRPYmplY3QpXG4gIG9ialBhcmNlbHMuZm9yRWFjaCgoeyB4LCB5IH0pID0+IHtcbiAgICBpZiAoaW5Cb3VuZHMoeCwgeSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCB7IG1pblgsIG1heFggfSA9IGdldEJvdW5kcygpXG4gICAgdGhyb3cgbmV3IENsaUVycm9yKGBDb29yZGluYXRlcyAke3h9LCR7eX0gYXJlIG91dHNpZGUgb2YgYWxsb3dlZCBsaW1pdHMgKGZyb20gJHttaW5YfSB0byAke21heFh9KWApXG4gIH0pXG5cbiAgaWYgKCFhcmVDb25uZWN0ZWQob2JqUGFyY2VscykpIHtcbiAgICB0aHJvdyBuZXcgQ2xpRXJyb3IoJ1BhcmNlbHMgZGVzY3JpYmVkIG9uIHNjZW5lLmpzb24gYXJlIG5vdCBjb25uZWN0ZWQuIFRoZXkgc2hvdWxkIGJlIG9uZSBuZXh0IHRvIGVhY2ggb3RoZXInKVxuICB9XG59XG5cbi8qKlxuICogRmFpbHMgdGhlIGV4ZWN1dGlvbiBpZiBvbmUgb2YgdGhlIHBhcmNlbCBkYXRhIGlzIGludmFsaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlU2NlbmVPcHRpb25zKGNvbXBvbmVudHM6IHsgZnM6IElGaWxlU3lzdGVtQ29tcG9uZW50IH0sIGRpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNjZW5lRmlsZSA9IGF3YWl0IGdldFNjZW5lRmlsZShjb21wb25lbnRzLCBkaXIpXG4gIHJldHVybiB2YWxpZGF0ZVNjZW5lRGF0YShzY2VuZUZpbGUpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGFsbCB0aGUgY29uZGl0aW9ucyByZXF1aXJlZCB0byBvcGVyYXRlIG92ZXIgYW4gZXhpc3RpbmcgcHJvamVjdC5cbiAqIFRocm93cyBpZiBhIHByb2plY3QgY29udGFpbnMgYW4gaW52YWxpZCBtYWluIHBhdGggb3IgaWYgdGhlIGBzY2VuZS5qc29uYCBmaWxlIGlzIG1pc3NpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZUV4aXN0aW5nUHJvamVjdChjb21wb25lbnRzOiB7IGZzOiBJRmlsZVN5c3RlbUNvbXBvbmVudCB9LCBkaXI6IHN0cmluZykge1xuICBjb25zdCBzY2VuZUZpbGUgPSBhd2FpdCBnZXRTY2VuZUZpbGUoY29tcG9uZW50cywgZGlyKVxuXG4gIGlmICghaXNXZWJTb2NrZXQoc2NlbmVGaWxlLm1haW4pKSB7XG4gICAgaWYgKCFpc1ZhbGlkTWFpbkZvcm1hdChzY2VuZUZpbGUubWFpbikpIHtcbiAgICAgIHRocm93IG5ldyBDbGlFcnJvcihgTWFpbiBzY2VuZSBmb3JtYXQgZmlsZSAoJHtzY2VuZUZpbGUubWFpbn0pIGlzIG5vdCBhIHN1cHBvcnRlZCBmb3JtYXRgKVxuICAgIH1cblxuICAgIGlmIChzY2VuZUZpbGUubWFpbiAhPT0gbnVsbCAmJiAhKGF3YWl0IGNvbXBvbmVudHMuZnMuZXhpc3RQYXRoKHJlc29sdmUoZGlyLCBzY2VuZUZpbGUubWFpbikpKSkge1xuICAgICAgdGhyb3cgbmV3IENsaUVycm9yKGBNYWluIHNjZW5lIGZpbGUgJHtzY2VuZUZpbGUubWFpbn0gaXMgbWlzc2luZyBpbiBmb2xkZXIgJHtkaXJ9YClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,112 @@
1
+ import { resolve } from 'path'
2
+ import { Scene } from '@dcl/schemas'
3
+
4
+ import { CliError } from '../../utils/error'
5
+ import { getObject, inBounds, getBounds, areConnected } from './coordinates'
6
+ import { IFileSystemComponent } from '../../components/fs'
7
+
8
+ export const SCENE_FILE = 'scene.json'
9
+
10
+ /**
11
+ * Returns true if the given URL is a valid websocket URL.
12
+ * @param url The given URL.
13
+ */
14
+ function isWebSocket(url: string): boolean {
15
+ return /wss?\:\/\//gi.test(url)
16
+ }
17
+
18
+ /**
19
+ * Returns `true` if the provided path contains a valid main file format.
20
+ * @param path The path to the main file.
21
+ */
22
+ function isValidMainFormat(path: string | null): boolean {
23
+ const supportedExtensions = new Set(['js', 'html', 'xml'])
24
+ const mainExt = path ? path.split('.').pop() : null
25
+ return path === null || !!(mainExt && supportedExtensions.has(mainExt))
26
+ }
27
+
28
+ /**
29
+ * Composes the path to the `scene.json` file based on the provided path.
30
+ * @param dir The path to the directory containing the scene file.
31
+ */
32
+ export function getSceneFilePath(dir: string): string {
33
+ return resolve(dir, SCENE_FILE)
34
+ }
35
+
36
+ /**
37
+ * Returns an object containing the contents of the `scene.json` file.
38
+ */
39
+ export async function getSceneFile(components: { fs: IFileSystemComponent }, dir: string): Promise<Scene> {
40
+ try {
41
+ const sceneFile = JSON.parse(await components.fs.readFile(getSceneFilePath(dir), 'utf-8'))
42
+ return sceneFile as any as Scene
43
+ } catch (e) {
44
+ throw new CliError(`Unable to read 'scene.json' file. Try initializing the project using 'dcl init'.
45
+ \t > Folder: ${dir}
46
+ `)
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Fails the execution if one of the parcel data is invalid
52
+ * @param sceneFile The JSON parsed file of scene.json
53
+ */
54
+ export function validateSceneData(sceneFile: Scene): void {
55
+ const { base, parcels } = sceneFile.scene
56
+ const parcelSet = new Set(parcels)
57
+
58
+ if (!base) {
59
+ throw new CliError('Missing scene base attribute at scene.json')
60
+ }
61
+
62
+ if (!parcels) {
63
+ throw new CliError('Missing scene parcels attribute at scene.json')
64
+ }
65
+
66
+ if (parcelSet.size < parcels.length) {
67
+ throw new CliError(`There are duplicated parcels at scene.json.`)
68
+ }
69
+
70
+ if (!parcelSet.has(base)) {
71
+ throw new CliError(`Your base parcel ${base} should be included on parcels attribute at scene.json`)
72
+ }
73
+
74
+ const objParcels = parcels.map(getObject)
75
+ objParcels.forEach(({ x, y }) => {
76
+ if (inBounds(x, y)) {
77
+ return
78
+ }
79
+ const { minX, maxX } = getBounds()
80
+ throw new CliError(`Coordinates ${x},${y} are outside of allowed limits (from ${minX} to ${maxX})`)
81
+ })
82
+
83
+ if (!areConnected(objParcels)) {
84
+ throw new CliError('Parcels described on scene.json are not connected. They should be one next to each other')
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Fails the execution if one of the parcel data is invalid
90
+ */
91
+ export async function validateSceneOptions(components: { fs: IFileSystemComponent }, dir: string): Promise<void> {
92
+ const sceneFile = await getSceneFile(components, dir)
93
+ return validateSceneData(sceneFile)
94
+ }
95
+
96
+ /**
97
+ * Validates all the conditions required to operate over an existing project.
98
+ * Throws if a project contains an invalid main path or if the `scene.json` file is missing.
99
+ */
100
+ export async function validateExistingProject(components: { fs: IFileSystemComponent }, dir: string) {
101
+ const sceneFile = await getSceneFile(components, dir)
102
+
103
+ if (!isWebSocket(sceneFile.main)) {
104
+ if (!isValidMainFormat(sceneFile.main)) {
105
+ throw new CliError(`Main scene format file (${sceneFile.main}) is not a supported format`)
106
+ }
107
+
108
+ if (sceneFile.main !== null && !(await components.fs.existPath(resolve(dir, sceneFile.main)))) {
109
+ throw new CliError(`Main scene file ${sceneFile.main} is missing in folder ${dir}`)
110
+ }
111
+ }
112
+ }
@@ -0,0 +1,13 @@
1
+ import { ILoggerComponent, IMetricsComponent, IHttpServerComponent, IConfigComponent } from '@well-known-components/interfaces';
2
+ import { HTTPProvider } from 'eth-connect';
3
+ import { RoomComponent } from '@dcl/mini-comms/dist/adapters/rooms';
4
+ import { WebSocketComponent } from './ws';
5
+ export type PreviewComponents = {
6
+ logs: ILoggerComponent;
7
+ server: IHttpServerComponent<PreviewComponents>;
8
+ config: IConfigComponent;
9
+ metrics: IMetricsComponent<any>;
10
+ ethereumProvider: HTTPProvider;
11
+ rooms: RoomComponent;
12
+ ws: WebSocketComponent;
13
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSUxvZ2dlckNvbXBvbmVudCxcbiAgSU1ldHJpY3NDb21wb25lbnQsXG4gIElIdHRwU2VydmVyQ29tcG9uZW50LFxuICBJQ29uZmlnQ29tcG9uZW50XG59IGZyb20gJ0B3ZWxsLWtub3duLWNvbXBvbmVudHMvaW50ZXJmYWNlcydcbmltcG9ydCB7IEhUVFBQcm92aWRlciB9IGZyb20gJ2V0aC1jb25uZWN0J1xuaW1wb3J0IHsgUm9vbUNvbXBvbmVudCB9IGZyb20gJ0BkY2wvbWluaS1jb21tcy9kaXN0L2FkYXB0ZXJzL3Jvb21zJ1xuaW1wb3J0IHsgV2ViU29ja2V0Q29tcG9uZW50IH0gZnJvbSAnLi93cydcblxuZXhwb3J0IHR5cGUgUHJldmlld0NvbXBvbmVudHMgPSB7XG4gIGxvZ3M6IElMb2dnZXJDb21wb25lbnRcbiAgc2VydmVyOiBJSHR0cFNlcnZlckNvbXBvbmVudDxQcmV2aWV3Q29tcG9uZW50cz5cbiAgY29uZmlnOiBJQ29uZmlnQ29tcG9uZW50XG4gIG1ldHJpY3M6IElNZXRyaWNzQ29tcG9uZW50PGFueT5cbiAgZXRoZXJldW1Qcm92aWRlcjogSFRUUFByb3ZpZGVyXG4gIHJvb21zOiBSb29tQ29tcG9uZW50XG4gIHdzOiBXZWJTb2NrZXRDb21wb25lbnRcbn1cbiJdfQ==
@@ -0,0 +1,19 @@
1
+ import {
2
+ ILoggerComponent,
3
+ IMetricsComponent,
4
+ IHttpServerComponent,
5
+ IConfigComponent
6
+ } from '@well-known-components/interfaces'
7
+ import { HTTPProvider } from 'eth-connect'
8
+ import { RoomComponent } from '@dcl/mini-comms/dist/adapters/rooms'
9
+ import { WebSocketComponent } from './ws'
10
+
11
+ export type PreviewComponents = {
12
+ logs: ILoggerComponent
13
+ server: IHttpServerComponent<PreviewComponents>
14
+ config: IConfigComponent
15
+ metrics: IMetricsComponent<any>
16
+ ethereumProvider: HTTPProvider
17
+ rooms: RoomComponent
18
+ ws: WebSocketComponent
19
+ }
@@ -0,0 +1,14 @@
1
+ import { ILoggerComponent, IMetricsComponent, IHttpServerComponent, IConfigComponent } from '@well-known-components/interfaces';
2
+ import { HTTPProvider } from 'eth-connect';
3
+ import { RoomComponent } from '@dcl/mini-comms/dist/adapters/rooms';
4
+ import { WebSocketComponent } from './ws';
5
+ export type PreviewComponents = {
6
+ logs: ILoggerComponent;
7
+ server: IHttpServerComponent<PreviewComponents>;
8
+ config: IConfigComponent;
9
+ metrics: IMetricsComponent<any>;
10
+ ethereumProvider: HTTPProvider;
11
+ rooms: RoomComponent;
12
+ ws: WebSocketComponent;
13
+ };
14
+ export declare function wire(dir: string, components: PreviewComponents, watch?: boolean): Promise<void>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.wire = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const bff_1 = require("./bff");
10
+ const http_server_1 = require("@well-known-components/http-server");
11
+ const endpoints_1 = require("./endpoints");
12
+ const error_1 = require("../../utils/error");
13
+ async function wire(dir, components, watch = false) {
14
+ const npmModulesPath = path_1.default.resolve(dir, 'node_modules');
15
+ if (!fs_extra_1.default.pathExistsSync(npmModulesPath)) {
16
+ throw new error_1.CliError(`Couldn\'t find ${npmModulesPath}, please run: npm install`);
17
+ }
18
+ const router = new http_server_1.Router();
19
+ await (0, bff_1.setupBffAndComms)(components, router);
20
+ (0, endpoints_1.setupEcs6Endpoints)(dir, router);
21
+ if (watch) {
22
+ }
23
+ components.server.setContext(components);
24
+ components.server.use(router.allowedMethods());
25
+ components.server.use(router.middleware());
26
+ }
27
+ exports.wire = wire;
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndpcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0RBQXVCO0FBQ3ZCLHdEQUF5QjtBQUV6QiwrQkFBd0M7QUFTeEMsb0VBQTJEO0FBRTNELDJDQUFnRDtBQUNoRCw2Q0FBNEM7QUFZckMsS0FBSyxVQUFVLElBQUksQ0FBQyxHQUFXLEVBQUUsVUFBNkIsRUFBRSxRQUFpQixLQUFLO0lBQzNGLE1BQU0sY0FBYyxHQUFHLGNBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBR3hELElBQUksQ0FBQyxrQkFBRSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRTtRQUN0QyxNQUFNLElBQUksZ0JBQVEsQ0FBQyxrQkFBa0IsY0FBYywyQkFBMkIsQ0FBQyxDQUFBO0tBQ2hGO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxvQkFBTSxFQUFxQixDQUFBO0lBRTlDLE1BQU0sSUFBQSxzQkFBZ0IsRUFBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDMUMsSUFBQSw4QkFBa0IsRUFBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDL0IsSUFBSSxLQUFLLEVBQUU7S0FHVjtJQUVELFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3hDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFBO0lBQzlDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBO0FBQzVDLENBQUM7QUFwQkQsb0JBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcblxuaW1wb3J0IHsgc2V0dXBCZmZBbmRDb21tcyB9IGZyb20gJy4vYmZmJ1xuaW1wb3J0IHtcbiAgSUxvZ2dlckNvbXBvbmVudCxcbiAgSU1ldHJpY3NDb21wb25lbnQsXG4gIElIdHRwU2VydmVyQ29tcG9uZW50LFxuICBJQ29uZmlnQ29tcG9uZW50XG59IGZyb20gJ0B3ZWxsLWtub3duLWNvbXBvbmVudHMvaW50ZXJmYWNlcydcbmltcG9ydCB7IEhUVFBQcm92aWRlciB9IGZyb20gJ2V0aC1jb25uZWN0J1xuaW1wb3J0IHsgUm9vbUNvbXBvbmVudCB9IGZyb20gJ0BkY2wvbWluaS1jb21tcy9kaXN0L2FkYXB0ZXJzL3Jvb21zJ1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQHdlbGwta25vd24tY29tcG9uZW50cy9odHRwLXNlcnZlcidcbmltcG9ydCB7IFdlYlNvY2tldENvbXBvbmVudCB9IGZyb20gJy4vd3MnXG5pbXBvcnQgeyBzZXR1cEVjczZFbmRwb2ludHMgfSBmcm9tICcuL2VuZHBvaW50cydcbmltcG9ydCB7IENsaUVycm9yIH0gZnJvbSAnLi4vLi4vdXRpbHMvZXJyb3InXG5cbmV4cG9ydCB0eXBlIFByZXZpZXdDb21wb25lbnRzID0ge1xuICBsb2dzOiBJTG9nZ2VyQ29tcG9uZW50XG4gIHNlcnZlcjogSUh0dHBTZXJ2ZXJDb21wb25lbnQ8UHJldmlld0NvbXBvbmVudHM+XG4gIGNvbmZpZzogSUNvbmZpZ0NvbXBvbmVudFxuICBtZXRyaWNzOiBJTWV0cmljc0NvbXBvbmVudDxhbnk+XG4gIGV0aGVyZXVtUHJvdmlkZXI6IEhUVFBQcm92aWRlclxuICByb29tczogUm9vbUNvbXBvbmVudFxuICB3czogV2ViU29ja2V0Q29tcG9uZW50XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXJlKGRpcjogc3RyaW5nLCBjb21wb25lbnRzOiBQcmV2aWV3Q29tcG9uZW50cywgd2F0Y2g6IGJvb2xlYW4gPSBmYWxzZSkge1xuICBjb25zdCBucG1Nb2R1bGVzUGF0aCA9IHBhdGgucmVzb2x2ZShkaXIsICdub2RlX21vZHVsZXMnKVxuXG4gIC8vIFRPRE86IGRjbC5wcm9qZWN0Lm5lZWRzRGVwZW5kZW5jaWVzKCkgc2hvdWxkIGRvIHRoaXNcbiAgaWYgKCFmcy5wYXRoRXhpc3RzU3luYyhucG1Nb2R1bGVzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgQ2xpRXJyb3IoYENvdWxkblxcJ3QgZmluZCAke25wbU1vZHVsZXNQYXRofSwgcGxlYXNlIHJ1bjogbnBtIGluc3RhbGxgKVxuICB9XG5cbiAgY29uc3Qgcm91dGVyID0gbmV3IFJvdXRlcjxQcmV2aWV3Q29tcG9uZW50cz4oKVxuXG4gIGF3YWl0IHNldHVwQmZmQW5kQ29tbXMoY29tcG9uZW50cywgcm91dGVyKVxuICBzZXR1cEVjczZFbmRwb2ludHMoZGlyLCByb3V0ZXIpXG4gIGlmICh3YXRjaCkge1xuICAgIC8vIGFkZCBcIndhdGNoXCJcbiAgICAvLyBhd2FpMnQgYmluZFdhdGNoKGNvbXBvbmVudHMsIHNjZW5lVXBkYXRlQ2xpZW50cylcbiAgfVxuXG4gIGNvbXBvbmVudHMuc2VydmVyLnNldENvbnRleHQoY29tcG9uZW50cylcbiAgY29tcG9uZW50cy5zZXJ2ZXIudXNlKHJvdXRlci5hbGxvd2VkTWV0aG9kcygpKVxuICBjb21wb25lbnRzLnNlcnZlci51c2Uocm91dGVyLm1pZGRsZXdhcmUoKSlcbn1cbiJdfQ==
@@ -0,0 +1,48 @@
1
+ import path from 'path'
2
+ import fs from 'fs-extra'
3
+
4
+ import { setupBffAndComms } from './bff'
5
+ import {
6
+ ILoggerComponent,
7
+ IMetricsComponent,
8
+ IHttpServerComponent,
9
+ IConfigComponent
10
+ } from '@well-known-components/interfaces'
11
+ import { HTTPProvider } from 'eth-connect'
12
+ import { RoomComponent } from '@dcl/mini-comms/dist/adapters/rooms'
13
+ import { Router } from '@well-known-components/http-server'
14
+ import { WebSocketComponent } from './ws'
15
+ import { setupEcs6Endpoints } from './endpoints'
16
+ import { CliError } from '../../utils/error'
17
+
18
+ export type PreviewComponents = {
19
+ logs: ILoggerComponent
20
+ server: IHttpServerComponent<PreviewComponents>
21
+ config: IConfigComponent
22
+ metrics: IMetricsComponent<any>
23
+ ethereumProvider: HTTPProvider
24
+ rooms: RoomComponent
25
+ ws: WebSocketComponent
26
+ }
27
+
28
+ export async function wire(dir: string, components: PreviewComponents, watch: boolean = false) {
29
+ const npmModulesPath = path.resolve(dir, 'node_modules')
30
+
31
+ // TODO: dcl.project.needsDependencies() should do this
32
+ if (!fs.pathExistsSync(npmModulesPath)) {
33
+ throw new CliError(`Couldn\'t find ${npmModulesPath}, please run: npm install`)
34
+ }
35
+
36
+ const router = new Router<PreviewComponents>()
37
+
38
+ await setupBffAndComms(components, router)
39
+ setupEcs6Endpoints(dir, router)
40
+ if (watch) {
41
+ // add "watch"
42
+ // awai2t bindWatch(components, sceneUpdateClients)
43
+ }
44
+
45
+ components.server.setContext(components)
46
+ components.server.use(router.allowedMethods())
47
+ components.server.use(router.middleware())
48
+ }
@@ -0,0 +1,7 @@
1
+ import { WebSocketServer } from 'ws';
2
+ import { PreviewComponents } from './types';
3
+ import { IBaseComponent } from '@well-known-components/interfaces';
4
+ export type WebSocketComponent = IBaseComponent & {
5
+ ws: WebSocketServer;
6
+ };
7
+ export declare function createWsComponent(_: Pick<PreviewComponents, 'logs'>): Promise<WebSocketComponent>;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWsComponent = void 0;
4
+ const ws_1 = require("ws");
5
+ async function createWsComponent(_) {
6
+ const ws = new ws_1.WebSocketServer({ noServer: true });
7
+ async function stop() {
8
+ ws.close();
9
+ }
10
+ return {
11
+ stop,
12
+ ws
13
+ };
14
+ }
15
+ exports.createWsComponent = createWsComponent;
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQkFBb0M7QUFZN0IsS0FBSyxVQUFVLGlCQUFpQixDQUFDLENBQWtDO0lBQ3hFLE1BQU0sRUFBRSxHQUFHLElBQUksb0JBQWUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBRWxELEtBQUssVUFBVSxJQUFJO1FBQ2pCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUNaLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSTtRQUNKLEVBQUU7S0FDSCxDQUFBO0FBQ0gsQ0FBQztBQVhELDhDQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2ViU29ja2V0U2VydmVyIH0gZnJvbSAnd3MnXG5pbXBvcnQgeyBQcmV2aWV3Q29tcG9uZW50cyB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyBJQmFzZUNvbXBvbmVudCB9IGZyb20gJ0B3ZWxsLWtub3duLWNvbXBvbmVudHMvaW50ZXJmYWNlcydcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0Q29tcG9uZW50ID0gSUJhc2VDb21wb25lbnQgJiB7XG4gIHdzOiBXZWJTb2NrZXRTZXJ2ZXJcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgaHR0cC1zZXJ2ZXIgY29tcG9uZW50XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVXc0NvbXBvbmVudChfOiBQaWNrPFByZXZpZXdDb21wb25lbnRzLCAnbG9ncyc+KTogUHJvbWlzZTxXZWJTb2NrZXRDb21wb25lbnQ+IHtcbiAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHsgbm9TZXJ2ZXI6IHRydWUgfSlcblxuICBhc3luYyBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHdzLmNsb3NlKClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RvcCxcbiAgICB3c1xuICB9XG59XG4iXX0=
@@ -0,0 +1,24 @@
1
+ import { WebSocketServer } from 'ws'
2
+ import { PreviewComponents } from './types'
3
+ import { IBaseComponent } from '@well-known-components/interfaces'
4
+
5
+ export type WebSocketComponent = IBaseComponent & {
6
+ ws: WebSocketServer
7
+ }
8
+
9
+ /**
10
+ * Creates a http-server component
11
+ * @public
12
+ */
13
+ export async function createWsComponent(_: Pick<PreviewComponents, 'logs'>): Promise<WebSocketComponent> {
14
+ const ws = new WebSocketServer({ noServer: true })
15
+
16
+ async function stop() {
17
+ ws.close()
18
+ }
19
+
20
+ return {
21
+ stop,
22
+ ws
23
+ }
24
+ }