index.ts 2.1 KB
Newer Older
P
Peter Pan 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
/* eslint-disable no-console */

import IO from './io';
import {SIGINT} from 'constants';
import type {Worker} from './types';
import getPort from 'get-port';
import mkdirp from 'mkdirp';
import path from 'path';
import rimraf from 'rimraf';
import {spawn} from 'child_process';

const host = '127.0.0.1';
const publicPath = '/visualdl';
const pages = ['common', 'scalar', 'histogram', 'image', 'audio', 'graph', 'pr-curve', 'high-dimensional'];
const dataDir = path.resolve(__dirname, '../data');

async function start() {
    rimraf.sync(dataDir);

    const port = await getPort({host});

    mkdirp.sync(dataDir);

    const io = new IO(`http://${host}:${port}${publicPath}`, dataDir);

    const p = spawn(
        'visualdl',
        [
            '--logdir',
            '.',
            '--model',
            './graph/__model__',
            '--host',
            host,
            '--port',
            String(port),
            '--public-path',
            publicPath
        ],
        {
            cwd: path.resolve(__dirname, '../logs'),
            stdio: ['ignore', 'pipe', 'pipe']
        }
    );

    p.on('error', err => console.error(err));

    const stop = () => {
        if (!p.killed) {
            p.kill(SIGINT);
        }
    };

    const check = async (data: Buffer) => {
        const message = data.toString();
        if (message.startsWith('Running VisualDL')) {
            p.stdout.off('data', check);
            p.stderr.off('data', check);
            await Promise.all(
                pages.map(
                    page =>
                        new Promise((resolve, reject) => {
                            import(`./${page}`)
                                .then(data => data.default)
                                .then((worker: Worker) => worker(io).then(resolve))
                                .catch(reject);
                        })
                )
            );
            await io.generateMeta();
            stop();
        }
    };

    p.stdout.on('data', check);
    p.stderr.on('data', check);

    process.on('exit', stop);
}

start();