@dcl/sdk-commands 7.0.0-4293371227.commit-54082c6 → 7.0.0-4294380152.commit-0d08b10

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 (37) hide show
  1. package/dist/components/analytics.js +5 -1
  2. package/package.json +6 -3
  3. package/src/commands/build/index.ts +0 -77
  4. package/src/commands/export-static/index.ts +0 -150
  5. package/src/commands/init/index.ts +0 -68
  6. package/src/commands/init/repos.ts +0 -17
  7. package/src/commands/start/index.ts +0 -221
  8. package/src/commands/start/server/endpoints.ts +0 -471
  9. package/src/commands/start/server/file-watch-notifier.ts +0 -45
  10. package/src/commands/start/server/realm.ts +0 -63
  11. package/src/commands/start/server/routes.ts +0 -36
  12. package/src/commands/start/server/ws.ts +0 -24
  13. package/src/commands/start/types.ts +0 -26
  14. package/src/components/analytics.ts +0 -92
  15. package/src/components/dcl-info-config.ts +0 -63
  16. package/src/components/eth.ts +0 -3
  17. package/src/components/fetch.ts +0 -11
  18. package/src/components/fs.ts +0 -62
  19. package/src/components/index.ts +0 -26
  20. package/src/components/log.ts +0 -48
  21. package/src/index.ts +0 -90
  22. package/src/logic/args.ts +0 -19
  23. package/src/logic/beautiful-logs.ts +0 -26
  24. package/src/logic/catalyst-requests.ts +0 -31
  25. package/src/logic/commands.ts +0 -28
  26. package/src/logic/config.ts +0 -45
  27. package/src/logic/coordinates.ts +0 -95
  28. package/src/logic/dcl-ignore.ts +0 -50
  29. package/src/logic/error.ts +0 -1
  30. package/src/logic/exec.ts +0 -36
  31. package/src/logic/fs.ts +0 -76
  32. package/src/logic/get-free-port.ts +0 -15
  33. package/src/logic/project-files.ts +0 -92
  34. package/src/logic/project-validations.ts +0 -61
  35. package/src/logic/realm.ts +0 -28
  36. package/src/logic/scene-validations.ts +0 -81
  37. package/tsconfig.json +0 -28
@@ -46,7 +46,11 @@ async function createAnalyticsComponent({ dclInfoConfig }) {
46
46
  cliVersion: await dclInfoConfig.getVersion(),
47
47
  isCI: dclInfoConfig.isCI(),
48
48
  isEditor: dclInfoConfig.isEditor(),
49
- devId: userId
49
+ devId: userId,
50
+ ecs: {
51
+ ecsVersion: 'ecs7',
52
+ packageVersion: await dclInfoConfig.getVersion()
53
+ }
50
54
  }
51
55
  };
52
56
  analytics.track(trackInfo, () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dcl/sdk-commands",
3
- "version": "7.0.0-4293371227.commit-54082c6",
3
+ "version": "7.0.0-4294380152.commit-0d08b10",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "build": "tsc -p tsconfig.json",
@@ -16,7 +16,7 @@
16
16
  "author": "Decentraland",
17
17
  "license": "Apache-2.0",
18
18
  "dependencies": {
19
- "@dcl/dcl-rollup": "7.0.6-4293371227.commit-54082c6",
19
+ "@dcl/dcl-rollup": "7.0.6-4294380152.commit-0d08b10",
20
20
  "@dcl/hashing": "1.1.3",
21
21
  "@dcl/mini-comms": "1.0.1-20230216163137.commit-a4c75be",
22
22
  "@dcl/protocol": "1.0.0-4114477251.commit-ccb88d6",
@@ -49,5 +49,8 @@
49
49
  "displayName": "SDK",
50
50
  "tsconfig": "./tsconfig.json"
51
51
  },
52
- "commit": "54082c63f87b970864c7e4eab94db193656d6aaa"
52
+ "files": [
53
+ "dist"
54
+ ],
55
+ "commit": "0d08b10653a3c1b7ccac2fec26b0e3fdf2d6e98b"
53
56
  }
