22/// <reference path='../../../../third_party/typings/es6-promise/es6-promise.d.ts' />
33/// <reference path='../../../../third_party/typings/freedom/freedom-module-env.d.ts' />
44
5- const forge = require ( "forge-min" ) ;
5+ // TODO: https://github.com/uProxy/uproxy/issues/2051
6+ declare var forge : any ;
67
78const POLL_TIMEOUT : number = 5000 ; //milliseconds
89
@@ -38,7 +39,7 @@ interface KeyPair {
3839
3940class Provisioner {
4041
41- constructor ( private dispatch_ : Function , private state_ : any ) { }
42+ constructor ( private dispatch_ : Function , private state_ : any = { } ) { }
4243
4344 /**
4445 * One-click setup of a VM
@@ -57,14 +58,15 @@ class Provisioner {
5758 this . state_ . ssh = keys ;
5859 return this . setupDigitalOcean_ ( name ) ;
5960 // Setup Digital Ocean (SSH key + droplet)
60- } ) . then ( ( actions : any ) => {
61- //console.log(actions);
61+ } ) . then ( ( ) => {
6262 return this . doRequest_ ( "GET" , "droplets/" + this . state_ . cloud . vm . id ) ;
6363 // Get the droplet's configuration
6464 } ) . then ( ( resp : any ) => {
6565 this . sendStatus_ ( "CLOUD_DONE_VM" ) ;
6666 this . state_ . cloud . vm = resp . droplet ;
67- this . state_ . network . ssh_port = 22 ;
67+ this . state_ . network = {
68+ "ssh_port" : 22
69+ } ;
6870 // Retrieve public IPv4 address
6971 for ( var i = 0 ; i < resp . droplet . networks . v4 . length ; i ++ ) {
7072 if ( resp . droplet . networks . v4 [ i ] . type === "public" ) {
@@ -156,7 +158,7 @@ class Provisioner {
156158 } ) . then ( ( responseUrl : string ) => {
157159 var query = responseUrl . substr ( responseUrl . indexOf ( '#' ) + 1 ) ,
158160 param : string ,
159- params : { [ k : string ] : string } ,
161+ params : { [ k : string ] : string } = { } ,
160162 keys = query . split ( '&' ) ,
161163 i = 0 ;
162164 for ( i = 0 ; i < keys . length ; i ++ ) {
@@ -186,7 +188,7 @@ class Provisioner {
186188 private getSshKey_ = ( name : string ) : Promise < KeyPair > => {
187189 var storage = freedom [ "core.storage" ] ( ) ;
188190 return new Promise ( ( F , R ) => {
189- var result : KeyPair ;
191+ var result : KeyPair = < KeyPair > { } ;
190192 Promise . all ( [
191193 storage . get ( "DigitalOcean-" + name + "-PublicKey" ) ,
192194 storage . get ( "DigitalOcean-" + name + "-PrivateKey" )
@@ -222,12 +224,12 @@ class Provisioner {
222224 return new Promise ( ( F , R ) => {
223225 var url = 'https://api.digitalocean.com/v2/' + actionPath ;
224226 var xhr = freedom [ "core.xhr" ] ( ) ;
225- xhr . on ( "onload" , ( resolve : Function , reject : Function , xhr : any , e : Error ) => {
226- xhr . getResponseText ( ) . then ( ( resolve : Function , reject : Function , resp : string ) => {
227+ xhr . on ( "onload" , ( loadInfo : any ) => {
228+ xhr . getResponseText ( ) . then ( ( response : string ) => {
227229 try {
228- resolve ( JSON . parse ( resp ) ) ;
230+ F ( JSON . parse ( response ) ) ;
229231 } catch ( e ) {
230- reject ( e ) ;
232+ R ( e ) ;
231233 }
232234 } ) ;
233235 } ) ;
@@ -247,22 +249,22 @@ class Provisioner {
247249 /**
248250 * Waits for all in-progress Digital Ocean actions to complete
249251 * e.g. after powering on a machine, or creating a VM
250- * @param {Function } resolve - call when done
251- * @param {Function } reject - call on failure
252252 */
253- private waitDigitalOceanActions_ = ( resolve : Function , reject : Function ) : void => {
253+ private waitDigitalOceanActions_ = ( ) : Promise < void > => {
254254 console . log ( "Polling for Digital Ocean in-progress actions" ) ;
255- this . doRequest_ ( "GET" , "droplets/" + this . state_ . cloud . vm . id + "/actions" ) . then ( ( resp : any ) => {
255+ return this . doRequest_ ( "GET" , "droplets/" + this . state_ . cloud . vm . id + "/actions" ) . then ( ( resp : any ) => {
256256 for ( var i = 0 ; i < resp . actions . length ; i ++ ) {
257257 if ( resp . actions [ i ] . status === "in-progress" ) {
258- setTimeout ( this . waitDigitalOceanActions_ , POLL_TIMEOUT ) ;
259- return ;
258+ return new Promise < void > ( ( F , R ) => {
259+ setTimeout ( ( ) => {
260+ this . waitDigitalOceanActions_ ( ) . then ( F , R ) ;
261+ } , POLL_TIMEOUT ) ;
262+ } ) ;
260263 }
261264 }
262- resolve ( resp ) ;
263265 } ) . catch ( ( e : Error ) => {
264266 console . error ( "Error waiting for digital ocean actions:" + JSON . stringify ( e ) ) ;
265- reject ( e ) ;
267+ throw e ;
266268 } ) ;
267269 }
268270
@@ -280,7 +282,6 @@ class Provisioner {
280282 this . sendStatus_ ( "CLOUD_INIT_ADDKEY" ) ;
281283 // Get SSH keys in account
282284 this . doRequest_ ( "GET" , "account/keys" ) . then ( ( resp : any ) => {
283- //console.log(resp);
284285 for ( var i = 0 ; i < resp . ssh_keys . length ; i ++ ) {
285286 if ( resp . ssh_keys [ i ] . public_key === this . state_ . ssh . public ) {
286287 return Promise . resolve ( {
@@ -295,14 +296,12 @@ class Provisioner {
295296 } ) ) ;
296297 // If missing, put SSH key into account
297298 } ) . then ( ( resp : any ) => {
298- //console.log(resp);
299299 this . state_ . cloud . ssh = resp . ssh_key ;
300300 this . sendStatus_ ( "CLOUD_DONE_ADDKEY" ) ;
301301 this . sendStatus_ ( "CLOUD_INIT_VM" ) ;
302302 return this . doRequest_ ( "GET" , "droplets" ) ;
303303 // Get list of droplets
304304 } ) . then ( ( resp : any ) => {
305- //console.log(resp);
306305 for ( var i = 0 ; i < resp . droplets . length ; i ++ ) {
307306 if ( resp . droplets [ i ] . name === name ) {
308307 return Promise . resolve ( {
@@ -320,7 +319,6 @@ class Provisioner {
320319 } ) ) ;
321320 // If missing, create the droplet
322321 } ) . then ( ( resp : any ) => {
323- //console.log(resp);
324322 this . state_ . cloud . vm = resp . droplet ;
325323 if ( resp . droplet . status == "off" ) {
326324 // Need to power on VM
@@ -334,9 +332,8 @@ class Provisioner {
334332 }
335333 // If the machine exists, but powered off, turn it on
336334 } ) . then ( ( resp : any ) => {
337- //console.log(resp);
338335 this . sendStatus_ ( "CLOUD_WAITING_VM" ) ;
339- this . waitDigitalOceanActions_ ( F , R ) ;
336+ this . waitDigitalOceanActions_ ( ) . then ( F , R ) ;
340337 // Wait for all in-progress actions to complete
341338 } ) . catch ( ( err : Error ) => {
342339 console . error ( "Error w/DigitalOcean: " + err ) ;
@@ -350,8 +347,4 @@ class Provisioner {
350347 }
351348}
352349
353- if ( typeof freedom !== 'undefined' ) {
354- freedom [ 'provisioner' ] ( ) . providePromises ( Provisioner ) ;
355- }
356-
357350export = Provisioner ;
0 commit comments