ifrau
Version:
Free-range app utility for IFRAME-based FRAs
67 lines (50 loc) • 1.65 kB
JavaScript
import { PortWithRequests } from './requests.js';
const typeNameValidator = /^[a-zA-Z]+[a-zA-Z-]*$/;
export class PortWithServices extends PortWithRequests {
async getService(serviceType, version) {
if (!this._isConnected) {
throw new Error('Cannot getService() before connect() has completed');
}
const serviceVersionPrefix = `service:${serviceType}:${version}`;
const me = this;
function createProxy(methodNames) {
function createProxyMethod(name) {
return function() {
const args = new Array(arguments.length + 1);
args[0] = `${serviceVersionPrefix}:${name}`;
for (let i = 0; i < arguments.length; ++i) {
args[i + 1] = arguments[i];
}
// eslint-disable-next-line prefer-spread
return me.request.apply(me, args);
};
}
const proxy = {};
methodNames.forEach((name) => {
proxy[name] = createProxyMethod(name);
});
return proxy;
}
const methodNames_1 = await this.request(serviceVersionPrefix);
return createProxy(methodNames_1);
}
registerService(serviceType, version, service) {
if (this._isConnected) {
throw new Error('Register services before connecting');
}
if (!typeNameValidator.test(serviceType)) {
throw new Error(`Invalid service type ${serviceType}`);
}
const serviceVersionPrefix = `service:${serviceType}:${version}`;
const methodNames = Object
.keys(service)
.filter(k => {
return typeof service[k] === 'function';
});
this.onRequest(serviceVersionPrefix, methodNames);
methodNames.forEach(name => {
this.onRequest(`${serviceVersionPrefix}:${name}`, service[name]);
});
return this;
}
}