@contember/engine-server 1.4.0-rc.8 → 2.0.0-alpha.8
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/development/src/cluster.cjs +87 -0
- package/dist/development/src/cluster.cjs.map +1 -0
- package/dist/development/src/cluster.js +87 -0
- package/dist/development/src/cluster.js.map +1 -0
- package/dist/development/src/loadPlugins.cjs +9 -0
- package/dist/development/src/loadPlugins.cjs.map +1 -0
- package/dist/development/src/loadPlugins.js +10 -0
- package/dist/development/src/loadPlugins.js.map +1 -0
- package/dist/development/src/utils.cjs +7 -0
- package/dist/development/src/utils.cjs.map +1 -0
- package/dist/development/src/utils.js +7 -0
- package/dist/development/src/utils.js.map +1 -0
- package/dist/development/start.cjs +152 -0
- package/dist/development/start.cjs.map +1 -0
- package/dist/development/start.js +134 -0
- package/dist/development/start.js.map +1 -0
- package/dist/production/src/cluster.cjs +87 -0
- package/dist/production/src/cluster.cjs.map +1 -0
- package/dist/production/src/cluster.js +87 -0
- package/dist/production/src/cluster.js.map +1 -0
- package/dist/production/src/loadPlugins.cjs +9 -0
- package/dist/production/src/loadPlugins.cjs.map +1 -0
- package/dist/production/src/loadPlugins.js +10 -0
- package/dist/production/src/loadPlugins.js.map +1 -0
- package/dist/production/src/utils.cjs +7 -0
- package/dist/production/src/utils.cjs.map +1 -0
- package/dist/production/src/utils.js +7 -0
- package/dist/production/src/utils.js.map +1 -0
- package/dist/production/start.cjs +152 -0
- package/dist/production/start.cjs.map +1 -0
- package/dist/production/start.js +134 -0
- package/dist/production/start.js.map +1 -0
- package/dist/types/cluster.d.ts +16 -0
- package/dist/types/cluster.d.ts.map +1 -0
- package/dist/{src → types}/loadPlugins.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/dist/types/utils.d.ts +2 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/esbuild.cjs +42 -0
- package/package.json +28 -14
- package/src/cluster.ts +95 -0
- package/src/loadPlugins.ts +2 -1
- package/src/start.ts +128 -17
- package/src/tsconfig.json +2 -1
- package/src/utils.ts +4 -0
- package/tsconfig.json +0 -1
- package/types/prom-client/index.d.ts +17 -0
- package/dist/src/loadPlugins.js +0 -12
- package/dist/src/loadPlugins.js.map +0 -1
- package/dist/src/start.js +0 -47
- package/dist/src/start.js.map +0 -1
- package/dist/src/tsconfig.tsbuildinfo +0 -1
- package/dist/tests/e2e/acl-condition-variable.test.d.ts +0 -2
- package/dist/tests/e2e/acl-condition-variable.test.d.ts.map +0 -1
- package/dist/tests/e2e/acl-condition-variable.test.js +0 -77
- package/dist/tests/e2e/acl-condition-variable.test.js.map +0 -1
- package/dist/tests/e2e/assume-identity.test.d.ts +0 -2
- package/dist/tests/e2e/assume-identity.test.d.ts.map +0 -1
- package/dist/tests/e2e/assume-identity.test.js +0 -109
- package/dist/tests/e2e/assume-identity.test.js.map +0 -1
- package/dist/tests/e2e/assume-membership.test.d.ts +0 -2
- package/dist/tests/e2e/assume-membership.test.d.ts.map +0 -1
- package/dist/tests/e2e/assume-membership.test.js +0 -58
- package/dist/tests/e2e/assume-membership.test.js.map +0 -1
- package/dist/tests/e2e/content-api-basic.test.d.ts +0 -2
- package/dist/tests/e2e/content-api-basic.test.d.ts.map +0 -1
- package/dist/tests/e2e/content-api-basic.test.js +0 -50
- package/dist/tests/e2e/content-api-basic.test.js.map +0 -1
- package/dist/tests/e2e/content-invalid-schema.test.d.ts +0 -2
- package/dist/tests/e2e/content-invalid-schema.test.d.ts.map +0 -1
- package/dist/tests/e2e/content-invalid-schema.test.js +0 -29
- package/dist/tests/e2e/content-invalid-schema.test.js.map +0 -1
- package/dist/tests/e2e/homepage.test.d.ts +0 -2
- package/dist/tests/e2e/homepage.test.d.ts.map +0 -1
- package/dist/tests/e2e/homepage.test.js +0 -15
- package/dist/tests/e2e/homepage.test.js.map +0 -1
- package/dist/tests/e2e/tenant-member-access.test.d.ts +0 -2
- package/dist/tests/e2e/tenant-member-access.test.d.ts.map +0 -1
- package/dist/tests/e2e/tenant-member-access.test.js +0 -43
- package/dist/tests/e2e/tenant-member-access.test.js.map +0 -1
- package/dist/tests/e2e/x-contember-ref.test.d.ts +0 -2
- package/dist/tests/e2e/x-contember-ref.test.d.ts.map +0 -1
- package/dist/tests/e2e/x-contember-ref.test.js +0 -63
- package/dist/tests/e2e/x-contember-ref.test.js.map +0 -1
- package/dist/tests/src/requests.d.ts +0 -5
- package/dist/tests/src/requests.d.ts.map +0 -1
- package/dist/tests/src/requests.js +0 -68
- package/dist/tests/src/requests.js.map +0 -1
- package/dist/tests/src/tester.d.ts +0 -19
- package/dist/tests/src/tester.d.ts.map +0 -1
- package/dist/tests/src/tester.js +0 -99
- package/dist/tests/src/tester.js.map +0 -1
- package/dist/tests/tsconfig.tsbuildinfo +0 -1
- package/esbuild.js +0 -7
- package/tests/e2e/acl-condition-variable.test.ts +0 -74
- package/tests/e2e/assume-identity.test.ts +0 -126
- package/tests/e2e/assume-membership.test.ts +0 -64
- package/tests/e2e/content-api-basic.test.ts +0 -51
- package/tests/e2e/content-invalid-schema.test.ts +0 -31
- package/tests/e2e/homepage.test.ts +0 -10
- package/tests/e2e/tenant-member-access.test.ts +0 -51
- package/tests/e2e/x-contember-ref.test.ts +0 -71
- package/tests/src/requests.ts +0 -81
- package/tests/src/tester.ts +0 -118
- package/tests/start-server.sh +0 -16
- package/tests/tsconfig.json +0 -11
- package/vite.config.js +0 -3
- /package/dist/{src → types}/loadPlugins.d.ts +0 -0
- /package/dist/{src → types}/start.d.ts +0 -0
- /package/dist/{src → types}/start.d.ts.map +0 -0
package/esbuild.cjs
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const path = require('path')
|
|
2
|
+
const esbuild = require('esbuild')
|
|
3
|
+
const {nodeExternalsPlugin} = require('esbuild-node-externals');
|
|
4
|
+
const glob = require('fast-glob')
|
|
5
|
+
|
|
6
|
+
const root = path.dirname(path.dirname(__dirname))
|
|
7
|
+
|
|
8
|
+
;(async () => {
|
|
9
|
+
const packageJsonFiles = await glob('packages/*/package.json')
|
|
10
|
+
const buildServer = entrypoint => esbuild.build({
|
|
11
|
+
entryPoints: [entrypoint],
|
|
12
|
+
bundle: true,
|
|
13
|
+
platform: 'node',
|
|
14
|
+
format: 'esm',
|
|
15
|
+
sourcemap: 'external',
|
|
16
|
+
outfile: './server/server.js',
|
|
17
|
+
plugins: [
|
|
18
|
+
nodeExternalsPlugin({
|
|
19
|
+
packagePath: packageJsonFiles,
|
|
20
|
+
allowList: it => it.startsWith('@contember/')
|
|
21
|
+
}),
|
|
22
|
+
{
|
|
23
|
+
name: 'resolve contember',
|
|
24
|
+
setup(build) {
|
|
25
|
+
build.onResolve({filter: /^@contember\/.+$/}, args => {
|
|
26
|
+
const pkg = args.path.match(/@contember\/(.+)/)[1]
|
|
27
|
+
return {path: path.join(root, 'packages', pkg, pkg.includes('/') ? 'index.ts' : 'src/index.ts')}
|
|
28
|
+
})
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
await buildServer('./packages/engine-server/src/start.ts')
|
|
35
|
+
|
|
36
|
+
})()
|
|
37
|
+
.catch(e => {
|
|
38
|
+
console.error(e)
|
|
39
|
+
process.exit(1)
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
|
package/package.json
CHANGED
|
@@ -1,26 +1,40 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contember/engine-server",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-alpha.8",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
|
-
"main": "dist/
|
|
6
|
-
"typings": "dist/
|
|
7
|
-
"
|
|
8
|
-
"
|
|
5
|
+
"main": "./dist/production/index.js",
|
|
6
|
+
"typings": "./dist/types/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"import": {
|
|
10
|
+
"types": "./dist/types/index.d.ts",
|
|
11
|
+
"development": "./dist/development/index.js",
|
|
12
|
+
"production": "./dist/production/index.js",
|
|
13
|
+
"typescript": "./src/index.ts",
|
|
14
|
+
"default": "./dist/production/index.js"
|
|
15
|
+
},
|
|
16
|
+
"require": {
|
|
17
|
+
"types": "./dist/types/index.d.ts",
|
|
18
|
+
"development": "./dist/development/index.cjs",
|
|
19
|
+
"production": "./dist/production/index.cjs",
|
|
20
|
+
"typescript": "./src/index.ts",
|
|
21
|
+
"default": "./dist/production/index.cjs"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
9
24
|
},
|
|
10
25
|
"dependencies": {
|
|
11
|
-
"@contember/engine-
|
|
12
|
-
"@contember/engine-
|
|
13
|
-
"@contember/engine-
|
|
14
|
-
"@contember/engine-
|
|
26
|
+
"@contember/engine-actions": "2.0.0-alpha.8",
|
|
27
|
+
"@contember/engine-http": "2.0.0-alpha.8",
|
|
28
|
+
"@contember/engine-plugins": "2.0.0-alpha.8",
|
|
29
|
+
"@contember/engine-s3-plugin": "2.0.0-alpha.8",
|
|
30
|
+
"@contember/engine-vimeo-plugin": "2.0.0-alpha.8",
|
|
15
31
|
"graphql": "^16.8.1",
|
|
16
32
|
"pg": "^8.11.3",
|
|
17
33
|
"uuid": "^9.0.1"
|
|
18
34
|
},
|
|
19
35
|
"devDependencies": {
|
|
20
|
-
"@contember/engine-api-tester": "1.4.0-rc.8",
|
|
21
36
|
"@types/koa-compress": "^4.0.6",
|
|
22
|
-
"@types/node": "^20.9.0"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
37
|
+
"@types/node": "^20.9.0"
|
|
38
|
+
},
|
|
39
|
+
"type": "module"
|
|
26
40
|
}
|
package/src/cluster.ts
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import cluster, { Worker } from 'node:cluster'
|
|
2
|
+
import { timeout } from './utils'
|
|
3
|
+
|
|
4
|
+
export const getClusterProcessType = (isClusterMode: boolean): ProcessType =>
|
|
5
|
+
!isClusterMode ? 'singleNode' : cluster.isMaster ? 'clusterMaster' : 'clusterWorker'
|
|
6
|
+
|
|
7
|
+
export type ProcessType =
|
|
8
|
+
| 'singleNode'
|
|
9
|
+
| 'clusterMaster'
|
|
10
|
+
| 'clusterWorker'
|
|
11
|
+
|
|
12
|
+
const MSG_WORKER_STARTED = 'msg_worker_started'
|
|
13
|
+
|
|
14
|
+
export const waitForWorker = (worker: Worker, timeoutMs: number) => {
|
|
15
|
+
let ok = false
|
|
16
|
+
return Promise.race([
|
|
17
|
+
new Promise(async resolve => {
|
|
18
|
+
const listener = (message: any) => {
|
|
19
|
+
if ('type' in message && message.type === MSG_WORKER_STARTED) {
|
|
20
|
+
ok = true
|
|
21
|
+
resolve(null)
|
|
22
|
+
worker.removeListener('message', listener)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
await worker.on('message', listener)
|
|
26
|
+
}),
|
|
27
|
+
timeout(timeoutMs).then(() => {
|
|
28
|
+
if (!ok) {
|
|
29
|
+
throw new Error('Worker start timed out')
|
|
30
|
+
}
|
|
31
|
+
return true
|
|
32
|
+
}),
|
|
33
|
+
])
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const notifyWorkerStarted = () =>
|
|
37
|
+
process.send?.({
|
|
38
|
+
type: MSG_WORKER_STARTED,
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
export class WorkerManager {
|
|
42
|
+
|
|
43
|
+
private isTerminating = false
|
|
44
|
+
|
|
45
|
+
private workers: Set<Worker> = new Set()
|
|
46
|
+
|
|
47
|
+
public async start({ workerCount, env }: { workerCount: number; env?: any }): Promise<void> {
|
|
48
|
+
if (this.isTerminating) {
|
|
49
|
+
throw new Error(`Worker manager is terminating`)
|
|
50
|
+
}
|
|
51
|
+
for (let i = 0; i < workerCount; i++) {
|
|
52
|
+
await this.startWorker(env)
|
|
53
|
+
if (this.isTerminating) {
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
private async startWorker(env?: any) {
|
|
60
|
+
const worker = cluster.fork(env)
|
|
61
|
+
worker.on('exit', async (code, signal) => {
|
|
62
|
+
this.workers.delete(worker)
|
|
63
|
+
if (!this.isTerminating) {
|
|
64
|
+
// eslint-disable-next-line no-console
|
|
65
|
+
console.log(`Worker ${worker.process.pid} died with signal ${signal}, restarting`)
|
|
66
|
+
await timeout(2000)
|
|
67
|
+
await this.startWorker(env)
|
|
68
|
+
}
|
|
69
|
+
})
|
|
70
|
+
this.workers.add(worker)
|
|
71
|
+
await waitForWorker(worker, 15000)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public async terminate(signal: NodeJS.Signals): Promise<void> {
|
|
75
|
+
if (this.isTerminating) {
|
|
76
|
+
throw new Error(`Worker manager is terminating`)
|
|
77
|
+
}
|
|
78
|
+
this.isTerminating = true
|
|
79
|
+
await Promise.allSettled(Array.from(this.workers).map(async it => {
|
|
80
|
+
if (!it) {
|
|
81
|
+
return
|
|
82
|
+
}
|
|
83
|
+
// eslint-disable-next-line no-console
|
|
84
|
+
console.log(`Terminating worker ${it.process.pid}`)
|
|
85
|
+
const disconnectPromise = new Promise(resolve => it.once('disconnect', resolve))
|
|
86
|
+
it.disconnect()
|
|
87
|
+
await disconnectPromise
|
|
88
|
+
const killPromise = new Promise(resolve => it.once('exit', resolve))
|
|
89
|
+
it.kill(signal)
|
|
90
|
+
await killPromise
|
|
91
|
+
// eslint-disable-next-line no-console
|
|
92
|
+
console.log(`Worker ${it.process.pid} terminated`)
|
|
93
|
+
}))
|
|
94
|
+
}
|
|
95
|
+
}
|
package/src/loadPlugins.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import ActionsPlugin from '@contember/engine-actions'
|
|
1
2
|
import { Plugin } from '@contember/engine-plugins'
|
|
2
3
|
import S3Plugin from '@contember/engine-s3-plugin'
|
|
3
4
|
import VimeoPlugin from '@contember/engine-vimeo-plugin'
|
|
4
5
|
|
|
5
6
|
export default function loadPlugins(): Promise<Plugin[]> {
|
|
6
|
-
return Promise.resolve([new S3Plugin(), new VimeoPlugin()])
|
|
7
|
+
return Promise.resolve([new S3Plugin(), new VimeoPlugin(), new ActionsPlugin()])
|
|
7
8
|
}
|
package/src/start.ts
CHANGED
|
@@ -2,13 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
createContainer,
|
|
5
|
-
createDefaultLogger,
|
|
5
|
+
createDefaultLogger,
|
|
6
|
+
createSentryLoggerHandler,
|
|
7
|
+
getServerVersion,
|
|
8
|
+
isDebugMode,
|
|
6
9
|
listenOnProcessTermination,
|
|
10
|
+
printStartInfo,
|
|
11
|
+
resolveServerConfig,
|
|
7
12
|
serverConfigSchema,
|
|
8
13
|
TerminationJob,
|
|
9
|
-
getServerVersion, isDebugMode, printStartInfo, resolveServerConfig,
|
|
10
14
|
} from '@contember/engine-http'
|
|
11
15
|
import loadPlugins from './loadPlugins'
|
|
16
|
+
import cluster from 'node:cluster'
|
|
17
|
+
import * as os from 'node:os'
|
|
18
|
+
import { timeout } from './utils'
|
|
19
|
+
import { getClusterProcessType, notifyWorkerStarted, WorkerManager } from './cluster'
|
|
12
20
|
|
|
13
21
|
const logger = createDefaultLogger()
|
|
14
22
|
process.on('warning', message => {
|
|
@@ -16,38 +24,141 @@ process.on('warning', message => {
|
|
|
16
24
|
})
|
|
17
25
|
;(async () => {
|
|
18
26
|
const isDebug = isDebugMode()
|
|
19
|
-
const terminationJobs: TerminationJob[] = []
|
|
20
|
-
listenOnProcessTermination(terminationJobs, logger)
|
|
21
27
|
|
|
22
|
-
const version = getServerVersion()
|
|
28
|
+
const version = await getServerVersion()
|
|
23
29
|
printStartInfo({ version, isDebug }, logger)
|
|
24
30
|
const plugins = await loadPlugins()
|
|
25
|
-
const { serverConfig, projectConfigResolver, tenantConfigResolver } = await resolveServerConfig({
|
|
26
|
-
plugins,
|
|
27
|
-
serverConfigSchema,
|
|
28
|
-
})
|
|
31
|
+
const { serverConfig, projectConfigResolver, tenantConfigResolver } = await resolveServerConfig({ plugins, serverConfigSchema })
|
|
29
32
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
logger.addHandler(sentryTransport)
|
|
33
|
+
if (process.argv[2] === 'validate') {
|
|
34
|
+
process.exit(0)
|
|
33
35
|
}
|
|
34
36
|
|
|
37
|
+
const sentryhandler = createSentryLoggerHandler(serverConfig.logging?.sentry?.dsn)
|
|
38
|
+
if (sentryhandler !== null) {
|
|
39
|
+
logger.addHandler(sentryhandler)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const workerConfig = serverConfig.workerCount || 1
|
|
43
|
+
|
|
44
|
+
const workerCount = workerConfig === 'auto' ? os.cpus().length : Number(workerConfig)
|
|
45
|
+
const isClusterMode = serverConfig.workerCount !== undefined
|
|
46
|
+
|
|
47
|
+
const processType = getClusterProcessType(isClusterMode)
|
|
48
|
+
|
|
35
49
|
const container = createContainer({
|
|
36
50
|
debugMode: isDebug,
|
|
37
51
|
serverConfig,
|
|
38
52
|
projectConfigResolver,
|
|
39
53
|
tenantConfigResolver,
|
|
40
54
|
plugins,
|
|
55
|
+
processType,
|
|
41
56
|
version,
|
|
42
57
|
logger,
|
|
43
58
|
})
|
|
44
59
|
|
|
45
|
-
|
|
60
|
+
let initializedProjects: string[] = []
|
|
61
|
+
const terminationJobs: TerminationJob[] = []
|
|
62
|
+
listenOnProcessTermination(terminationJobs, logger)
|
|
63
|
+
|
|
64
|
+
if (cluster.isMaster) {
|
|
65
|
+
const monitoringPort = serverConfig.monitoringPort
|
|
66
|
+
const monitoringServer = container.monitoringKoa.listen(monitoringPort, () => {
|
|
67
|
+
logger.info(`Monitoring running on http://localhost:${monitoringPort}`)
|
|
68
|
+
})
|
|
69
|
+
terminationJobs.push(async () => {
|
|
70
|
+
await new Promise<any>(resolve => monitoringServer.close(resolve))
|
|
71
|
+
logger.info('Monitoring server terminated')
|
|
72
|
+
})
|
|
73
|
+
if (!serverConfig.projectGroup) {
|
|
74
|
+
initializedProjects = await container.initializer.initialize()
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const port = serverConfig.port
|
|
79
|
+
const printStarted = () => {
|
|
80
|
+
if (serverConfig.projectGroup) {
|
|
81
|
+
logger.info('Contember Cloud running')
|
|
82
|
+
} else {
|
|
83
|
+
logger.info(`Contember API running on http://localhost:${port}`)
|
|
84
|
+
}
|
|
85
|
+
if (initializedProjects.length) {
|
|
86
|
+
logger.info(`Initialized projects: ${initializedProjects.join(', ')}`)
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const startApplication = async () => {
|
|
91
|
+
const httpServerPromise = container.application.listen()
|
|
92
|
+
terminationJobs.push(async () => {
|
|
93
|
+
await (await httpServerPromise).close()
|
|
94
|
+
logger.info('API server terminated')
|
|
95
|
+
})
|
|
96
|
+
await httpServerPromise
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const startWorker = async (workerName: string) => {
|
|
100
|
+
const worker = container.applicationWorkers.getWorker(workerName)
|
|
101
|
+
const runningWorker = worker.run({
|
|
102
|
+
logger,
|
|
103
|
+
onError: e => {
|
|
104
|
+
logger.crit(e)
|
|
105
|
+
process.exit(1)
|
|
106
|
+
},
|
|
107
|
+
})
|
|
108
|
+
terminationJobs.push(async () => {
|
|
109
|
+
(await runningWorker).end()
|
|
110
|
+
})
|
|
111
|
+
await runningWorker
|
|
112
|
+
logger.info(`Contember Worker ${workerName} started.`)
|
|
113
|
+
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const applicationWorker = serverConfig.applicationWorker
|
|
117
|
+
if (applicationWorker && applicationWorker !== 'all') {
|
|
118
|
+
await startWorker(applicationWorker)
|
|
119
|
+
if (isClusterMode) {
|
|
120
|
+
notifyWorkerStarted()
|
|
121
|
+
}
|
|
122
|
+
} else if (isClusterMode) {
|
|
123
|
+
if (cluster.isMaster) {
|
|
124
|
+
logger.info(`Master ${process.pid} is running`)
|
|
125
|
+
const workerManager = new WorkerManager()
|
|
126
|
+
terminationJobs.push(async ({ signal }) => {
|
|
127
|
+
await workerManager.terminate(signal)
|
|
128
|
+
logger.info('Workers terminated')
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
await workerManager.start({ workerCount })
|
|
132
|
+
|
|
133
|
+
if (applicationWorker === 'all') {
|
|
134
|
+
for (const workerName of container.applicationWorkers.getWorkerNames()) {
|
|
135
|
+
await workerManager.start({
|
|
136
|
+
workerCount, env: {
|
|
137
|
+
CONTEMBER_APPLICATION_WORKER: workerName,
|
|
138
|
+
},
|
|
139
|
+
})
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
printStarted()
|
|
143
|
+
} else {
|
|
144
|
+
logger.info(`Starting worker ${process.pid}`)
|
|
145
|
+
|
|
146
|
+
// this line somehow ensures, that worker waits for termination of all jobs
|
|
147
|
+
process.on('disconnect', () => timeout(0))
|
|
148
|
+
|
|
149
|
+
await startApplication()
|
|
150
|
+
notifyWorkerStarted()
|
|
151
|
+
}
|
|
152
|
+
} else {
|
|
153
|
+
await startApplication()
|
|
154
|
+
if (applicationWorker === 'all') {
|
|
155
|
+
for (const workerName of container.applicationWorkers.getWorkerNames()) {
|
|
156
|
+
await startWorker(workerName)
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
printStarted()
|
|
160
|
+
}
|
|
46
161
|
|
|
47
|
-
const httpServerPromise = container.application.listen()
|
|
48
|
-
terminationJobs.push(async () => await (await httpServerPromise).close())
|
|
49
|
-
logger.info(`Contember API running on http://localhost:${(serverConfig.port)}`)
|
|
50
|
-
logger.info(initializedProjects.length ? `Initialized projects: ${initializedProjects.join(', ')}` : 'No project initialized')
|
|
51
162
|
})().catch(e => {
|
|
52
163
|
logger.crit(e)
|
|
53
164
|
process.exit(1)
|
package/src/tsconfig.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"extends": "../tsconfig.settings.json",
|
|
3
3
|
"compilerOptions": {
|
|
4
|
-
"outDir": "../dist/
|
|
4
|
+
"outDir": "../dist/types"
|
|
5
5
|
},
|
|
6
6
|
"references": [
|
|
7
|
+
{ "path": "../../engine-actions/src" },
|
|
7
8
|
{ "path": "../../engine-http/src" },
|
|
8
9
|
{ "path": "../../engine-plugins/src" },
|
|
9
10
|
{ "path": "../../engine-s3-plugin/src" },
|
package/src/utils.ts
ADDED
package/tsconfig.json
CHANGED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as promClient from 'prom-client'
|
|
2
|
+
|
|
3
|
+
declare module 'prom-client' {
|
|
4
|
+
export type Collector = () => void
|
|
5
|
+
|
|
6
|
+
interface Registry {
|
|
7
|
+
/**
|
|
8
|
+
* Add metric collector, which is invoked on scrape
|
|
9
|
+
*/
|
|
10
|
+
registerCollector(collectorFn: Collector): void
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Get all registered collector functions
|
|
14
|
+
*/
|
|
15
|
+
collectors(): Collector[]
|
|
16
|
+
}
|
|
17
|
+
}
|
package/dist/src/loadPlugins.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const engine_s3_plugin_1 = __importDefault(require("@contember/engine-s3-plugin"));
|
|
7
|
-
const engine_vimeo_plugin_1 = __importDefault(require("@contember/engine-vimeo-plugin"));
|
|
8
|
-
function loadPlugins() {
|
|
9
|
-
return Promise.resolve([new engine_s3_plugin_1.default(), new engine_vimeo_plugin_1.default()]);
|
|
10
|
-
}
|
|
11
|
-
exports.default = loadPlugins;
|
|
12
|
-
//# sourceMappingURL=loadPlugins.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loadPlugins.js","sourceRoot":"","sources":["../../src/loadPlugins.ts"],"names":[],"mappings":";;;;;AACA,mFAAkD;AAClD,yFAAwD;AAExD,SAAwB,WAAW;IAClC,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,0BAAQ,EAAE,EAAE,IAAI,6BAAW,EAAE,CAAC,CAAC,CAAA;AAC5D,CAAC;AAFD,8BAEC"}
|
package/dist/src/start.js
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
-
};
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
const engine_http_1 = require("@contember/engine-http");
|
|
8
|
-
const loadPlugins_1 = __importDefault(require("./loadPlugins"));
|
|
9
|
-
const logger = (0, engine_http_1.createDefaultLogger)();
|
|
10
|
-
process.on('warning', message => {
|
|
11
|
-
logger.warn(message);
|
|
12
|
-
});
|
|
13
|
-
(async () => {
|
|
14
|
-
var _a;
|
|
15
|
-
const isDebug = (0, engine_http_1.isDebugMode)();
|
|
16
|
-
const terminationJobs = [];
|
|
17
|
-
(0, engine_http_1.listenOnProcessTermination)(terminationJobs, logger);
|
|
18
|
-
const version = (0, engine_http_1.getServerVersion)();
|
|
19
|
-
(0, engine_http_1.printStartInfo)({ version, isDebug }, logger);
|
|
20
|
-
const plugins = await (0, loadPlugins_1.default)();
|
|
21
|
-
const { serverConfig, projectConfigResolver, tenantConfigResolver } = await (0, engine_http_1.resolveServerConfig)({
|
|
22
|
-
plugins,
|
|
23
|
-
serverConfigSchema: engine_http_1.serverConfigSchema,
|
|
24
|
-
});
|
|
25
|
-
const sentryTransport = (0, engine_http_1.createSentryLoggerHandler)((_a = serverConfig.logging.sentry) === null || _a === void 0 ? void 0 : _a.dsn);
|
|
26
|
-
if (sentryTransport !== null) {
|
|
27
|
-
logger.addHandler(sentryTransport);
|
|
28
|
-
}
|
|
29
|
-
const container = (0, engine_http_1.createContainer)({
|
|
30
|
-
debugMode: isDebug,
|
|
31
|
-
serverConfig,
|
|
32
|
-
projectConfigResolver,
|
|
33
|
-
tenantConfigResolver,
|
|
34
|
-
plugins,
|
|
35
|
-
version,
|
|
36
|
-
logger,
|
|
37
|
-
});
|
|
38
|
-
const initializedProjects = await container.initializer.initialize();
|
|
39
|
-
const httpServerPromise = container.application.listen();
|
|
40
|
-
terminationJobs.push(async () => await (await httpServerPromise).close());
|
|
41
|
-
logger.info(`Contember API running on http://localhost:${(serverConfig.port)}`);
|
|
42
|
-
logger.info(initializedProjects.length ? `Initialized projects: ${initializedProjects.join(', ')}` : 'No project initialized');
|
|
43
|
-
})().catch(e => {
|
|
44
|
-
logger.crit(e);
|
|
45
|
-
process.exit(1);
|
|
46
|
-
});
|
|
47
|
-
//# sourceMappingURL=start.js.map
|
package/dist/src/start.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/start.ts"],"names":[],"mappings":";;;;;;AAEA,wDAO+B;AAC/B,gEAAuC;AAEvC,MAAM,MAAM,GAAG,IAAA,iCAAmB,GAAE,CAAA;AACpC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE;IAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACrB,CAAC,CAAC,CACD;AAAA,CAAC,KAAK,IAAI,EAAE;;IACZ,MAAM,OAAO,GAAG,IAAA,yBAAW,GAAE,CAAA;IAC7B,MAAM,eAAe,GAAqB,EAAE,CAAA;IAC5C,IAAA,wCAA0B,EAAC,eAAe,EAAE,MAAM,CAAC,CAAA;IAEnD,MAAM,OAAO,GAAG,IAAA,8BAAgB,GAAE,CAAA;IAClC,IAAA,4BAAc,EAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,CAAA;IAC5C,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAW,GAAE,CAAA;IACnC,MAAM,EAAE,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,GAAG,MAAM,IAAA,iCAAmB,EAAC;QAC/F,OAAO;QACP,kBAAkB,EAAlB,gCAAkB;KAClB,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,IAAA,uCAAyB,EAAC,MAAA,YAAY,CAAC,OAAO,CAAC,MAAM,0CAAE,GAAG,CAAC,CAAA;IACnF,IAAI,eAAe,KAAK,IAAI,EAAE;QAC7B,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;KAClC;IAED,MAAM,SAAS,GAAG,IAAA,6BAAe,EAAC;QACjC,SAAS,EAAE,OAAO;QAClB,YAAY;QACZ,qBAAqB;QACrB,oBAAoB;QACpB,OAAO;QACP,OAAO;QACP,MAAM;KACN,CAAC,CAAA;IAEF,MAAM,mBAAmB,GAAa,MAAM,SAAS,CAAC,WAAW,CAAC,UAAU,EAAE,CAAA;IAE9E,MAAM,iBAAiB,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,CAAA;IACxD,eAAe,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,iBAAiB,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IACzE,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC/E,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,yBAAyB,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAA;AAC/H,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IACd,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AAChB,CAAC,CAAC,CAAA"}
|