@contember/engine-server 1.2.0 → 1.3.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/start.js +16 -15
- package/dist/src/start.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/tests/e2e/assume-identity.test.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -22
- package/src/start.ts +10 -8
- package/src/tsconfig.json +4 -45
- package/tests/e2e/assume-identity.test.ts +0 -1
- package/tests/tsconfig.json +2 -6
- package/tsconfig.json +2 -6
- package/dist/src/MasterContainer.d.ts +0 -125
- package/dist/src/MasterContainer.d.ts.map +0 -1
- package/dist/src/MasterContainer.js +0 -102
- package/dist/src/MasterContainer.js.map +0 -1
- package/dist/src/bootstrap/Initializer.d.ts +0 -7
- package/dist/src/bootstrap/Initializer.d.ts.map +0 -1
- package/dist/src/bootstrap/Initializer.js +0 -27
- package/dist/src/bootstrap/Initializer.js.map +0 -1
- package/dist/src/bootstrap/index.d.ts +0 -2
- package/dist/src/bootstrap/index.d.ts.map +0 -1
- package/dist/src/bootstrap/index.js +0 -18
- package/dist/src/bootstrap/index.js.map +0 -1
- package/dist/src/config/config.d.ts +0 -17
- package/dist/src/config/config.d.ts.map +0 -1
- package/dist/src/config/config.js +0 -30
- package/dist/src/config/config.js.map +0 -1
- package/dist/src/config/configSchema.d.ts +0 -201
- package/dist/src/config/configSchema.d.ts.map +0 -1
- package/dist/src/config/configSchema.js +0 -119
- package/dist/src/config/configSchema.js.map +0 -1
- package/dist/src/config/configTemplate.d.ts +0 -2
- package/dist/src/config/configTemplate.d.ts.map +0 -1
- package/dist/src/config/configTemplate.js +0 -90
- package/dist/src/config/configTemplate.js.map +0 -1
- package/dist/src/config/projectConfigResolver.d.ts +0 -8
- package/dist/src/config/projectConfigResolver.d.ts.map +0 -1
- package/dist/src/config/projectConfigResolver.js +0 -91
- package/dist/src/config/projectConfigResolver.js.map +0 -1
- package/dist/src/config/tenantConfigResolver.d.ts +0 -8
- package/dist/src/config/tenantConfigResolver.d.ts.map +0 -1
- package/dist/src/config/tenantConfigResolver.js +0 -31
- package/dist/src/config/tenantConfigResolver.js.map +0 -1
- package/dist/src/index.d.ts +0 -13
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -33
- package/dist/src/index.js.map +0 -1
- package/dist/src/project/ProjectContainer.d.ts +0 -58
- package/dist/src/project/ProjectContainer.d.ts.map +0 -1
- package/dist/src/project/ProjectContainer.js +0 -66
- package/dist/src/project/ProjectContainer.js.map +0 -1
- package/dist/src/project/ProjectContainerResolver.d.ts +0 -24
- package/dist/src/project/ProjectContainerResolver.d.ts.map +0 -1
- package/dist/src/project/ProjectContainerResolver.js +0 -75
- package/dist/src/project/ProjectContainerResolver.js.map +0 -1
- package/dist/src/project/ProjectContainerStore.d.ts +0 -18
- package/dist/src/project/ProjectContainerStore.d.ts.map +0 -1
- package/dist/src/project/ProjectContainerStore.js +0 -30
- package/dist/src/project/ProjectContainerStore.js.map +0 -1
- package/dist/src/project/ProjectInitializer.d.ts +0 -14
- package/dist/src/project/ProjectInitializer.d.ts.map +0 -1
- package/dist/src/project/ProjectInitializer.js +0 -28
- package/dist/src/project/ProjectInitializer.js.map +0 -1
- package/dist/src/project/ProjectSchemaResolver.d.ts +0 -14
- package/dist/src/project/ProjectSchemaResolver.d.ts.map +0 -1
- package/dist/src/project/ProjectSchemaResolver.js +0 -30
- package/dist/src/project/ProjectSchemaResolver.js.map +0 -1
- package/dist/src/project/index.d.ts +0 -5
- package/dist/src/project/index.d.ts.map +0 -1
- package/dist/src/project/index.js +0 -21
- package/dist/src/project/index.js.map +0 -1
- package/dist/src/projectGroup/ProjectGroupContainer.d.ts +0 -26
- package/dist/src/projectGroup/ProjectGroupContainer.d.ts.map +0 -1
- package/dist/src/projectGroup/ProjectGroupContainer.js +0 -70
- package/dist/src/projectGroup/ProjectGroupContainer.js.map +0 -1
- package/dist/src/projectGroup/ProjectGroupResolver.d.ts +0 -7
- package/dist/src/projectGroup/ProjectGroupResolver.d.ts.map +0 -1
- package/dist/src/projectGroup/ProjectGroupResolver.js +0 -13
- package/dist/src/projectGroup/ProjectGroupResolver.js.map +0 -1
- package/dist/src/utils/index.d.ts +0 -3
- package/dist/src/utils/index.d.ts.map +0 -1
- package/dist/src/utils/index.js +0 -19
- package/dist/src/utils/index.js.map +0 -1
- package/dist/src/utils/sentry.d.ts +0 -10
- package/dist/src/utils/sentry.d.ts.map +0 -1
- package/dist/src/utils/sentry.js +0 -80
- package/dist/src/utils/sentry.js.map +0 -1
- package/dist/src/utils/serverStartup.d.ts +0 -33
- package/dist/src/utils/serverStartup.d.ts.map +0 -1
- package/dist/src/utils/serverStartup.js +0 -79
- package/dist/src/utils/serverStartup.js.map +0 -1
- package/dist/src/utils/serverTermination.d.ts +0 -13
- package/dist/src/utils/serverTermination.d.ts.map +0 -1
- package/dist/src/utils/serverTermination.js +0 -24
- package/dist/src/utils/serverTermination.js.map +0 -1
- package/dist/src/utils/strings.d.ts +0 -2
- package/dist/src/utils/strings.d.ts.map +0 -1
- package/dist/src/utils/strings.js +0 -6
- package/dist/src/utils/strings.js.map +0 -1
- package/dist/tests/cases/configResolver.test.d.ts +0 -2
- package/dist/tests/cases/configResolver.test.d.ts.map +0 -1
- package/dist/tests/cases/configResolver.test.js +0 -67
- package/dist/tests/cases/configResolver.test.js.map +0 -1
- package/src/MasterContainer.ts +0 -206
- package/src/bootstrap/Initializer.ts +0 -27
- package/src/bootstrap/index.ts +0 -1
- package/src/config/config.ts +0 -56
- package/src/config/configSchema.ts +0 -135
- package/src/config/configTemplate.ts +0 -86
- package/src/config/projectConfigResolver.ts +0 -86
- package/src/config/tenantConfigResolver.ts +0 -41
- package/src/index.ts +0 -23
- package/src/project/ProjectContainer.ts +0 -95
- package/src/project/ProjectContainerResolver.ts +0 -87
- package/src/project/ProjectContainerStore.ts +0 -33
- package/src/project/ProjectInitializer.ts +0 -28
- package/src/project/ProjectSchemaResolver.ts +0 -33
- package/src/project/index.ts +0 -4
- package/src/projectGroup/ProjectGroupContainer.ts +0 -134
- package/src/projectGroup/ProjectGroupResolver.ts +0 -12
- package/src/utils/index.ts +0 -2
- package/src/utils/sentry.ts +0 -56
- package/src/utils/serverStartup.ts +0 -78
- package/src/utils/serverTermination.ts +0 -19
- package/src/utils/strings.ts +0 -1
- package/tests/cases/configResolver.test.ts +0 -67
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { ProjectSchemaResolver as ProjectSchemaResolverInterface } from '@contember/engine-tenant-api'
|
|
2
|
-
import { ProjectContainerResolver } from '@contember/engine-http'
|
|
3
|
-
import { Schema } from '@contember/schema'
|
|
4
|
-
|
|
5
|
-
export class ProjectSchemaResolver implements ProjectSchemaResolverInterface {
|
|
6
|
-
constructor(
|
|
7
|
-
private readonly projectContainerResolver: ProjectContainerResolver,
|
|
8
|
-
) {}
|
|
9
|
-
|
|
10
|
-
async getSchema(slug: string) {
|
|
11
|
-
const container = await this.projectContainerResolver.getProjectContainer(slug)
|
|
12
|
-
if (!container) {
|
|
13
|
-
return undefined
|
|
14
|
-
}
|
|
15
|
-
const db = container.systemDatabaseContextFactory.create()
|
|
16
|
-
return container.contentSchemaResolver.getSchema(db)
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export class ProjectSchemaResolverProxy implements ProjectSchemaResolverInterface {
|
|
21
|
-
private resolver: ProjectSchemaResolver | undefined
|
|
22
|
-
|
|
23
|
-
setResolver(resolver: ProjectSchemaResolver): void {
|
|
24
|
-
this.resolver = resolver
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
getSchema(projectSlug: string): Promise<Schema | undefined> {
|
|
28
|
-
if (!this.resolver) {
|
|
29
|
-
throw new Error('Resolved is not set')
|
|
30
|
-
}
|
|
31
|
-
return this.resolver.getSchema(projectSlug)
|
|
32
|
-
}
|
|
33
|
-
}
|
package/src/project/index.ts
DELETED
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { Builder } from '@contember/dic'
|
|
2
|
-
import { Connection } from '@contember/database'
|
|
3
|
-
import { TenantContainerFactory } from '@contember/engine-tenant-api'
|
|
4
|
-
import { TenantConfig } from '../config/config'
|
|
5
|
-
import {
|
|
6
|
-
Authenticator,
|
|
7
|
-
CryptoWrapper,
|
|
8
|
-
ProjectGroupContainer,
|
|
9
|
-
ProjectMembershipFetcher,
|
|
10
|
-
ProjectMembershipResolver,
|
|
11
|
-
Providers,
|
|
12
|
-
SystemGraphQLHandlerFactory,
|
|
13
|
-
TenantGraphQLHandlerFactory,
|
|
14
|
-
} from '@contember/engine-http'
|
|
15
|
-
import {
|
|
16
|
-
ProjectContainerFactoryFactory,
|
|
17
|
-
ProjectContainerResolver,
|
|
18
|
-
ProjectInitializer,
|
|
19
|
-
ProjectInitializerProxy,
|
|
20
|
-
ProjectSchemaResolver,
|
|
21
|
-
ProjectSchemaResolverProxy,
|
|
22
|
-
} from '../project'
|
|
23
|
-
import { SystemContainerFactory } from '@contember/engine-system-api'
|
|
24
|
-
import { ProjectConfigResolver } from '../config/projectConfigResolver'
|
|
25
|
-
import { createSecretKey } from 'node:crypto'
|
|
26
|
-
import { Logger } from '@contember/logger'
|
|
27
|
-
|
|
28
|
-
interface ProjectGroupContainerFactoryArgs
|
|
29
|
-
{
|
|
30
|
-
config: TenantConfig
|
|
31
|
-
slug: string | undefined
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export class ProjectGroupContainerFactory {
|
|
35
|
-
constructor(
|
|
36
|
-
private readonly debug: boolean,
|
|
37
|
-
private readonly providers: Providers,
|
|
38
|
-
private readonly systemContainerFactory: SystemContainerFactory,
|
|
39
|
-
private readonly tenantContainerFactory: TenantContainerFactory,
|
|
40
|
-
private readonly projectContainerFactoryFactory: ProjectContainerFactoryFactory,
|
|
41
|
-
private readonly projectConfigResolver: ProjectConfigResolver,
|
|
42
|
-
private readonly tenantGraphQLHandlerFactory: TenantGraphQLHandlerFactory,
|
|
43
|
-
private readonly systemGraphQLHandlerFactory: SystemGraphQLHandlerFactory,
|
|
44
|
-
private readonly logger: Logger,
|
|
45
|
-
) {}
|
|
46
|
-
|
|
47
|
-
public create({ config, slug }: ProjectGroupContainerFactoryArgs): ProjectGroupContainer {
|
|
48
|
-
return new Builder({})
|
|
49
|
-
.addService('slug', () =>
|
|
50
|
-
slug)
|
|
51
|
-
.addService('logger', ({ slug }) =>
|
|
52
|
-
this.logger.child({ projectGroup: slug }))
|
|
53
|
-
.addService('providers', () =>
|
|
54
|
-
this.providers)
|
|
55
|
-
.addService('tenantDbCredentials', () =>
|
|
56
|
-
config.db)
|
|
57
|
-
.addService('tenantConnection', ({ tenantDbCredentials, logger }): Connection.ConnectionType =>
|
|
58
|
-
Connection.create(tenantDbCredentials, err => logger.error(err)))
|
|
59
|
-
.addService('projectSchemaResolver', () =>
|
|
60
|
-
new ProjectSchemaResolverProxy())
|
|
61
|
-
.addService('projectInitializer', () =>
|
|
62
|
-
new ProjectInitializerProxy())
|
|
63
|
-
.addService('tenantContainer', ({ tenantConnection, tenantDbCredentials, projectSchemaResolver, projectInitializer }) => {
|
|
64
|
-
const encryptionKey = config.secrets.encryptionKey
|
|
65
|
-
? createSecretKey(Buffer.from(config.secrets.encryptionKey, 'hex'))
|
|
66
|
-
: undefined
|
|
67
|
-
|
|
68
|
-
const cryptoWrapper = new CryptoWrapper(encryptionKey)
|
|
69
|
-
return this.tenantContainerFactory.create({
|
|
70
|
-
connection: tenantConnection,
|
|
71
|
-
dbCredentials: tenantDbCredentials,
|
|
72
|
-
mailOptions: config.mailer,
|
|
73
|
-
tenantCredentials: config.credentials,
|
|
74
|
-
projectInitializer,
|
|
75
|
-
projectSchemaResolver,
|
|
76
|
-
cryptoProviders: {
|
|
77
|
-
decrypt: cryptoWrapper.decrypt.bind(cryptoWrapper),
|
|
78
|
-
encrypt: cryptoWrapper.encrypt.bind(cryptoWrapper),
|
|
79
|
-
},
|
|
80
|
-
})
|
|
81
|
-
})
|
|
82
|
-
.addService('tenantDatabase', ({ tenantContainer }) =>
|
|
83
|
-
tenantContainer.databaseContext)
|
|
84
|
-
.addService('identityFetcher', ({ tenantContainer: { identityFetcher } }) =>
|
|
85
|
-
identityFetcher)
|
|
86
|
-
.addService('systemContainer', ({ identityFetcher }) =>
|
|
87
|
-
this.systemContainerFactory.create({ identityFetcher }))
|
|
88
|
-
.addService('schemaVersionBuilder', ({ systemContainer }) =>
|
|
89
|
-
systemContainer.schemaVersionBuilder)
|
|
90
|
-
.addService('projectContainerFactory', ({ schemaVersionBuilder, logger }) =>
|
|
91
|
-
this.projectContainerFactoryFactory.create(schemaVersionBuilder, logger))
|
|
92
|
-
.addService('tenantProjectManager', ({ tenantContainer }) =>
|
|
93
|
-
tenantContainer.projectManager)
|
|
94
|
-
.addService('projectContainerResolver', ({ projectContainerFactory, tenantProjectManager, systemContainer, tenantContainer }) =>
|
|
95
|
-
new ProjectContainerResolver(
|
|
96
|
-
projectContainerFactory,
|
|
97
|
-
this.projectConfigResolver,
|
|
98
|
-
tenantProjectManager,
|
|
99
|
-
systemContainer.projectInitializer,
|
|
100
|
-
tenantContainer.databaseContext,
|
|
101
|
-
config,
|
|
102
|
-
))
|
|
103
|
-
|
|
104
|
-
.setupService('projectSchemaResolver', (it, { projectContainerResolver }) => {
|
|
105
|
-
it.setResolver(new ProjectSchemaResolver(projectContainerResolver))
|
|
106
|
-
})
|
|
107
|
-
.setupService('projectInitializer', (it, { projectContainerResolver }) => {
|
|
108
|
-
it.setInitializer(new ProjectInitializer(projectContainerResolver))
|
|
109
|
-
})
|
|
110
|
-
.addService('tenantGraphQLHandler', ({ tenantContainer }) =>
|
|
111
|
-
this.tenantGraphQLHandlerFactory.create(tenantContainer.resolvers))
|
|
112
|
-
.addService('systemGraphQLHandler', ({ systemContainer }) =>
|
|
113
|
-
this.systemGraphQLHandlerFactory.create(systemContainer.systemResolversFactory))
|
|
114
|
-
.addService('authenticator', ({ tenantDatabase, tenantContainer }) =>
|
|
115
|
-
new Authenticator(tenantDatabase, tenantContainer.apiKeyManager))
|
|
116
|
-
.addService('projectMembershipResolver', ({ tenantContainer }) =>
|
|
117
|
-
new ProjectMembershipResolver(this.debug, new ProjectMembershipFetcher(tenantContainer.projectMemberManager, tenantContainer.databaseContext)))
|
|
118
|
-
.build()
|
|
119
|
-
.pick(
|
|
120
|
-
'projectContainerResolver',
|
|
121
|
-
'projectSchemaResolver',
|
|
122
|
-
'projectInitializer',
|
|
123
|
-
'systemContainer',
|
|
124
|
-
'systemGraphQLHandler',
|
|
125
|
-
'tenantContainer',
|
|
126
|
-
'tenantDatabase',
|
|
127
|
-
'authenticator',
|
|
128
|
-
'projectMembershipResolver',
|
|
129
|
-
'tenantGraphQLHandler',
|
|
130
|
-
'slug',
|
|
131
|
-
'logger',
|
|
132
|
-
)
|
|
133
|
-
}
|
|
134
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { ProjectGroupContainer, ProjectGroupResolver as ProjectGroupResolverInterface } from '@contember/engine-http'
|
|
2
|
-
|
|
3
|
-
export class ProjectGroupResolver implements ProjectGroupResolverInterface {
|
|
4
|
-
constructor(
|
|
5
|
-
private readonly projectGroupContainer: ProjectGroupContainer,
|
|
6
|
-
) {
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
resolveContainer(): Promise<ProjectGroupContainer> {
|
|
10
|
-
return Promise.resolve(this.projectGroupContainer)
|
|
11
|
-
}
|
|
12
|
-
}
|
package/src/utils/index.ts
DELETED
package/src/utils/sentry.ts
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import * as Sentry from '@sentry/node'
|
|
2
|
-
import { LoggerRequestSymbol } from '@contember/engine-http'
|
|
3
|
-
import { LogEntry, LoggerHandler, LogLevel, LogLevels } from '@contember/logger'
|
|
4
|
-
|
|
5
|
-
export class SentryLoggerHandler implements LoggerHandler {
|
|
6
|
-
constructor(
|
|
7
|
-
private readonly logLevel: LogLevel,
|
|
8
|
-
) {
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
getMinLevel(): number {
|
|
12
|
-
return this.logLevel.value
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
handle(entry: LogEntry) {
|
|
16
|
-
if (!entry.error || entry.level.value < this.logLevel.value) {
|
|
17
|
-
return
|
|
18
|
-
}
|
|
19
|
-
Sentry.captureException(entry.error, scope => {
|
|
20
|
-
scope.setTag('project', entry.loggerAttributes.project ?? entry.ownAttributes.project)
|
|
21
|
-
scope.setTag('module', entry.loggerAttributes.module ?? entry.ownAttributes.module)
|
|
22
|
-
scope.setLevel('error')
|
|
23
|
-
scope.setUser({
|
|
24
|
-
id: entry.loggerAttributes.user ?? entry.ownAttributes.user,
|
|
25
|
-
})
|
|
26
|
-
scope.setExtra('requestId', entry.loggerAttributes.requestId)
|
|
27
|
-
|
|
28
|
-
scope.addEventProcessor(event => {
|
|
29
|
-
return {
|
|
30
|
-
...event,
|
|
31
|
-
request: {
|
|
32
|
-
url: entry.loggerAttributes.url ?? entry.ownAttributes.url,
|
|
33
|
-
data: entry.loggerAttributes[LoggerRequestSymbol]?.body,
|
|
34
|
-
},
|
|
35
|
-
}
|
|
36
|
-
})
|
|
37
|
-
return scope
|
|
38
|
-
})
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
close(): void {
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export const createSentryLoggerHandler = (dsn?: string): null | LoggerHandler => {
|
|
46
|
-
if (!dsn) {
|
|
47
|
-
return null
|
|
48
|
-
}
|
|
49
|
-
Sentry.init({
|
|
50
|
-
dsn: dsn,
|
|
51
|
-
integrations: integrations => {
|
|
52
|
-
return integrations.filter(integration => integration.name !== 'Console' && integration.name !== 'Http')
|
|
53
|
-
},
|
|
54
|
-
})
|
|
55
|
-
return new SentryLoggerHandler(LogLevels.warn)
|
|
56
|
-
}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { join } from 'node:path'
|
|
2
|
-
import { ConfigProcessor, Plugin } from '@contember/engine-plugins'
|
|
3
|
-
import { ConfigSource, readConfig, ServerConfig } from '../config/config'
|
|
4
|
-
import { Type } from '@contember/typesafe'
|
|
5
|
-
import { createLogger, JsonStreamLoggerHandler, Logger, LogLevels, PrettyPrintLoggerHandler } from '@contember/logger'
|
|
6
|
-
|
|
7
|
-
export const getServerVersion = (): string => {
|
|
8
|
-
const packageJsonFile = process.env.CONTEMBER_PACKAGE_JSON || join(__dirname, '../../../package.json')
|
|
9
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
10
|
-
const version = require(packageJsonFile).version
|
|
11
|
-
return version
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export const isDebugMode = (): boolean => process.env.NODE_ENV === 'development'
|
|
15
|
-
|
|
16
|
-
export const printStartInfo = ({ version, isDebug }: { version: string; isDebug: boolean }, logger: Logger) => {
|
|
17
|
-
logger.info(`Starting Contember ${version}`)
|
|
18
|
-
logger.info(`NODE_ENV is set to ${process.env.NODE_ENV}`)
|
|
19
|
-
if (isDebug) {
|
|
20
|
-
logger.warn('Starting Contember in debug mode')
|
|
21
|
-
logger.warn('NEVER USE debug mode in production environment')
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export const resolveServerConfig = async <T extends ServerConfig>({ plugins, serverConfigSchema }: { plugins: Plugin[]; serverConfigSchema: Type<T> }) => {
|
|
26
|
-
const configProcessors = plugins
|
|
27
|
-
.map(it => (it.getConfigProcessor ? it.getConfigProcessor() : null))
|
|
28
|
-
.filter((it): it is ConfigProcessor => it !== null)
|
|
29
|
-
|
|
30
|
-
const configSources: ConfigSource[] = []
|
|
31
|
-
for (const configType of ['file', 'yaml', 'json'] as const) {
|
|
32
|
-
const envValue = process.env['CONTEMBER_CONFIG_' + configType.toUpperCase()]
|
|
33
|
-
if (envValue) {
|
|
34
|
-
configSources.push({ type: configType, data: envValue })
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return await readConfig(configSources, configProcessors, serverConfigSchema)
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export const createDefaultLogger = (): Logger => {
|
|
42
|
-
const isDebug = isDebugMode()
|
|
43
|
-
const loggerType = process.env.CONTEMBER_LOGGER_FORMAT ?? (isDebug ? 'pretty' : 'json')
|
|
44
|
-
const stream = process.stderr
|
|
45
|
-
const handler = loggerType === 'pretty'
|
|
46
|
-
? new PrettyPrintLoggerHandler(stream, {
|
|
47
|
-
formatters: {
|
|
48
|
-
pid: () => undefined,
|
|
49
|
-
loggerId: () => undefined,
|
|
50
|
-
uri: ({ attributes, chalk }) => {
|
|
51
|
-
const color = attributes.status === undefined
|
|
52
|
-
? chalk.cyan
|
|
53
|
-
: attributes.status < 300
|
|
54
|
-
? chalk.green
|
|
55
|
-
: chalk.yellowBright
|
|
56
|
-
const timeInfo = attributes.totalTimeMs !== undefined ? ` ${attributes.totalTimeMs}ms` : ''
|
|
57
|
-
const statusInfo = attributes.status !== undefined ? ` [${attributes.status}]` : ''
|
|
58
|
-
return { line: color(`${attributes.method}${statusInfo} ${attributes.uri}${timeInfo} ${chalk.white.dim('#' + attributes.requestId)}`) }
|
|
59
|
-
},
|
|
60
|
-
method: () => undefined,
|
|
61
|
-
requestId: () => undefined,
|
|
62
|
-
timeLabel: () => undefined,
|
|
63
|
-
status: () => undefined,
|
|
64
|
-
totalTimeMs: () => undefined,
|
|
65
|
-
events: ({ formattedValue }) => formattedValue === '[]' ? undefined : formattedValue,
|
|
66
|
-
},
|
|
67
|
-
})
|
|
68
|
-
: new JsonStreamLoggerHandler(stream)
|
|
69
|
-
const logLevel = (process.env.CONTEMBER_LOGGER_LEVEL as keyof typeof LogLevels) ?? 'info'
|
|
70
|
-
return createLogger(handler, {
|
|
71
|
-
pid: process.pid,
|
|
72
|
-
loggerId: Math.random().toString().substring(2),
|
|
73
|
-
}, {
|
|
74
|
-
fingerCrossedOptions: {
|
|
75
|
-
logAlwaysLevel: LogLevels[logLevel],
|
|
76
|
-
},
|
|
77
|
-
})
|
|
78
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import cluster from 'node:cluster'
|
|
2
|
-
import { Logger } from '@contember/logger'
|
|
3
|
-
|
|
4
|
-
const signals = {
|
|
5
|
-
SIGHUP: 1,
|
|
6
|
-
SIGINT: 2,
|
|
7
|
-
SIGTERM: 15,
|
|
8
|
-
}
|
|
9
|
-
export type TerminationJob = (args: { signal: keyof typeof signals; code: number }) => Promise<void>
|
|
10
|
-
export const listenOnProcessTermination = (jobs: TerminationJob[], logger: Logger) => {
|
|
11
|
-
for (const [signal, code] of Object.entries(signals)) {
|
|
12
|
-
process.on(signal, async () => {
|
|
13
|
-
logger.info(`Process ${process.pid} received a ${signal} signal, executing ${jobs.length} termination jobs`)
|
|
14
|
-
await Promise.allSettled(jobs.map(it => it({ signal: signal as keyof typeof signals, code })))
|
|
15
|
-
logger.info(cluster.isMaster ? `All terminated, exiting` : 'All terminated, exiting a worker')
|
|
16
|
-
process.exit(128 + code)
|
|
17
|
-
})
|
|
18
|
-
}
|
|
19
|
-
}
|
package/src/utils/strings.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const upperCaseFirst = (string: string) => `${string.charAt(0).toUpperCase()}${string.substring(1)}`
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { assert, it } from 'vitest'
|
|
2
|
-
import { createTenantConfigResolver } from '../../src/config/tenantConfigResolver'
|
|
3
|
-
import { configTemplate } from '../../src/config/configTemplate'
|
|
4
|
-
import { createProjectConfigResolver } from '../../src/config/projectConfigResolver'
|
|
5
|
-
|
|
6
|
-
const env = {
|
|
7
|
-
DEFAULT_DB_POOL_IDLE_TIMEOUT_MS: '60000',
|
|
8
|
-
DEFAULT_DB_POOL_MAX_CONNECTIONS: '1000',
|
|
9
|
-
DEFAULT_DB_POOL_MAX_CONNECTING: '10',
|
|
10
|
-
DEFAULT_DB_CONNECTION_TIMEOUT_MS: '5000',
|
|
11
|
-
}
|
|
12
|
-
const tenantConfig = {
|
|
13
|
-
db: {
|
|
14
|
-
host: 'c0.cluster-abc.eu-west-1.rds.amazonaws.com',
|
|
15
|
-
port: 5432,
|
|
16
|
-
user: 'u_test_e',
|
|
17
|
-
password: 'PASSWD',
|
|
18
|
-
database: 'p_test_e',
|
|
19
|
-
read: { host: 'c0.cluster-ro-abc.eu-west-1.rds.amazonaws.com' },
|
|
20
|
-
},
|
|
21
|
-
}
|
|
22
|
-
it('resolves tenant config config', () => {
|
|
23
|
-
const tenantResolver = createTenantConfigResolver(env, configTemplate.tenant)
|
|
24
|
-
const resolvedTenantConfig = tenantResolver('test', tenantConfig)
|
|
25
|
-
assert.deepEqual(resolvedTenantConfig, {
|
|
26
|
-
db: {
|
|
27
|
-
host: 'c0.cluster-abc.eu-west-1.rds.amazonaws.com',
|
|
28
|
-
port: 5432,
|
|
29
|
-
user: 'u_test_e',
|
|
30
|
-
password: 'PASSWD',
|
|
31
|
-
database: 'p_test_e',
|
|
32
|
-
connectionTimeoutMs: 5000,
|
|
33
|
-
pool: { maxConnections: 1000, maxConnecting: 10, idleTimeoutMs: 60000 },
|
|
34
|
-
read: { host: 'c0.cluster-ro-abc.eu-west-1.rds.amazonaws.com' },
|
|
35
|
-
}, mailer: {}, credentials: {}, secrets: {},
|
|
36
|
-
})
|
|
37
|
-
})
|
|
38
|
-
it('resolves project config config', () => {
|
|
39
|
-
const tenantResolver = createTenantConfigResolver(env, configTemplate.tenant)
|
|
40
|
-
const resolvedTenantConfig = tenantResolver('test', tenantConfig)
|
|
41
|
-
|
|
42
|
-
const projectConfigResolver = createProjectConfigResolver(env, configTemplate, [])
|
|
43
|
-
const resolvedProjectConfig = projectConfigResolver('test-p', {
|
|
44
|
-
db: {
|
|
45
|
-
useTenantDb: true,
|
|
46
|
-
systemSchema: 'system_test_e',
|
|
47
|
-
}, s3: { prefix: 'test-e/test-e' }, stages: { live: { schema: 'content_test_e_live' } },
|
|
48
|
-
}, {}, resolvedTenantConfig)
|
|
49
|
-
|
|
50
|
-
assert.deepEqual(resolvedProjectConfig as any, {
|
|
51
|
-
name: 'Test p',
|
|
52
|
-
slug: 'test-p',
|
|
53
|
-
stages: [{ name: 'Live', slug: 'live', schema: 'content_test_e_live' }],
|
|
54
|
-
db: {
|
|
55
|
-
host: 'c0.cluster-abc.eu-west-1.rds.amazonaws.com',
|
|
56
|
-
port: 5432,
|
|
57
|
-
user: 'u_test_e',
|
|
58
|
-
password: 'PASSWD',
|
|
59
|
-
database: 'p_test_e',
|
|
60
|
-
connectionTimeoutMs: 5000,
|
|
61
|
-
pool: { maxConnections: 1000, maxConnecting: 10, idleTimeoutMs: 60000 },
|
|
62
|
-
read: { host: 'c0.cluster-ro-abc.eu-west-1.rds.amazonaws.com' },
|
|
63
|
-
useTenantDb: true,
|
|
64
|
-
systemSchema: 'system_test_e',
|
|
65
|
-
},
|
|
66
|
-
})
|
|
67
|
-
})
|