Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(955)

Side by Side Diff: remoting/webapp/crd/js/host_daemon_facade.js

Issue 1049873007: Refactored HostDaemonFacade so that replies to requests are handled in (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fixed broken merge Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @fileoverview 6 * @fileoverview
7 * Class to communicate with the host daemon via Native Messaging. 7 * Class to communicate with the host daemon via Native Messaging.
8 */ 8 */
9 9
10 'use strict'; 10 'use strict';
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 }; 77 };
78 78
79 /** 79 /**
80 * Connects to the native messaging host and sends a hello message. 80 * Connects to the native messaging host and sends a hello message.
81 * 81 *
82 * @return {Promise} A promise that fulfills when the connection attempt 82 * @return {Promise} A promise that fulfills when the connection attempt
83 * succeeds or fails. 83 * succeeds or fails.
84 * @private 84 * @private
85 */ 85 */
86 remoting.HostDaemonFacade.prototype.connectNative_ = function() { 86 remoting.HostDaemonFacade.prototype.connectNative_ = function() {
87 var that = this;
87 try { 88 try {
88 this.port_ = chrome.runtime.connectNative( 89 this.port_ = chrome.runtime.connectNative(
89 'com.google.chrome.remote_desktop'); 90 'com.google.chrome.remote_desktop');
90 this.port_.onMessage.addListener(this.onIncomingMessageCallback_); 91 this.port_.onMessage.addListener(this.onIncomingMessageCallback_);
91 this.port_.onDisconnect.addListener(this.onDisconnectCallback_); 92 this.port_.onDisconnect.addListener(this.onDisconnectCallback_);
92 return this.postMessageInternal_({type: 'hello'}); 93 return this.postMessageInternal_({type: 'hello'}).then(function(reply) {
94 that.version_ = base.getStringAttr(reply, 'version');
95 // Old versions of the native messaging host do not return this list.
96 // Those versions default to the empty list of supported features.
97 that.supportedFeatures_ =
98 base.getArrayAttr(reply, 'supportedFeatures', []);
99 });
93 } catch (/** @type {*} */ err) { 100 } catch (/** @type {*} */ err) {
94 console.log('Native Messaging initialization failed: ', err); 101 console.log('Native Messaging initialization failed: ', err);
95 throw remoting.Error.unexpected(); 102 throw remoting.Error.unexpected();
96 } 103 }
97 }; 104 };
98 105
99 /** 106 /**
100 * Type used for entries of |pendingReplies_| list. 107 * Type used for entries of |pendingReplies_| list.
101 * 108 *
102 * @param {string} type Type of the originating request. 109 * @param {string} type Type of the originating request.
(...skipping 21 matching lines...) Expand all
124 return that.supportedFeatures_.indexOf(feature) >= 0; 131 return that.supportedFeatures_.indexOf(feature) >= 0;
125 }, function () { 132 }, function () {
126 return false; 133 return false;
127 }); 134 });
128 }; 135 };
129 136
130 /** 137 /**
131 * Initializes that the Daemon if necessary and posts the supplied message. 138 * Initializes that the Daemon if necessary and posts the supplied message.
132 * 139 *
133 * @param {{type: string}} message The message to post. 140 * @param {{type: string}} message The message to post.
134 * @return {!Promise} 141 * @return {!Promise<!Object>}
135 * @private 142 * @private
136 */ 143 */
137 remoting.HostDaemonFacade.prototype.postMessage_ = 144 remoting.HostDaemonFacade.prototype.postMessage_ =
138 function(message) { 145 function(message) {
139 /** @type {remoting.HostDaemonFacade} */ 146 /** @type {remoting.HostDaemonFacade} */
140 var that = this; 147 var that = this;
141 return this.initialize_().then(function() { 148 return this.initialize_().then(function() {
142 return that.postMessageInternal_(message); 149 return that.postMessageInternal_(message);
143 }, function() { 150 }, function() {
144 throw that.error_; 151 throw that.error_;
145 }); 152 });
146 }; 153 };
147 154
148 /** 155 /**
149 * Attaches a new ID to the supplied message, and posts it to the 156 * Attaches a new ID to the supplied message, and posts it to the
150 * Native Messaging port, adding a Deferred object to the list of 157 * Native Messaging port, adding a Deferred object to the list of
151 * pending replies. |message| should have its 'type' field set, and 158 * pending replies. |message| should have its 'type' field set, and
152 * any other fields set depending on the message type. 159 * any other fields set depending on the message type.
153 * 160 *
154 * @param {{type: string}} message The message to post. 161 * @param {{type: string}} message The message to post.
155 * @return {!Promise} 162 * @return {!Promise<!Object>}
156 * @private 163 * @private
157 */ 164 */
158 remoting.HostDaemonFacade.prototype.postMessageInternal_ = function(message) { 165 remoting.HostDaemonFacade.prototype.postMessageInternal_ = function(message) {
159 var id = this.nextId_++; 166 var id = this.nextId_++;
160 message['id'] = id; 167 message['id'] = id;
161 var deferred = new base.Deferred(); 168 var deferred = new base.Deferred();
162 this.pendingReplies_[id] = new remoting.HostDaemonFacade.PendingReply( 169 this.pendingReplies_[id] = new remoting.HostDaemonFacade.PendingReply(
163 message.type + 'Response', deferred); 170 message.type + 'Response', deferred);
164 this.port_.postMessage(message); 171 this.port_.postMessage(message);
165 return deferred.promise(); 172 return deferred.promise();
(...skipping 18 matching lines...) Expand all
184 console.error('NativeMessaging: unexpected id: ', id); 191 console.error('NativeMessaging: unexpected id: ', id);
185 return; 192 return;
186 } 193 }
187 delete this.pendingReplies_[id]; 194 delete this.pendingReplies_[id];
188 195
189 try { 196 try {
190 var type = base.getStringAttr(message, 'type'); 197 var type = base.getStringAttr(message, 'type');
191 if (type != reply.type) { 198 if (type != reply.type) {
192 throw 'Expected reply type: ' + reply.type + ', got: ' + type; 199 throw 'Expected reply type: ' + reply.type + ', got: ' + type;
193 } 200 }
194 201 reply.deferred.resolve(message);
195 reply.deferred.resolve(this.handleIncomingMessage_(message));
196 } catch (/** @type {*} */ e) { 202 } catch (/** @type {*} */ e) {
197 console.error('Error while processing native message', e); 203 console.error('Error while processing native message', e);
198 reply.deferred.reject(remoting.Error.unexpected()); 204 reply.deferred.reject(remoting.Error.unexpected());
199 } 205 }
200 }; 206 };
201 207
202 /** 208 /**
203 * Handler for incoming Native Messages.
204 *
205 * TODO(jrw) Consider refactoring so each method handles its own
206 * response, e.g.:
207 *
208 * remoting.HostDaemonFacade.prototype.generateKeyPair = function() {
209 * this.postMessage_({type: 'generateKeyPair'}).then(function(message) {
210 * return {
211 * privateKey: base.getStringAttr(message, 'privateKey'),
212 * publicKey: base.getStringAttr(message, 'publicKey')
213 * }
214 * });
215 * };
216 *
217 * @param {Object} message The received message.
218 * @return {*}
219 * @private
220 */
221 remoting.HostDaemonFacade.prototype.handleIncomingMessage_ =
222 function(message) {
223 var type = base.getStringAttr(message, 'type');
224
225 switch (type) {
226 case 'helloResponse':
227 this.version_ = base.getStringAttr(message, 'version');
228 // Old versions of the native messaging host do not return this list.
229 // Those versions default to the empty list of supported features.
230 this.supportedFeatures_ =
231 base.getArrayAttr(message, 'supportedFeatures', []);
232 return null;
233
234 case 'getHostNameResponse':
235 return base.getStringAttr(message, 'hostname');
236
237 case 'getPinHashResponse':
238 return base.getStringAttr(message, 'hash');
239
240 case 'generateKeyPairResponse':
241 return {
242 privateKey: base.getStringAttr(message, 'privateKey'),
243 publicKey: base.getStringAttr(message, 'publicKey')
244 };
245
246 case 'updateDaemonConfigResponse':
247 return remoting.HostController.AsyncResult.fromString(
248 base.getStringAttr(message, 'result'));
249
250 case 'getDaemonConfigResponse':
251 return base.getObjectAttr(message, 'config');
252
253 case 'getUsageStatsConsentResponse':
254 return {
255 supported: base.getBooleanAttr(message, 'supported'),
256 allowed: base.getBooleanAttr(message, 'allowed'),
257 setByPolicy: base.getBooleanAttr(message, 'setByPolicy')
258 };
259
260 case 'startDaemonResponse':
261 case 'stopDaemonResponse':
262 return remoting.HostController.AsyncResult.fromString(
263 base.getStringAttr(message, 'result'));
264
265 case 'getDaemonStateResponse':
266 return remoting.HostController.State.fromString(
267 base.getStringAttr(message, 'state'));
268
269 case 'getPairedClientsResponse':
270 var pairedClients = remoting.PairedClient.convertToPairedClientArray(
271 message['pairedClients']);
272 if (pairedClients != null) {
273 return pairedClients;
274 } else {
275 throw 'No paired clients!';
276 }
277
278 case 'clearPairedClientsResponse':
279 case 'deletePairedClientResponse':
280 return base.getBooleanAttr(message, 'result');
281
282 case 'getHostClientIdResponse':
283 return base.getStringAttr(message, 'clientId');
284
285 case 'getCredentialsFromAuthCodeResponse':
286 var userEmail = base.getStringAttr(message, 'userEmail');
287 var refreshToken = base.getStringAttr(message, 'refreshToken');
288 if (userEmail && refreshToken) {
289 return {
290 userEmail: userEmail,
291 refreshToken: refreshToken
292 };
293 } else {
294 throw 'Missing userEmail or refreshToken';
295 }
296
297 case 'getRefreshTokenFromAuthCodeResponse':
298 var refreshToken = base.getStringAttr(message, 'refreshToken');
299 if (refreshToken) {
300 return refreshToken;
301 } else {
302 throw 'Missing refreshToken';
303 }
304
305 default:
306 throw 'Unexpected native message: ' + message;
307 }
308 };
309
310 /**
311 * @return {void} Nothing. 209 * @return {void} Nothing.
312 * @private 210 * @private
313 */ 211 */
314 remoting.HostDaemonFacade.prototype.onDisconnect_ = function() { 212 remoting.HostDaemonFacade.prototype.onDisconnect_ = function() {
315 console.error('Native Message port disconnected'); 213 console.error('Native Message port disconnected');
316 214
317 this.port_.onDisconnect.removeListener(this.onDisconnectCallback_); 215 this.port_.onDisconnect.removeListener(this.onDisconnectCallback_);
318 this.port_.onMessage.removeListener(this.onIncomingMessageCallback_); 216 this.port_.onMessage.removeListener(this.onIncomingMessageCallback_);
319 this.port_ = null; 217 this.port_ = null;
320 218
(...skipping 11 matching lines...) Expand all
332 pendingReplies[num_id].deferred.reject(this.error_); 230 pendingReplies[num_id].deferred.reject(this.error_);
333 } 231 }
334 } 232 }
335 233
336 /** 234 /**
337 * Gets local hostname. 235 * Gets local hostname.
338 * 236 *
339 * @return {!Promise<string>} 237 * @return {!Promise<string>}
340 */ 238 */
341 remoting.HostDaemonFacade.prototype.getHostName = function() { 239 remoting.HostDaemonFacade.prototype.getHostName = function() {
342 return this.postMessage_({type: 'getHostName'}); 240 return this.postMessage_({type: 'getHostName'}).then(function(reply) {
241 return base.getStringAttr(reply, 'hostname');
242 });
343 }; 243 };
344 244
345 /** 245 /**
346 * Calculates PIN hash value to be stored in the config, passing the resulting 246 * Calculates PIN hash value to be stored in the config, passing the resulting
347 * hash value base64-encoded to the callback. 247 * hash value base64-encoded to the callback.
348 * 248 *
349 * @param {string} hostId The host ID. 249 * @param {string} hostId The host ID.
350 * @param {string} pin The PIN. 250 * @param {string} pin The PIN.
351 * @return {!Promise<string>} 251 * @return {!Promise<string>}
352 */ 252 */
353 remoting.HostDaemonFacade.prototype.getPinHash = function(hostId, pin) { 253 remoting.HostDaemonFacade.prototype.getPinHash = function(hostId, pin) {
354 return this.postMessage_({ 254 return this.postMessage_({
355 type: 'getPinHash', 255 type: 'getPinHash',
356 hostId: hostId, 256 hostId: hostId,
357 pin: pin 257 pin: pin
258 }).then(function(reply) {
259 return base.getStringAttr(reply, 'hash');
358 }); 260 });
359 }; 261 };
360 262
361 /** 263 /**
362 * Generates new key pair to use for the host. The specified callback is called 264 * Generates new key pair to use for the host. The specified callback is called
363 * when the key is generated. The key is returned in format understood by the 265 * when the key is generated. The key is returned in format understood by the
364 * host (PublicKeyInfo structure encoded with ASN.1 DER, and then BASE64). 266 * host (PublicKeyInfo structure encoded with ASN.1 DER, and then BASE64).
365 * 267 *
366 * @return {!Promise<remoting.KeyPair>} 268 * @return {!Promise<remoting.KeyPair>}
367 */ 269 */
368 remoting.HostDaemonFacade.prototype.generateKeyPair = function() { 270 remoting.HostDaemonFacade.prototype.generateKeyPair = function() {
369 return this.postMessage_({type: 'generateKeyPair'}); 271 return this.postMessage_({type: 'generateKeyPair'}).then(function(reply) {
272 return {
273 privateKey: base.getStringAttr(reply, 'privateKey'),
274 publicKey: base.getStringAttr(reply, 'publicKey')
275 };
276 });
370 }; 277 };
371 278
372 /** 279 /**
373 * Updates host config with the values specified in |config|. All 280 * Updates host config with the values specified in |config|. All
374 * fields that are not specified in |config| remain 281 * fields that are not specified in |config| remain
375 * unchanged. Following parameters cannot be changed using this 282 * unchanged. Following parameters cannot be changed using this
376 * function: host_id, xmpp_login. Error is returned if |config| 283 * function: host_id, xmpp_login. Error is returned if |config|
377 * includes these parameters. Changes take effect before the callback 284 * includes these parameters. Changes take effect before the callback
378 * is called. 285 * is called.
379 * 286 *
380 * TODO(jrw): Consider conversion exceptions to AsyncResult values. 287 * TODO(jrw): Consider conversion exceptions to AsyncResult values.
381 * 288 *
382 * @param {Object} config The new config parameters. 289 * @param {Object} config The new config parameters.
383 * @return {!Promise<remoting.HostController.AsyncResult>} 290 * @return {!Promise<remoting.HostController.AsyncResult>}
384 */ 291 */
385 remoting.HostDaemonFacade.prototype.updateDaemonConfig = function(config) { 292 remoting.HostDaemonFacade.prototype.updateDaemonConfig = function(config) {
386 return this.postMessage_({ 293 return this.postMessage_({
387 type: 'updateDaemonConfig', 294 type: 'updateDaemonConfig',
388 config: config 295 config: config
296 }).then(function(reply) {
297 return remoting.HostController.AsyncResult.fromString(
298 base.getStringAttr(reply, 'result'));
389 }); 299 });
390 }; 300 };
391 301
392 /** 302 /**
393 * Loads daemon config. The config is passed as a JSON formatted string to the 303 * Loads daemon config. The config is passed as a JSON formatted string to the
394 * callback. 304 * callback.
395 * @return {!Promise<Object>} 305 * @return {!Promise<Object>}
396 */ 306 */
397 remoting.HostDaemonFacade.prototype.getDaemonConfig = function() { 307 remoting.HostDaemonFacade.prototype.getDaemonConfig = function() {
398 return this.postMessage_({type: 'getDaemonConfig'}); 308 return this.postMessage_({type: 'getDaemonConfig'}).then(function(reply) {
309 return base.getObjectAttr(reply, 'config');
310 });
399 }; 311 };
400 312
401 /** 313 /**
402 * Retrieves daemon version. The version is returned as a dotted decimal 314 * Retrieves daemon version. The version is returned as a dotted decimal
403 * string of the form major.minor.build.patch. 315 * string of the form major.minor.build.patch.
404 * 316 *
405 * @return {!Promise<string>} 317 * @return {!Promise<string>}
406 */ 318 */
407 remoting.HostDaemonFacade.prototype.getDaemonVersion = function() { 319 remoting.HostDaemonFacade.prototype.getDaemonVersion = function() {
408 /** @type {remoting.HostDaemonFacade} */ 320 /** @type {remoting.HostDaemonFacade} */
409 var that = this; 321 var that = this;
410 return this.initialize_().then(function() { 322 return this.initialize_().then(function() {
411 return that.version_; 323 return that.version_;
412 }, function() { 324 }, function() {
413 throw that.error_; 325 throw that.error_;
414 }); 326 });
415 }; 327 };
416 328
417 /** 329 /**
418 * Get the user's consent to crash reporting. The consent flags are passed to 330 * Get the user's consent to crash reporting. The consent flags are passed to
419 * the callback as booleans: supported, allowed, set-by-policy. 331 * the callback as booleans: supported, allowed, set-by-policy.
420 * 332 *
421 * @return {!Promise<remoting.UsageStatsConsent>} 333 * @return {!Promise<remoting.UsageStatsConsent>}
422 */ 334 */
423 remoting.HostDaemonFacade.prototype.getUsageStatsConsent = function() { 335 remoting.HostDaemonFacade.prototype.getUsageStatsConsent = function() {
424 return this.postMessage_({type: 'getUsageStatsConsent'}); 336 return this.postMessage_({type: 'getUsageStatsConsent'}).
337 then(function(reply) {
338 return {
339 supported: base.getBooleanAttr(reply, 'supported'),
340 allowed: base.getBooleanAttr(reply, 'allowed'),
341 setByPolicy: base.getBooleanAttr(reply, 'setByPolicy')
342 };
343 });
425 }; 344 };
426 345
427 /** 346 /**
428 * Starts the daemon process with the specified configuration. 347 * Starts the daemon process with the specified configuration.
429 * 348 *
430 * TODO(jrw): Consider conversion exceptions to AsyncResult values. 349 * TODO(jrw): Consider conversion exceptions to AsyncResult values.
431 * 350 *
432 * @param {Object} config Host configuration. 351 * @param {Object} config Host configuration.
433 * @param {boolean} consent Consent to report crash dumps. 352 * @param {boolean} consent Consent to report crash dumps.
434 * @return {!Promise<remoting.HostController.AsyncResult>} 353 * @return {!Promise<remoting.HostController.AsyncResult>}
435 */ 354 */
436 remoting.HostDaemonFacade.prototype.startDaemon = function(config, consent) { 355 remoting.HostDaemonFacade.prototype.startDaemon = function(config, consent) {
437 return this.postMessage_({ 356 return this.postMessage_({
438 type: 'startDaemon', 357 type: 'startDaemon',
439 config: config, 358 config: config,
440 consent: consent 359 consent: consent
360 }).then(function(reply) {
361 return remoting.HostController.AsyncResult.fromString(
362 base.getStringAttr(reply, 'result'));
441 }); 363 });
442 }; 364 };
443 365
444 /** 366 /**
445 * Stops the daemon process. 367 * Stops the daemon process.
446 * 368 *
447 * TODO(jrw): Consider conversion exceptions to AsyncResult values. 369 * TODO(jrw): Consider conversion exceptions to AsyncResult values.
448 * 370 *
449 * @return {!Promise<remoting.HostController.AsyncResult>} 371 * @return {!Promise<remoting.HostController.AsyncResult>}
450 */ 372 */
451 remoting.HostDaemonFacade.prototype.stopDaemon = 373 remoting.HostDaemonFacade.prototype.stopDaemon =
452 function() { 374 function() {
453 return this.postMessage_({type: 'stopDaemon'}); 375 return this.postMessage_({type: 'stopDaemon'}).then(function(reply) {
376 return remoting.HostController.AsyncResult.fromString(
377 base.getStringAttr(reply, 'result'));
378 });
454 }; 379 };
455 380
456 /** 381 /**
457 * Gets the installed/running state of the Host process. 382 * Gets the installed/running state of the Host process.
458 * 383 *
459 * @return {!Promise<remoting.HostController.State>} 384 * @return {!Promise<remoting.HostController.State>}
460 */ 385 */
461 remoting.HostDaemonFacade.prototype.getDaemonState = function() { 386 remoting.HostDaemonFacade.prototype.getDaemonState = function() {
462 return this.postMessage_({type: 'getDaemonState'}); 387 return this.postMessage_({type: 'getDaemonState'}).then(function(reply) {
388 return remoting.HostController.State.fromString(
389 base.getStringAttr(reply, 'state'));
390 });
463 }; 391 };
464 392
465 /** 393 /**
466 * Retrieves the list of paired clients. 394 * Retrieves the list of paired clients.
467 * 395 *
468 * @return {!Promise<Array<remoting.PairedClient>>} 396 * @return {!Promise<Array<remoting.PairedClient>>}
469 */ 397 */
470 remoting.HostDaemonFacade.prototype.getPairedClients = function() { 398 remoting.HostDaemonFacade.prototype.getPairedClients = function() {
471 return this.postMessage_({type: 'getPairedClients'}); 399 return this.postMessage_({type: 'getPairedClients'}).then(function(reply) {
400 var pairedClients =remoting.PairedClient.convertToPairedClientArray(
401 reply['pairedClients']);
402 if (pairedClients != null) {
403 return pairedClients;
404 } else {
405 throw remoting.Error.unexpected('No paired clients!');
406 }
407 });
472 }; 408 };
473 409
474 /** 410 /**
475 * Clears all paired clients from the registry. 411 * Clears all paired clients from the registry.
476 * 412 *
477 * @return {!Promise<boolean>} 413 * @return {!Promise<boolean>}
478 */ 414 */
479 remoting.HostDaemonFacade.prototype.clearPairedClients = function() { 415 remoting.HostDaemonFacade.prototype.clearPairedClients = function() {
480 return this.postMessage_({type: 'clearPairedClients'}); 416 return this.postMessage_({type: 'clearPairedClients'}).then(function(reply) {
417 return base.getBooleanAttr(reply, 'result');
418 });
481 }; 419 };
482 420
483 /** 421 /**
484 * Deletes a paired client referenced by client id. 422 * Deletes a paired client referenced by client id.
485 * 423 *
486 * @param {string} client Client to delete. 424 * @param {string} client Client to delete.
487 * @return {!Promise<boolean>} 425 * @return {!Promise<boolean>}
488 */ 426 */
489 remoting.HostDaemonFacade.prototype.deletePairedClient = function(client) { 427 remoting.HostDaemonFacade.prototype.deletePairedClient = function(client) {
490 return this.postMessage_({ 428 return this.postMessage_({
491 type: 'deletePairedClient', 429 type: 'deletePairedClient',
492 clientId: client 430 clientId: client
431 }).then(function(reply) {
432 return base.getBooleanAttr(reply, 'result');
493 }); 433 });
494 }; 434 };
495 435
496 /** 436 /**
497 * Gets the API keys to obtain/use service account credentials. 437 * Gets the API keys to obtain/use service account credentials.
498 * 438 *
499 * @return {!Promise<string>} 439 * @return {!Promise<string>}
500 */ 440 */
501 remoting.HostDaemonFacade.prototype.getHostClientId = function() { 441 remoting.HostDaemonFacade.prototype.getHostClientId = function() {
502 return this.postMessage_({type: 'getHostClientId'}); 442 return this.postMessage_({type: 'getHostClientId'}).then(function(reply) {
443 return base.getStringAttr(reply, 'clientId');
444 });
503 }; 445 };
504 446
505 /** 447 /**
506 * @param {string} authorizationCode OAuth authorization code. 448 * @param {string} authorizationCode OAuth authorization code.
507 * @return {!Promise<{remoting.XmppCredentials}>} 449 * @return {!Promise<{remoting.XmppCredentials}>}
508 */ 450 */
509 remoting.HostDaemonFacade.prototype.getCredentialsFromAuthCode = 451 remoting.HostDaemonFacade.prototype.getCredentialsFromAuthCode =
510 function(authorizationCode) { 452 function(authorizationCode) {
511 return this.postMessage_({ 453 return this.postMessage_({
512 type: 'getCredentialsFromAuthCode', 454 type: 'getCredentialsFromAuthCode',
513 authorizationCode: authorizationCode 455 authorizationCode: authorizationCode
456 }).then(function(reply) {
457 var userEmail = base.getStringAttr(reply, 'userEmail');
458 var refreshToken = base.getStringAttr(reply, 'refreshToken');
459 if (userEmail && refreshToken) {
460 return {
461 userEmail: userEmail,
462 refreshToken: refreshToken
463 };
464 } else {
465 throw remoting.Error.unexpected('Missing userEmail or refreshToken');
466 }
514 }); 467 });
515 }; 468 };
516 469
517 /** 470 /**
518 * @param {string} authorizationCode OAuth authorization code. 471 * @param {string} authorizationCode OAuth authorization code.
519 * @return {!Promise<string>} 472 * @return {!Promise<string>}
520 */ 473 */
521 remoting.HostDaemonFacade.prototype.getRefreshTokenFromAuthCode = 474 remoting.HostDaemonFacade.prototype.getRefreshTokenFromAuthCode =
522 function(authorizationCode) { 475 function(authorizationCode) {
523 return this.postMessage_({ 476 return this.postMessage_({
524 type: 'getRefreshTokenFromAuthCode', 477 type: 'getRefreshTokenFromAuthCode',
525 authorizationCode: authorizationCode 478 authorizationCode: authorizationCode
479 }).then(function(reply) {
480 var refreshToken = base.getStringAttr(reply, 'refreshToken');
481 if (refreshToken) {
482 return refreshToken
483 } else {
484 throw remoting.Error.unexpected('Missing refreshToken');
485 }
526 }); 486 });
527 }; 487 };
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698