@trifrost/core
Version:
Blazingly fast, runtime-agnostic server framework for modern edge and node environments
78 lines (77 loc) • 3.24 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.NodeRuntime = void 0;
const Logger_1 = require("../../modules/Logger");
const Context_1 = require("./Context");
const Generic_1 = require("../../utils/Generic");
class NodeRuntime {
/* Node Http server instance */
#server = null;
/* Global logger instance when runtime has started */
#logger = null;
/* Incoming handler which is to be called by the runtime when an incoming request happens */
#onIncoming = null;
/**
* MARK: Runtime Implementation
*/
exports = null;
get name() {
return 'Node';
}
get version() {
return process.version || null;
}
async boot(opts) {
const { Readable } = await import('node:stream');
const { createServer } = await import('node:http');
const { statSync, createReadStream } = await import('node:fs');
const { pipeline } = await import('node:stream/promises');
return new Promise((resolve, reject) => {
/* Reject if server is already set */
if (this.#server !== null) {
return reject(new Error('NodeRuntime@boot: Server already listening'));
}
/* Set onIncoming handler */
this.#onIncoming = opts.onIncoming;
/* Set logger instance */
this.#logger = opts.logger;
/* Specific APIs used by the context */
const apis = { statSync, createReadStream, pipeline, Readable };
/**
* Context config
* Take Note: Given that we don't know whether or not node will run standalone or
* behind a proxy we default trustProxy to false here.
*/
const cfg = {
...opts.cfg,
env: { ...process.env, ...opts.cfg.env },
};
/* Determine trust proxy */
cfg.trustProxy = (0, Generic_1.determineTrustProxy)(cfg.env, false);
/* Create new server instance */
this.#server = createServer(async (req, res) => this.#onIncoming(new Context_1.NodeContext(cfg, opts.logger, apis, req, res)));
/* Listen on the provided port, resolve if succeeds, reject if fails */
this.#server.listen((0, Generic_1.determinePort)(cfg.env, opts.cfg.port), () => {
this.#logger.debug(`NodeRuntime@boot: Listening on port ${opts.cfg.port}`);
return resolve();
}).on('error', () => {
this.#server = null;
this.#onIncoming = null;
return reject(new Error(`NodeRuntime@boot: Failed to listen on port ${opts.cfg.port}`));
});
});
}
defaultExporter(env) {
return (0, Generic_1.isDevMode)(env) ? new Logger_1.ConsoleExporter() : new Logger_1.ConsoleExporter({ include: ['trace_id'] });
}
async shutdown() {
if (!this.#server)
return;
this.#logger.debug('NodeRuntime@shutdown');
await new Promise(resolve => this.#server.close(() => resolve()));
this.#server = null;
this.#onIncoming = null;
this.#logger = null;
}
}
exports.NodeRuntime = NodeRuntime;