@teambit/bundler
Version:
145 lines (143 loc) • 4.27 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ComponentServer = void 0;
function _exceptions() {
const data = require("./exceptions");
_exceptions = function () {
return data;
};
return data;
}
function _events() {
const data = require("./events");
_events = function () {
return data;
};
return data;
}
function _bundler() {
const data = require("./bundler.aspect");
_bundler = function () {
return data;
};
return data;
}
function _selectPort() {
const data = require("./select-port");
_selectPort = function () {
return data;
};
return data;
}
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
class ComponentServer {
constructor(
/**
* browser runtime slot
*/
pubsub,
/**
* components contained in the existing component server.
*/
context,
/**
* port range of the component server.
*/
portRange,
/**
* env dev server.
*/
devServer) {
this.pubsub = pubsub;
this.context = context;
this.portRange = portRange;
this.devServer = devServer;
// why is this here
_defineProperty(this, "errors", void 0);
_defineProperty(this, "hostname", void 0);
_defineProperty(this, "_server", void 0);
_defineProperty(this, "_isRestarting", false);
_defineProperty(this, "_port", void 0);
_defineProperty(this, "createComponentsServerStartedEvent", (componentsServer, context, hostname, port) => {
return new (_events().ComponentsServerStartedEvent)(Date.now(), componentsServer, context, hostname, port);
});
}
get server() {
return this._server;
}
get envId() {
return this.context.envRuntime.id;
}
/**
* determine whether component server contains a component.
*/
hasComponent(component) {
return this.context.components.find(contextComponent => contextComponent.equals(component));
}
get port() {
return this._port;
}
async listen(specificPort) {
const port = specificPort || (await (0, _selectPort().selectPort)(this.portRange));
this._port = port;
this._server = await this.devServer.listen(port);
const address = this._server.address();
const hostname = this.getHostname(address);
if (!address) throw new (_exceptions().BindError)();
this.hostname = hostname;
this.pubsub.pub(_bundler().BundlerAspect.id, this.createComponentsServerStartedEvent(this, this.context, hostname, port));
}
async close() {
if (!this.server) return;
return new Promise((resolve, reject) => {
this.server?.close(err => {
if (err) {
reject(err);
} else {
this._server = undefined;
this.hostname = undefined;
resolve();
}
});
});
}
async restart(useNewPort = false) {
if (this._isRestarting) {
// add a logger here once we start using this API
return;
}
this._isRestarting = true;
try {
await this.close();
await this.listen(useNewPort ? undefined : this._port);
} catch (error) {
if (!this.errors) this.errors = [];
this.errors.push(error);
} finally {
this._isRestarting = false;
}
}
getHostname(address) {
if (address === null) throw new (_exceptions().BindError)();
if (typeof address === 'string') return address;
let hostname = address.address;
if (hostname === '::') {
hostname = 'localhost';
}
return hostname;
}
onChange() {}
/**
* get the url of the component server.
*/
get url() {
// tailing `/` is required!
return `/preview/${this.context.envRuntime.id}/`;
}
}
exports.ComponentServer = ComponentServer;
//# sourceMappingURL=component-server.js.map