mirror of
https://github.com/logto-io/logto.git
synced 2025-01-27 21:39:16 -05:00
refactor(core): move app to tenant instance
This commit is contained in:
parent
954664bd28
commit
8d829b8f3d
5 changed files with 107 additions and 44 deletions
|
@ -58,6 +58,7 @@
|
||||||
"koa-proxies": "^0.12.1",
|
"koa-proxies": "^0.12.1",
|
||||||
"koa-router": "^12.0.0",
|
"koa-router": "^12.0.0",
|
||||||
"koa-send": "^5.0.1",
|
"koa-send": "^5.0.1",
|
||||||
|
"lru-cache": "^7.14.1",
|
||||||
"nanoid": "^4.0.0",
|
"nanoid": "^4.0.0",
|
||||||
"oidc-provider": "^7.13.0",
|
"oidc-provider": "^7.13.0",
|
||||||
"p-retry": "^5.1.2",
|
"p-retry": "^5.1.2",
|
||||||
|
|
|
@ -1,26 +1,12 @@
|
||||||
import fs from 'fs/promises';
|
import fs from 'fs/promises';
|
||||||
import https from 'https';
|
import http2 from 'http2';
|
||||||
|
|
||||||
import { deduplicate } from '@silverhand/essentials';
|
import { deduplicate } from '@silverhand/essentials';
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import type Koa from 'koa';
|
import type Koa from 'koa';
|
||||||
import compose from 'koa-compose';
|
|
||||||
import koaLogger from 'koa-logger';
|
|
||||||
import mount from 'koa-mount';
|
|
||||||
|
|
||||||
import envSet, { MountedApps } from '#src/env-set/index.js';
|
import envSet from '#src/env-set/index.js';
|
||||||
import koaCheckDemoApp from '#src/middleware/koa-check-demo-app.js';
|
import { tenantPool } from '#src/tenants/index.js';
|
||||||
import koaConnectorErrorHandler from '#src/middleware/koa-connector-error-handler.js';
|
|
||||||
import koaErrorHandler from '#src/middleware/koa-error-handler.js';
|
|
||||||
import koaI18next from '#src/middleware/koa-i18next.js';
|
|
||||||
import koaOIDCErrorHandler from '#src/middleware/koa-oidc-error-handler.js';
|
|
||||||
import koaRootProxy from '#src/middleware/koa-root-proxy.js';
|
|
||||||
import koaSlonikErrorHandler from '#src/middleware/koa-slonik-error-handler.js';
|
|
||||||
import koaSpaProxy from '#src/middleware/koa-spa-proxy.js';
|
|
||||||
import koaSpaSessionGuard from '#src/middleware/koa-spa-session-guard.js';
|
|
||||||
import koaWelcomeProxy from '#src/middleware/koa-welcome-proxy.js';
|
|
||||||
import initOidc from '#src/oidc/init.js';
|
|
||||||
import initRouter from '#src/routes/init.js';
|
|
||||||
|
|
||||||
const logListening = () => {
|
const logListening = () => {
|
||||||
const { localhostUrl, endpoint } = envSet.values;
|
const { localhostUrl, endpoint } = envSet.values;
|
||||||
|
@ -30,39 +16,21 @@ const logListening = () => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const defaultTenant = 'default';
|
||||||
|
|
||||||
export default async function initApp(app: Koa): Promise<void> {
|
export default async function initApp(app: Koa): Promise<void> {
|
||||||
app.use(koaLogger());
|
app.use(async (ctx, next) => {
|
||||||
app.use(koaErrorHandler());
|
// TODO: add multi-tenancy logic
|
||||||
app.use(koaOIDCErrorHandler());
|
const tenant = tenantPool.get(defaultTenant);
|
||||||
app.use(koaSlonikErrorHandler());
|
|
||||||
app.use(koaConnectorErrorHandler());
|
|
||||||
app.use(koaI18next());
|
|
||||||
|
|
||||||
const provider = initOidc(app);
|
return tenant.run(ctx, next);
|
||||||
initRouter(app, provider);
|
});
|
||||||
|
|
||||||
app.use(mount('/', koaRootProxy()));
|
|
||||||
|
|
||||||
app.use(mount('/' + MountedApps.Welcome, koaWelcomeProxy()));
|
|
||||||
|
|
||||||
app.use(
|
|
||||||
mount('/' + MountedApps.Console, koaSpaProxy(MountedApps.Console, 5002, MountedApps.Console))
|
|
||||||
);
|
|
||||||
|
|
||||||
app.use(
|
|
||||||
mount(
|
|
||||||
'/' + MountedApps.DemoApp,
|
|
||||||
compose([koaCheckDemoApp(), koaSpaProxy(MountedApps.DemoApp, 5003, MountedApps.DemoApp)])
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
app.use(compose([koaSpaSessionGuard(provider), koaSpaProxy()]));
|
|
||||||
|
|
||||||
const { isHttpsEnabled, httpsCert, httpsKey, port } = envSet.values;
|
const { isHttpsEnabled, httpsCert, httpsKey, port } = envSet.values;
|
||||||
|
|
||||||
if (isHttpsEnabled && httpsCert && httpsKey) {
|
if (isHttpsEnabled && httpsCert && httpsKey) {
|
||||||
https
|
http2
|
||||||
.createServer(
|
.createSecureServer(
|
||||||
{ cert: await fs.readFile(httpsCert), key: await fs.readFile(httpsKey) },
|
{ cert: await fs.readFile(httpsCert), key: await fs.readFile(httpsKey) },
|
||||||
app.callback()
|
app.callback()
|
||||||
)
|
)
|
||||||
|
@ -73,6 +41,7 @@ export default async function initApp(app: Koa): Promise<void> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Chrome doesn't allow insecure http/2 servers
|
||||||
app.listen(port, () => {
|
app.listen(port, () => {
|
||||||
logListening();
|
logListening();
|
||||||
});
|
});
|
||||||
|
|
64
packages/core/src/tenants/Tenant.ts
Normal file
64
packages/core/src/tenants/Tenant.ts
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
import type { MiddlewareType } from 'koa';
|
||||||
|
import Koa from 'koa';
|
||||||
|
import compose from 'koa-compose';
|
||||||
|
import koaLogger from 'koa-logger';
|
||||||
|
import mount from 'koa-mount';
|
||||||
|
import type { Provider } from 'oidc-provider';
|
||||||
|
|
||||||
|
import { MountedApps } from '#src/env-set/index.js';
|
||||||
|
import koaCheckDemoApp from '#src/middleware/koa-check-demo-app.js';
|
||||||
|
import koaConnectorErrorHandler from '#src/middleware/koa-connector-error-handler.js';
|
||||||
|
import koaErrorHandler from '#src/middleware/koa-error-handler.js';
|
||||||
|
import koaI18next from '#src/middleware/koa-i18next.js';
|
||||||
|
import koaOIDCErrorHandler from '#src/middleware/koa-oidc-error-handler.js';
|
||||||
|
import koaRootProxy from '#src/middleware/koa-root-proxy.js';
|
||||||
|
import koaSlonikErrorHandler from '#src/middleware/koa-slonik-error-handler.js';
|
||||||
|
import koaSpaProxy from '#src/middleware/koa-spa-proxy.js';
|
||||||
|
import koaSpaSessionGuard from '#src/middleware/koa-spa-session-guard.js';
|
||||||
|
import koaWelcomeProxy from '#src/middleware/koa-welcome-proxy.js';
|
||||||
|
import initOidc from '#src/oidc/init.js';
|
||||||
|
import initRouter from '#src/routes/init.js';
|
||||||
|
|
||||||
|
export default class Tenant {
|
||||||
|
public readonly provider: Provider;
|
||||||
|
|
||||||
|
protected readonly app: Koa;
|
||||||
|
|
||||||
|
get run(): MiddlewareType {
|
||||||
|
return mount(this.app);
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(public id: string) {
|
||||||
|
const app = new Koa();
|
||||||
|
const provider = initOidc(app);
|
||||||
|
|
||||||
|
app.use(koaLogger());
|
||||||
|
app.use(koaErrorHandler());
|
||||||
|
app.use(koaOIDCErrorHandler());
|
||||||
|
app.use(koaSlonikErrorHandler());
|
||||||
|
app.use(koaConnectorErrorHandler());
|
||||||
|
app.use(koaI18next());
|
||||||
|
|
||||||
|
initRouter(app, provider);
|
||||||
|
|
||||||
|
app.use(mount('/', koaRootProxy()));
|
||||||
|
|
||||||
|
app.use(mount('/' + MountedApps.Welcome, koaWelcomeProxy()));
|
||||||
|
|
||||||
|
app.use(
|
||||||
|
mount('/' + MountedApps.Console, koaSpaProxy(MountedApps.Console, 5002, MountedApps.Console))
|
||||||
|
);
|
||||||
|
|
||||||
|
app.use(
|
||||||
|
mount(
|
||||||
|
'/' + MountedApps.DemoApp,
|
||||||
|
compose([koaCheckDemoApp(), koaSpaProxy(MountedApps.DemoApp, 5003, MountedApps.DemoApp)])
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
app.use(compose([koaSpaSessionGuard(provider), koaSpaProxy()]));
|
||||||
|
|
||||||
|
this.app = app;
|
||||||
|
this.provider = provider;
|
||||||
|
}
|
||||||
|
}
|
22
packages/core/src/tenants/index.ts
Normal file
22
packages/core/src/tenants/index.ts
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import LRUCache from 'lru-cache';
|
||||||
|
|
||||||
|
import Tenant from './Tenant.js';
|
||||||
|
|
||||||
|
class TenantPool {
|
||||||
|
protected cache = new LRUCache<string, Tenant>({ max: 500 });
|
||||||
|
|
||||||
|
get(tenantId: string): Tenant {
|
||||||
|
const tenant = this.cache.get(tenantId);
|
||||||
|
|
||||||
|
if (tenant) {
|
||||||
|
return tenant;
|
||||||
|
}
|
||||||
|
|
||||||
|
const newTenant = new Tenant(tenantId);
|
||||||
|
this.cache.set(tenantId, newTenant);
|
||||||
|
|
||||||
|
return newTenant;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const tenantPool = new TenantPool();
|
7
pnpm-lock.yaml
generated
7
pnpm-lock.yaml
generated
|
@ -303,6 +303,7 @@ importers:
|
||||||
koa-router: ^12.0.0
|
koa-router: ^12.0.0
|
||||||
koa-send: ^5.0.1
|
koa-send: ^5.0.1
|
||||||
lint-staged: ^13.0.0
|
lint-staged: ^13.0.0
|
||||||
|
lru-cache: ^7.14.1
|
||||||
nanoid: ^4.0.0
|
nanoid: ^4.0.0
|
||||||
node-mocks-http: ^1.12.1
|
node-mocks-http: ^1.12.1
|
||||||
nodemon: ^2.0.19
|
nodemon: ^2.0.19
|
||||||
|
@ -355,6 +356,7 @@ importers:
|
||||||
koa-proxies: 0.12.1_koa@2.13.4
|
koa-proxies: 0.12.1_koa@2.13.4
|
||||||
koa-router: 12.0.0
|
koa-router: 12.0.0
|
||||||
koa-send: 5.0.1
|
koa-send: 5.0.1
|
||||||
|
lru-cache: 7.14.1
|
||||||
nanoid: 4.0.0
|
nanoid: 4.0.0
|
||||||
oidc-provider: 7.13.0
|
oidc-provider: 7.13.0
|
||||||
p-retry: 5.1.2
|
p-retry: 5.1.2
|
||||||
|
@ -10245,6 +10247,11 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
yallist: 4.0.0
|
yallist: 4.0.0
|
||||||
|
|
||||||
|
/lru-cache/7.14.1:
|
||||||
|
resolution: {integrity: sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/lz-string/1.4.4:
|
/lz-string/1.4.4:
|
||||||
resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==}
|
resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
Loading…
Add table
Reference in a new issue