77 lines
1.7 KiB
JavaScript
77 lines
1.7 KiB
JavaScript
import Service from '@ember/service';
|
|
import { assert } from '@ember/debug';
|
|
import { inject as service } from '@ember/service';
|
|
|
|
export default class OriginService extends Service {
|
|
|
|
// =services
|
|
|
|
@service ipc;
|
|
@service store;
|
|
@service storage;
|
|
|
|
// =attributes
|
|
|
|
/**
|
|
* @type {ApplicationAdapter}
|
|
*/
|
|
get adapter() {
|
|
return this.store.adapterFor('application');
|
|
}
|
|
|
|
/**
|
|
* @type {?string}
|
|
*/
|
|
get rendererOrigin() {
|
|
return this.storage.getItem('origin');
|
|
}
|
|
|
|
/**
|
|
* @param {?string} origin
|
|
*/
|
|
set rendererOrigin(origin) {
|
|
this.storage.setItem('origin', origin);
|
|
}
|
|
|
|
/**
|
|
* @type {Promise{?string}}
|
|
*/
|
|
get mainOrigin() {
|
|
return this.ipc.invoke('getOrigin');
|
|
}
|
|
|
|
// =methods
|
|
|
|
/**
|
|
* Sets the main origin equal to the current renderer origin (if any).
|
|
*/
|
|
async updateOrigin() {
|
|
const rendererOrigin = this.rendererOrigin;
|
|
if (rendererOrigin) await this.setOrigin(rendererOrigin);
|
|
}
|
|
|
|
/**
|
|
* Validates that the specified origin is a Boundary API. If so, the app is
|
|
* updated to use the origin. If it is not a Boundary API, or an origin
|
|
* wasn't specified, throws an error.
|
|
* @param {string} origin - protocol://host:port
|
|
*/
|
|
async setOrigin(origin) {
|
|
const originalHost = this.adapter.host;
|
|
assert(`setOrigin expects a string, you passed ${origin}`, typeof origin === 'string');
|
|
try {
|
|
this.adapter.host = origin;
|
|
await this.store.query('scope', {});
|
|
this.rendererOrigin = origin;
|
|
if (origin !== await this.mainOrigin) {
|
|
await this.ipc.invoke('setOrigin', origin);
|
|
}
|
|
} catch (e) {
|
|
this.adapter.host = originalHost;
|
|
this.rendererOrigin = null;
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
}
|