/
render.ts
90 lines (81 loc) · 2.45 KB
/
render.ts
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
82
83
84
85
86
87
88
89
90
import { flags } from '@oclif/command';
import { logError, renderScene } from '@vertexvis/vertex-api-client';
import { cli } from 'cli-ux';
import { createWriteStream, writeFile } from 'fs-extra';
import BaseRenderCommand from '../../lib/base-render';
import { vertexClient } from '../../lib/client';
import {
createFile,
generateHtml,
validate,
validateImage,
} from '../../lib/renderer';
export default class Render extends BaseRenderCommand {
public static description = `Render a scene.`;
public static examples = [
`$ vertex scenes:render 54964c61-05d8-4f37-9638-18f7c4960c80
54964c61-05d8-4f37-9638-18f7c4960c80.jpg
`,
];
public static args = [{ name: 'id' }];
public static flags = {
...BaseRenderCommand.flags,
viewer: flags.boolean({
description: 'Create Web SDK Viewer HTML instead of jpg image.',
default: false,
}),
};
public async run(): Promise<void> {
const {
args: { id },
flags: { height, output, verbose, viewer, width },
} = this.parse(Render);
const basePath = this.parsedFlags?.basePath;
validate({ height, onError: this.error, width });
try {
const resource = 'scene';
const client = await vertexClient(basePath, this.userConfig);
if (viewer) {
const streamKeyRes = await client.streamKeys.createSceneStreamKey({
id: id,
createStreamKeyRequest: {
data: { attributes: {}, type: 'stream-key' },
},
});
const out = output || `${id}.html`;
const key = streamKeyRes.data.data.attributes.key;
if (!key) this.error('Error creating stream-key');
await writeFile(
out,
generateHtml(key, basePath, this.userConfig?.client?.id)
);
cli.open(out);
this.log(out);
} else {
const renderRes = await renderScene<NodeJS.ReadableStream>({
client,
onMsg: console.error,
renderReq: {
id,
height: height,
width: width,
},
verbose,
});
validateImage({
id,
length: renderRes.headers['content-length'],
onError: this.error,
resource,
});
const out = output || `${id}.jpg`;
renderRes.data.pipe(createWriteStream(out));
await createFile(renderRes.data, out);
cli.open(out);
this.log(out);
}
} catch (error) {
logError(error, this.error);
}
}
}