@@ -1,77 +0,0 @@
1
- import { resolve } from 'path'
2
- import { CliComponents } from '../../components'
3
- import { getArgs } from '../../logic/args'
4
- import { compile } from '@dcl/dcl-rollup/compile'
5
- import future from 'fp-future'
6
- import { assertValidProjectFolder, installDependencies, needsDependencies } from '../../logic/project-validations'
7
- import { getBaseCoords } from '../../logic/scene-validations'
8
- import { b64HashingFunction, getSceneJson } from '../../logic/project-files'
9
-
10
- interface Options {
11
- args: Omit<typeof args, '_'>
12
- components: Pick<CliComponents, 'fs' | 'logger' | 'dclInfoConfig' | 'analytics'>
13
- }
14
-
15
- export const args = getArgs({
16
- '--watch': Boolean,
17
- '-w': '--watch',
18
- '--production': Boolean,
19
- '-p': '--production',
20
- '--skip-install': Boolean,
21
- '--dir': String
22
- })
23
-
24
- export function help() {
25
- return `
26
- Usage: 'sdk-commands build [options]'
27
- Options:'
28
- -h, --help Displays complete help
29
- -w, --watch Watch for file changes and build on change
30
- -p, --production Build without sourcemaps
31
- --skip-install Skip installing dependencies
32
- --dir Path to directory to build
33
-
34
- Example:
35
- - Build your scene:
36
- '$ sdk-commands build'
37
- `
38
- }
39
-
40
- export async function main(options: Options) {
41
- const projectRoot = resolve(process.cwd(), options.args['--dir'] || '.')
42
- await assertValidProjectFolder(options.components, projectRoot)
43
-
44
- const shouldInstallDeps = await needsDependencies(options.components, projectRoot)
45
-
46
- if (shouldInstallDeps && !options.args['--skip-install']) {
47
- await installDependencies(options.components, projectRoot)
48
- }
49
-
50
- const watch = !!options.args['--watch']
51
-
52
- const watchingFuture = future<any>()
53
-
54
- await compile({
55
- project: projectRoot,
56
- watch,
57
- production: !!options.args['--production'],
58
- watchingFuture
59
- })
60
-
61
- if (!watch) {
62
- watchingFuture.resolve(null)
63
- }
64
- const sceneJson = await getSceneJson(options.components, projectRoot)
65
- const coords = getBaseCoords(sceneJson)
66
-
67
- await options.components.analytics.track('Build scene', {
68
- projectHash: await b64HashingFunction(projectRoot),
69
- coords,
70
- isWorkspace: false
71
- })
72
-
73
- await watchingFuture
74
-
75
- // track stuff...
76
- // https://github.com/decentraland/cli/blob/main/src/commands/build.ts
77
- }
@@ -1,150 +0,0 @@
1
- import { resolve } from 'path'
2
- import { getArgs } from '../../logic/args'
3
- import { hashV1 } from '@dcl/hashing'
4
- import { CliComponents } from '../../components'
5
- import { assertValidProjectFolder } from '../../logic/project-validations'
6
- import { b64HashingFunction, getProjectContentMappings, getSceneJson } from '../../logic/project-files'
7
- import { CliError } from '../../logic/error'
8
- import { Entity, EntityType } from '@dcl/schemas'
9
- import { colors } from '../../components/log'
10
- import { printProgressInfo, printProgressStep, printSuccess } from '../../logic/beautiful-logs'
11
- import { createStaticRealm } from '../../logic/realm'
12
- import { getBaseCoords } from '../../logic/scene-validations'
13
-
14
- interface Options {
15
- args: typeof args
16
- components: Pick<CliComponents, 'fetch' | 'fs' | 'logger' | 'dclInfoConfig' | 'analytics'>
17
- }
18
-
19
- export const args = getArgs({
20
- '--dir': String,
21
- '--destination': String,
22
- '--timestamp': String,
23
- '--realmName': String,
24
- '--baseUrl': String
25
- })
26
-
27
- export async function help() {
28
- return `
29
- Usage:
30
- sdk-commands export-static --dir <directory> --destination <directory>
31
-
32
- Description:
33
-
34
- Exports all the contents of the scene as if they were uploaded to a content server
35
-
36
- Options:
37
-
38
- --dir <directory> The project's root folder to export
39
- --destination <directory> A path in which all the assets will be stored
40
- --timestamp <timestamp> A date to use in the deployable entity. Defaults to now()
41
- --realmName <name> Creates a /<name>/about endpoint to expose the current deployment as a realm. Requires --baseUrl
42
- --baseUrl <baseUrl> It is the public URL in which the --destination directory will be avaiable
43
- `
44
- }
45
-
46
- export async function main(options: Options) {
47
- const { fs, logger } = options.components
48
- const projectRoot = resolve(process.cwd(), options.args['--dir'] || '.')
49
- const destDirectory = resolve(process.cwd(), options.args['--destination'] || '.')
50
- const willCreateRealm = !!args['--realmName']
51
- let currentStep = 1
52
- const maxSteps = 3 + (willCreateRealm ? 1 : 0)
53
-
54
- if (willCreateRealm && !args['--baseUrl']) {
55
- throw new CliError(`--baseUrl is mandatory when --realmName is provided`)
56
- }
57
-
58
- if (willCreateRealm && !/^[a-z][a-z0-9-/]*$/i.test(args['--realmName']!)) {
59
- throw new CliError(`--realmName has invalid characters`)
60
- }
61
-
62
- printProgressStep(logger, 'Reading project files...', currentStep++, maxSteps)
63
-
64
- await fs.mkdir(destDirectory, { recursive: true })
65
- if (!(await fs.directoryExists(destDirectory))) {
66
- throw new CliError(`The destination path ${destDirectory} is not a directory`)
67
- }
68
-
69
- const project = await assertValidProjectFolder(options.components, projectRoot)
70
- const filesToExport = await getProjectContentMappings(options.components, projectRoot, async (file) => {
71
- return await hashV1(fs.createReadStream(resolve(projectRoot, file)))
72
- })
73
-
74
- printProgressStep(logger, 'Copying files...', currentStep++, maxSteps)
75
-
76
- for (const { file, hash } of filesToExport) {
77
- const src = resolve(projectRoot, file)
78
- const dst = resolve(destDirectory, hash)
79
-
80
- if (src.startsWith(destDirectory)) continue
81
-
82
- printProgressInfo(logger, `> ${hash} -> ${file}`)
83
-
84
- if (!(await fs.fileExists(dst))) {
85
- const content = await fs.readFile(src)
86
- await fs.writeFile(dst, content)
87
- }
88
- }
89
-
90
- // entity with ID are the deployed ones, when we generate the entity the ID is not
91
- // available because it is the result of hashing the following structure
92
- const entity: Omit<Entity, 'id'> = {
93
- content: filesToExport,
94
- pointers: [],
95
- timestamp: args['--timestamp'] ? new Date(args['--timestamp']).getTime() : Date.now(),
96
- type: EntityType.SCENE,
97
- // for now, the only valid export is for scenes
98
- metadata: project.scene,
99
- version: 'v3'
100
- }
101
-
102
- printProgressStep(logger, 'Generating files...', currentStep++, maxSteps)
103
-
104
- // create the entity file and get the entityId
105
- const entityRaw = Buffer.from(JSON.stringify(entity), 'utf8')
106
- const entityId = await hashV1(entityRaw)
107
- const dst = resolve(destDirectory, entityId)
108
- await fs.writeFile(dst, entityRaw)
109
-
110
- printProgressInfo(logger, `> ${entityId} -> [ENTITY FILE]`)
111
-
112
- let urn = `urn:decentraland:entity:${entityId}`
113
-
114
- if (args['--baseUrl']) {
115
- urn += '?baseUrl=' + args['--baseUrl']
116
- // baseUrl must end with /
117
- if (!urn.endsWith('/')) urn += '/'
118
- }
119
-
120
- if (willCreateRealm) {
121
- // prepare the realm object
122
- printProgressStep(logger, 'Creating realm file...', currentStep++, maxSteps)
123
- const realm = createStaticRealm()
124
- const realmName = args['--realmName']!
125
-
126
- realm.configurations!.scenesUrn = [urn]
127
- realm.configurations!.realmName = realmName
128
-
129
- // write the realm file
130
- const realmDirectory = resolve(destDirectory, realmName)
131
- await fs.mkdir(realmDirectory, { recursive: true })
132
- if (!(await fs.directoryExists(realmDirectory))) {
133
- throw new CliError(`The destination path ${realmDirectory} is not a directory`)
134
- }
135
- const dst = resolve(realmDirectory, 'about')
136
- await fs.writeFile(dst, JSON.stringify(realm, null, 2))
137
- printProgressInfo(logger, `> ${realmName}/about -> [REALM FILE]`)
138
- }
139
-
140
- printSuccess(logger, `Export finished!`, `=> The entity URN is ${colors.bold(urn)}`)
141
- const sceneJson = await getSceneJson(options.components, projectRoot)
142
- const coords = getBaseCoords(sceneJson)
143
-
144
- await options.components.analytics.track('Export static', {
145
- projectHash: await b64HashingFunction(projectRoot),
146
- coords
147
- })
148
-
149
- return { urn, entityId, destination: destDirectory }
150
- }
@@ -1,68 +0,0 @@
1
- import { join, resolve } from 'path'
2
-
3
- import { getArgs } from '../../logic/args'
4
- import { CliError } from '../../logic/error'
5
- import { CliComponents } from '../../components'
6
- import { isDirectoryEmpty, download, extract } from '../../logic/fs'
7
-
8
- import { get as getRepo } from './repos'
9
- import { installDependencies, needsDependencies } from '../../logic/project-validations'
10
-
11
- interface Options {
12
- args: typeof args
13
- components: Pick<CliComponents, 'fetch' | 'fs' | 'logger' | 'dclInfoConfig' | 'analytics'>
14
- }
15
-
16
- export const args = getArgs({
17
- '--yes': Boolean,
18
- '-y': '--yes',
19
- '--dir': String,
20
- '--skip-install': Boolean
21
- })
22
-
23
- export async function help() {}
24
-
25
- export async function main(options: Options) {
26
- const dir = resolve(process.cwd(), options.args['--dir'] || '.')
27
- const isEmpty = await isDirectoryEmpty(options.components, dir)
28
- const yes = options.args['--yes']
29
-
30
- if (!isEmpty && !yes) {
31
- throw new CliError('The target directory specified is not empty. Run this command with --yes to override.')
32
- }
33
-
34
- // download and extract template project
35
- const scene = 'scene-template'
36
- const { url, contentFolders } = getRepo(scene)
37
- const zip = await download(options.components, url, join(dir, `${scene}.zip`))
38
- await extract(zip, dir)
39
- await options.components.fs.unlink(zip)
40
- await moveFilesFromDirs(options.components, dir, contentFolders)
41
-
42
- // npm install
43
- const shouldInstallDeps = await needsDependencies(options.components, dir)
44
- if (shouldInstallDeps && !options.args['--skip-install']) {
45
- await installDependencies(options.components, dir)
46
- }
47
- await options.components.analytics.track('Scene created', { projectType: scene, url })
48
- }
49
-
50
- const moveFilesFromDir = async (components: Pick<CliComponents, 'fs'>, dir: string, folder: string) => {
51
- const files = await components.fs.readdir(folder)
52
- await Promise.all(
53
- files.map(($) => {
54
- const filePath = resolve(folder, $)
55
- return components.fs.rename(filePath, resolve(dir, $))
56
- })
57
- )
58
- await components.fs.rmdir(folder)
59
- }
60
-
61
- const moveFilesFromDirs = async (components: Pick<CliComponents, 'fs'>, dir: string, folders: string[]) => {
62
- await Promise.all(
63
- folders.map(($) => {
64
- const folderPath = resolve(dir, $)
65
- return moveFilesFromDir(components, dir, folderPath)
66
- })
67
- )
68
- }
@@ -1,17 +0,0 @@
1
- type Scene = 'scene-template'
2
-
3
- type Repos = {
4
- [key in Scene]: {
5
- url: string
6
- contentFolders: string[]
7
- }
8
- }
9
-
10
- const REPOS: Repos = {
11
- 'scene-template': {
12
- url: 'https://github.com/decentraland/sdk7-scene-template/archive/refs/heads/main.zip',
13
- contentFolders: ['sdk7-scene-template-main']
14
- }
15
- }
16
-
17
- export const get = (scene: Scene): Repos[Scene] => REPOS[scene]
@@ -1,221 +0,0 @@
1
- import * as os from 'os'
2
- import * as path from 'path'
3
- import open from 'open'
4
- import future from 'fp-future'
5
-
6
- import { CliComponents } from '../../components'
7
- import { main as build } from '../build'
8
- import { getArgs } from '../../logic/args'
9
- import { needsDependencies, npmRun } from '../../logic/project-validations'
10
- import { getBaseCoords, validateSceneJson } from '../../logic/scene-validations'
11
- import { CliError } from '../../logic/error'
12
- import { previewPort } from '../../logic/get-free-port'
13
- import { ISignalerComponent, PreviewComponents } from './types'
14
- import { createTestMetricsComponent } from '@well-known-components/metrics'
15
- import { Lifecycle, IBaseComponent } from '@well-known-components/interfaces'
16
- import { createRecordConfigComponent } from '@well-known-components/env-config-provider'
17
- import { createRoomsComponent, roomsMetrics } from '@dcl/mini-comms/dist/adapters/rooms'
18
- import { createServerComponent } from '@well-known-components/http-server'
19
- import { createConsoleLogComponent } from '@well-known-components/logger'
20
- import { providerInstance } from '../../components/eth'
21
- import { createStdoutCliLogger } from '../../components/log'
22
- import { wireFileWatcherToWebSockets } from './server/file-watch-notifier'
23
- import { wireRouter } from './server/routes'
24
- import { createWsComponent } from './server/ws'
25
- import { b64HashingFunction, getSceneJson } from '../../logic/project-files'
26
-
27
- interface Options {
28
- args: typeof args
29
- components: Pick<CliComponents, 'fetch' | 'fs' | 'logger' | 'dclInfoConfig' | 'analytics'>
30
- }
31
-
32
- export const args = getArgs({
33
- '--dir': String,
34
- '--help': Boolean,
35
- '--port': Number,
36
- '--no-debug': Boolean,
37
- '--no-browser': Boolean,
38
- '--no-watch': Boolean,
39
- '--ci': Boolean,
40
- '--skip-install': Boolean,
41
- '--web3': Boolean,
42
- '-h': '--help',
43
- '-p': '--port',
44
- '-d': '--no-debug',
45
- '-b': '--no-browser',
46
- '-w': '--no-watch',
47
- '--skip-build': Boolean,
48
- '--desktop-client': Boolean
49
- })
50
-
51
- export function help() {
52
- return `
53
- Usage: sdk-commands start [options]
54
-
55
- Options:
56
-
57
- -h, --help Displays complete help
58
- -p, --port [port] Select a custom port for the development server
59
- -d, --no-debug Disable debugging panel
60
- -b, --no-browser Do not open a new browser window
61
- -w, --no-watch Do not open watch for filesystem changes
62
- -c, --ci Run the parcel previewer on a remote unix server
63
- --web3 Connects preview to browser wallet to use the associated avatar and account
64
- --skip-build Skip build and only serve the files in preview mode
65
- --desktop-client Show URL to launch preview in the desktop client (BETA)
66
-
67
- Examples:
68
-
69
- - Start a local development server for a Decentraland Scene at port 3500
70
-
71
- $ sdk-commands start -p 3500
72
-
73
- - Start a local development server for a Decentraland Scene at a docker container
74
-
75
- $ sdk-commands start --ci
76
- `
77
- }
78
-
79
- export async function main(options: Options) {
80
- const projectRoot = path.resolve(process.cwd(), options.args['--dir'] || '.')
81
- const isCi = args['--ci'] || process.env.CI || false
82
- const debug = !args['--no-debug'] && !isCi
83
- const openBrowser = !args['--no-browser'] && !isCi
84
- const skipBuild = args['--skip-build']
85
- const watch = !args['--no-watch']
86
- const enableWeb3 = args['--web3']
87
-
88
- // TODO: FIX this hardcoded values ?
89
- const hasPortableExperience = false
90
-
91
- // first run `npm run build`, this can be disabled with --skip-build
92
- if (!skipBuild) {
93
- await npmRun(projectRoot, 'build')
94
- }
95
-
96
- // then start the embedded compiler, this can be disabled with --no-watch
97
- if (watch) {
98
- await build({ ...options, args: { '--dir': projectRoot, '--watch': watch } })
99
- }
100
-
101
- await validateSceneJson(options.components, projectRoot)
102
- const sceneJson = await getSceneJson(options.components, projectRoot)
103
- const baseCoords = getBaseCoords(sceneJson)
104
-
105
- if (await needsDependencies(options.components, projectRoot)) {
106
- const npmModulesPath = path.resolve(projectRoot, 'node_modules')
107
- throw new CliError(`Couldn\'t find ${npmModulesPath}, please run: npm install`)
108
- }
109
-
110
- const port = options.args['--port'] || (await previewPort())
111
-
112
- const program = await Lifecycle.run<PreviewComponents>({
113
- async initComponents() {
114
- const metrics = createTestMetricsComponent(roomsMetrics)
115
- const config = createRecordConfigComponent({
116
- HTTP_SERVER_PORT: port.toString(),
117
- HTTP_SERVER_HOST: '0.0.0.0',
118
- ...process.env
119
- })
120
- const logs = await createConsoleLogComponent({})
121
- const ws = await createWsComponent({ logs })
122
- const server = await createServerComponent<PreviewComponents>({ config, logs, ws: ws.ws }, {})
123
- const rooms = await createRoomsComponent({
124
- metrics,
125
- logs,
126
- config
127
- })
128
-
129
- const programClosed = future<void>()
130
- const signaler: IBaseComponent & ISignalerComponent = {
131
- programClosed,
132
- async stop() {
133
- // this promise is resolved upon SIGTERM or SIGHUP
134
- // or when program.stop is called
135
- programClosed.resolve()
136
- }
137
- }
138
-
139
- return {
140
- ...options.components,
141
- logger: createStdoutCliLogger(),
142
- logs,
143
- ethereumProvider: providerInstance,
144
- rooms,
145
- config,
146
- metrics,
147
- server,
148
- ws,
149
- signaler
150
- }
151
- },
152
- async main({ components, startComponents }) {
153
- await wireRouter(components, projectRoot)
154
- if (watch) {
155
- await wireFileWatcherToWebSockets(components, projectRoot)
156
- }
157
- await startComponents()
158
-
159
- const networkInterfaces = os.networkInterfaces()
160
- const availableURLs: string[] = []
161
- await components.analytics.track('Preview started', {
162
- projectHash: await b64HashingFunction(projectRoot),
163
- coords: baseCoords,
164
- isWorkspace: false
165
- })
166
- components.logger.log(`Preview server is now running!`)
167
- components.logger.log('Available on:\n')
168
-
169
- Object.keys(networkInterfaces).forEach((dev) => {
170
- ;(networkInterfaces[dev] || []).forEach((details) => {
171
- if (details.family === 'IPv4') {
172
- let addr = `http://${details.address}:${port}?position=${baseCoords.x}%2C${baseCoords.y}&ENABLE_ECS7`
173
- if (debug) {
174
- addr = `${addr}&SCENE_DEBUG_PANEL`
175
- }
176
- if (enableWeb3 || hasPortableExperience) {
177
- addr = `${addr}&ENABLE_WEB3`
178
- }
179
-
180
- availableURLs.push(addr)
181
- }
182
- })
183
- })
184
-
185
- // Push localhost and 127.0.0.1 at top
186
- const sortedURLs = availableURLs.sort((a, _b) => {
187
- return a.toLowerCase().includes('localhost') || a.includes('127.0.0.1') || a.includes('0.0.0.0') ? -1 : 1
188
- })
189
-
190
- for (const addr of sortedURLs) {
191
- components.logger.log(` ${addr}`)
192
- }
193
-
194
- if (args['--desktop-client']) {
195
- components.logger.log('\n Desktop client:\n')
196
- for (const addr of sortedURLs) {
197
- const searchParams = new URLSearchParams()
198
- searchParams.append('PREVIEW-MODE', addr)
199
- components.logger.log(` dcl://${searchParams.toString()}&`)
200
- }
201
- }
202
-
203
- components.logger.log('\n Details:\n')
204
- components.logger.log('\nPress CTRL+C to exit\n')
205
-
206
- // Open preferably localhost/127.0.0.1
207
- if (openBrowser && sortedURLs.length && !args['--desktop-client']) {
208
- try {
209
- await open(sortedURLs[0])
210
- } catch (_) {
211
- components.logger.warn('Unable to open browser automatically.')
212
- }
213
- }
214
- }
215
- })
216
-
217
- // this signal is resolved by: (wkc)program.stop(), SIGTERM, SIGHUP
218
- // we must wait for it to resolve (when the server stops) to continue with the
219
- // program
220
- await program.components.signaler.programClosed
221
- }