@m-ld/gateway
Version:
m-ld gateway for services
94 lines • 9.05 kB
JavaScript
import { Gateway, SubdomainCache } from './server/index.js';
import LOG from 'loglevel';
import { setupGatewayHttp } from './http/index.js';
import gracefulShutdown from 'http-graceful-shutdown';
import { as, asLogLevel, AuthKey, DomainKeyStore, Env, resolveDomain, validate } from './lib/index.js';
import { logNotifier, SmtpNotifier } from './server/Notifier.js';
import { uuid } from '@m-ld/m-ld';
import { Liquid } from 'liquidjs';
import { fileURLToPath } from 'url';
/**
* Note environment variables required for Gateway node startup.
* @see ../doc/self-host.md
*/
(async function () {
const env = new Env('m-ld-gateway', {
// Default is a volume mount, see fly.toml
data: process.env.M_LD_GATEWAY_DATA_PATH || '/data'
});
// Parse command line, environment variables & configuration
const argv = (await env.yargs()).parseSync();
const config = validate(argv, as.object({
'@id': as.string().default(uuid),
// Set the m-ld domain from the gateway if not declared
'@domain': as.string().domain().default(config => resolveDomain(config.gateway)),
'@context': as.forbidden(),
gateway: as.string().required(),
genesis: as.boolean().default(false),
auth: as.object({
key: as.string().required()
}).required(),
key: as.object({
type: as.equal('rsa').default('rsa'),
public: as.string().base64().required(),
private: as.string().base64().required()
}).required(),
address: as.object({
port: as.number().default(3000),
host: as.string().optional()
}).default(3000),
subdomainCacheSize: as.number().optional(),
logLevel: asLogLevel.default('INFO')
}).unknown());
LOG.setLevel(config.logLevel ?? 'INFO');
// TODO: Tidy up with dependency injection
const setupType = 'ably' in config ? 'ably' : 'io';
let keyStore, cloneFactory;
if (setupType === 'ably') {
const { AblyCloneFactory, AblyKeyStore } = await import('./ably/index.js');
keyStore = new AblyKeyStore(config);
cloneFactory = new AblyCloneFactory();
}
else {
const { IoCloneFactory } = await import('./socket.io/index.js');
keyStore = new DomainKeyStore(AuthKey.fromString(config.auth.key).appId);
cloneFactory = new IoCloneFactory();
}
const subdomainCache = new SubdomainCache(config);
const gateway = new Gateway(env, config, cloneFactory, keyStore, subdomainCache);
const server = setupGatewayHttp({
gateway,
notifier: config.smtp != null ? new SmtpNotifier(config) : logNotifier,
liquid: new Liquid({
root: fileURLToPath(new URL('../_site/', import.meta.url)),
cache: true
})
});
if (setupType === 'io') {
const { IoService } = await import('./socket.io/index.js');
const io = new IoService(gateway, server.server);
io.on('error', LOG.error);
io.on('debug', (...args) => LOG.debug(JSON.stringify(args)));
}
server.listen(config.address, async () => {
// noinspection JSUnresolvedVariable
LOG.info('%s listening at %s', server.name, server.url);
await cloneFactory.initialise(server.url);
try {
await gateway.initialise();
LOG.info('Gateway initialised');
}
catch (e) {
LOG.error('Gateway failed to initialise', e);
server.close();
}
});
gracefulShutdown(server, {
async onShutdown() {
LOG.info('Gateway shutting down...');
await gateway.close();
LOG.info('Gateway shut down');
}
});
})();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3RhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBaUIsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0UsT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQzNCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sZ0JBQWdCLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUNMLEVBQUUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFnQixjQUFjLEVBQUUsR0FBRyxFQUFZLGFBQWEsRUFBRSxRQUFRLEVBQzlGLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUVwQzs7O0dBR0c7QUFFSCxDQUFDLEtBQUs7SUFDSixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxjQUFjLEVBQUU7UUFDbEMsMENBQTBDO1FBQzFDLElBQUksRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixJQUFJLE9BQU87S0FDcEQsQ0FBQyxDQUFDO0lBQ0wsNERBQTREO0lBQzFELE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM3QyxNQUFNLE1BQU0sR0FBa0IsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ3JELEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFD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