@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.
- package/cli/commands/build/helpers.d.ts +25 -0
- package/cli/commands/build/helpers.js +50 -0
- package/cli/commands/build/helpers.ts +95 -0
- package/cli/commands/build/index.d.ts +19 -0
- package/cli/commands/build/index.js +64 -0
- package/cli/commands/build/index.ts +91 -0
- package/cli/commands/init/index.d.ts +1 -1
- package/cli/commands/init/index.js +8 -14
- package/cli/commands/init/index.ts +8 -18
- package/cli/commands/init/repos.js +1 -1
- package/cli/commands/init/repos.ts +1 -2
- package/cli/commands/preview/bff.d.ts +3 -0
- package/cli/commands/preview/bff.js +50 -0
- package/cli/commands/preview/bff.ts +59 -0
- package/cli/commands/preview/catalyst.d.ts +5 -0
- package/cli/commands/preview/catalyst.js +24 -0
- package/cli/commands/preview/catalyst.ts +31 -0
- package/cli/commands/preview/coordinates.d.ts +20 -0
- package/cli/commands/preview/coordinates.js +90 -0
- package/cli/commands/preview/coordinates.ts +146 -0
- package/cli/commands/preview/endpoints.d.ts +10 -0
- package/cli/commands/preview/endpoints.js +500 -0
- package/cli/commands/preview/endpoints.ts +594 -0
- package/cli/commands/preview/eth.d.ts +2 -0
- package/cli/commands/preview/eth.js +6 -0
- package/cli/commands/preview/eth.ts +3 -0
- package/cli/commands/preview/index.d.ts +18 -0
- package/cli/commands/preview/index.js +75 -0
- package/cli/commands/preview/index.ts +88 -0
- package/cli/commands/preview/port.d.ts +1 -0
- package/cli/commands/preview/port.js +21 -0
- package/cli/commands/preview/port.ts +15 -0
- package/cli/commands/preview/project.d.ts +14 -0
- package/cli/commands/preview/project.js +77 -0
- package/cli/commands/preview/project.ts +112 -0
- package/cli/commands/preview/types.d.ts +13 -0
- package/cli/commands/preview/types.js +3 -0
- package/cli/commands/preview/types.ts +19 -0
- package/cli/commands/preview/wire.d.ts +14 -0
- package/cli/commands/preview/wire.js +28 -0
- package/cli/commands/preview/wire.ts +48 -0
- package/cli/commands/preview/ws.d.ts +7 -0
- package/cli/commands/preview/ws.js +16 -0
- package/cli/commands/preview/ws.ts +24 -0
- package/cli/commands/start/index.d.ts +29 -0
- package/cli/commands/start/index.js +121 -0
- package/cli/commands/start/index.ts +132 -0
- package/cli/components/fs.d.ts +2 -1
- package/cli/components/fs.js +1 -1
- package/cli/components/fs.ts +2 -11
- package/cli/index.js +4 -6
- package/cli/index.ts +9 -10
- package/cli/utils/args.js +2 -2
- package/cli/utils/args.ts +2 -8
- package/cli/utils/commands.js +2 -2
- package/cli/utils/commands.ts +3 -7
- package/cli/utils/exec.d.ts +8 -0
- package/cli/utils/exec.js +33 -0
- package/cli/utils/exec.ts +38 -0
- package/cli/utils/fs.js +1 -1
- package/cli/utils/fs.ts +1 -4
- package/cli/utils/handler.d.ts +6 -0
- package/cli/utils/handler.js +19 -0
- package/cli/utils/handler.ts +23 -0
- package/cli/utils/object.d.ts +9 -0
- package/cli/utils/object.js +45 -0
- package/cli/utils/object.ts +62 -0
- package/cli/utils/out-messages.d.ts +1 -0
- package/cli/utils/out-messages.js +8 -0
- package/cli/utils/out-messages.ts +3 -0
- package/index.d.ts +0 -1
- package/index.js +12 -3
- package/internal/Observable.js +3 -7
- package/internal/provider.js +1 -1
- package/internal/transports/rendererTransport.js +2 -3
- package/messageBus.js +1 -1
- package/observables.js +1 -1
- package/package.json +20 -9
- package/src/index.ts +16 -2
- package/src/internal/Observable.ts +9 -44
- package/src/internal/provider.ts +3 -11
- package/src/internal/transports/rendererTransport.ts +4 -12
- package/src/messageBus.ts +1 -4
- package/src/observables.ts +27 -63
- package/tsconfig.cli.json +10 -1
- package/cli/utils/spinner.d.ts +0 -15
- package/cli/utils/spinner.js +0 -41
- 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
|
+
}
|