UNPKG

heroku

Version:

CLI to interact with Heroku

92 lines (91 loc) 3.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const color_1 = require("@heroku-cli/color"); const command_1 = require("@heroku-cli/command"); const core_1 = require("@oclif/core"); const tsheredoc_1 = require("tsheredoc"); const spinner_1 = require("@oclif/core/lib/cli-ux/action/spinner"); const debug_1 = require("debug"); const spaces_1 = require("../../lib/spaces/spaces"); const notifications_1 = require("@heroku-cli/notifications"); const spacesDebug = (0, debug_1.default)('spaces:wait'); class Wait extends command_1.Command { async run() { const { flags, args } = await this.parse(Wait); const spaceName = flags.space || args.space; if (!spaceName) { core_1.ux.error((0, tsheredoc_1.default)(` Error: Missing 1 required arg: space See more help with --help `)); } const interval = flags.interval * 1000; const timeout = flags.timeout * 1000; const deadline = new Date(Date.now() + timeout); const action = new spinner_1.default(); action.start(`Waiting for space ${color_1.default.green(spaceName)} to allocate`); const headers = { Accept: 'application/vnd.heroku+json; version=3.fir', }; if (!flags.json) { headers['Accept-Expansion'] = 'region'; } let { body: space } = await this.heroku.get(`/spaces/${spaceName}`, { headers }); while (space.state === 'allocating') { if (new Date() > deadline) { throw new Error('Timeout waiting for space to become allocated.'); } await this.wait(interval); const { body: updatedSpace } = await this.heroku.get(`/spaces/${spaceName}`, { headers }); space = updatedSpace; } try { const { body: nat } = await this.heroku.get(`/spaces/${spaceName}/nat`, { headers: { Accept: 'application/vnd.heroku+json; version=3.fir' } }); space.outbound_ips = nat; } catch (error) { spacesDebug(`Retrieving NAT details for the space failed with ${error}`); } action.stop(); (0, spaces_1.renderInfo)(space, flags.json); this.notify(spaceName); } wait(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } notify(spaceName) { try { const notification = { title: spaceName, subtitle: `heroku spaces:wait ${spaceName}`, message: 'space was successfully created', sound: true, }; (0, notifications_1.notify)(notification); } catch (error) { core_1.ux.warn(error); } } } exports.default = Wait; Wait.topic = 'spaces'; Wait.description = 'wait for a space to be created'; Wait.flags = { space: command_1.flags.string({ char: 's', description: 'space to get info of' }), json: command_1.flags.boolean({ description: 'output in json format' }), interval: command_1.flags.integer({ char: 'i', description: 'seconds to wait between poll intervals', default: 30, }), timeout: command_1.flags.integer({ char: 't', description: 'maximum number of seconds to wait', default: 25 * 60, }), }; Wait.args = { space: core_1.Args.string({ hidden: true }), };