@contember/engine-server 1.1.1 → 1.2.0-alpha.10
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/MasterContainer.d.ts +27 -25
- package/dist/src/MasterContainer.d.ts.map +1 -1
- package/dist/src/MasterContainer.js +54 -80
- package/dist/src/MasterContainer.js.map +1 -1
- package/dist/src/bootstrap/Initializer.d.ts +3 -3
- package/dist/src/bootstrap/Initializer.d.ts.map +1 -1
- package/dist/src/bootstrap/Initializer.js +15 -8
- package/dist/src/bootstrap/Initializer.js.map +1 -1
- package/dist/src/config/config.d.ts +5 -4
- package/dist/src/config/config.d.ts.map +1 -1
- package/dist/src/config/config.js +2 -2
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/configSchema.d.ts +45 -11
- package/dist/src/config/configSchema.d.ts.map +1 -1
- package/dist/src/config/configSchema.js +20 -18
- package/dist/src/config/configSchema.js.map +1 -1
- package/dist/src/config/configTemplate.d.ts.map +1 -1
- package/dist/src/config/configTemplate.js +23 -0
- package/dist/src/config/configTemplate.js.map +1 -1
- package/dist/src/index.d.ts +9 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +23 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/project/ProjectContainer.js +1 -1
- package/dist/src/project/ProjectContainer.js.map +1 -1
- package/dist/src/project/ProjectContainerResolver.d.ts +6 -3
- package/dist/src/project/ProjectContainerResolver.d.ts.map +1 -1
- package/dist/src/project/ProjectContainerResolver.js +4 -16
- package/dist/src/project/ProjectContainerResolver.js.map +1 -1
- package/dist/src/projectGroup/ProjectGroupContainer.d.ts +2 -1
- package/dist/src/projectGroup/ProjectGroupContainer.d.ts.map +1 -1
- package/dist/src/projectGroup/ProjectGroupContainer.js +8 -4
- package/dist/src/projectGroup/ProjectGroupContainer.js.map +1 -1
- package/dist/src/projectGroup/ProjectGroupResolver.d.ts +7 -0
- package/dist/src/projectGroup/ProjectGroupResolver.d.ts.map +1 -0
- package/dist/src/projectGroup/ProjectGroupResolver.js +13 -0
- package/dist/src/projectGroup/ProjectGroupResolver.js.map +1 -0
- package/dist/src/start.js +15 -112
- package/dist/src/start.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/utils/index.d.ts +0 -4
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +0 -4
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/sentry.d.ts +1 -1
- package/dist/src/utils/sentry.d.ts.map +1 -1
- package/dist/src/utils/sentry.js +1 -1
- package/dist/src/utils/sentry.js.map +1 -1
- package/dist/src/utils/serverStartup.d.ts +31 -0
- package/dist/src/utils/serverStartup.d.ts.map +1 -0
- package/dist/src/utils/serverStartup.js +42 -0
- package/dist/src/utils/serverStartup.js.map +1 -0
- package/dist/src/utils/serverTermination.d.ts +12 -0
- package/dist/src/utils/serverTermination.d.ts.map +1 -0
- package/dist/src/utils/serverTermination.js +26 -0
- package/dist/src/utils/serverTermination.js.map +1 -0
- package/dist/tests/e2e/acl-condition-variable.test.d.ts +2 -0
- package/dist/tests/e2e/acl-condition-variable.test.d.ts.map +1 -0
- package/dist/tests/e2e/acl-condition-variable.test.js +77 -0
- package/dist/tests/e2e/acl-condition-variable.test.js.map +1 -0
- package/dist/tests/e2e/assume-identity.test.d.ts +2 -0
- package/dist/tests/e2e/assume-identity.test.d.ts.map +1 -0
- package/dist/tests/e2e/assume-identity.test.js +109 -0
- package/dist/tests/e2e/assume-identity.test.js.map +1 -0
- package/dist/tests/e2e/assume-membership.test.d.ts +2 -0
- package/dist/tests/e2e/assume-membership.test.d.ts.map +1 -0
- package/dist/tests/e2e/assume-membership.test.js +58 -0
- package/dist/tests/e2e/assume-membership.test.js.map +1 -0
- package/dist/tests/e2e/content-api-basic.test.d.ts +2 -0
- package/dist/tests/e2e/content-api-basic.test.d.ts.map +1 -0
- package/dist/tests/e2e/content-api-basic.test.js +50 -0
- package/dist/tests/e2e/content-api-basic.test.js.map +1 -0
- package/dist/tests/e2e/content-invalid-schema.test.d.ts +2 -0
- package/dist/tests/e2e/content-invalid-schema.test.d.ts.map +1 -0
- package/dist/tests/e2e/content-invalid-schema.test.js +29 -0
- package/dist/tests/e2e/content-invalid-schema.test.js.map +1 -0
- package/dist/tests/e2e/homepage.test.d.ts +2 -0
- package/dist/tests/e2e/homepage.test.d.ts.map +1 -0
- package/dist/tests/e2e/homepage.test.js +15 -0
- package/dist/tests/e2e/homepage.test.js.map +1 -0
- package/dist/tests/e2e/tenant-member-access.test.d.ts +2 -0
- package/dist/tests/e2e/tenant-member-access.test.d.ts.map +1 -0
- package/dist/tests/e2e/tenant-member-access.test.js +43 -0
- package/dist/tests/e2e/tenant-member-access.test.js.map +1 -0
- package/dist/tests/e2e/x-contember-ref.test.d.ts +2 -0
- package/dist/tests/e2e/x-contember-ref.test.d.ts.map +1 -0
- package/dist/tests/e2e/x-contember-ref.test.js +63 -0
- package/dist/tests/e2e/x-contember-ref.test.js.map +1 -0
- package/dist/tests/src/requests.d.ts +5 -0
- package/dist/tests/src/requests.d.ts.map +1 -0
- package/dist/tests/src/requests.js +68 -0
- package/dist/tests/src/requests.js.map +1 -0
- package/dist/tests/src/tester.d.ts +19 -0
- package/dist/tests/src/tester.d.ts.map +1 -0
- package/dist/tests/src/tester.js +99 -0
- package/dist/tests/src/tester.js.map +1 -0
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/esbuild.js +7 -14
- package/package.json +23 -23
- package/src/MasterContainer.ts +94 -110
- package/src/bootstrap/Initializer.ts +16 -8
- package/src/config/config.ts +7 -5
- package/src/config/configSchema.ts +30 -33
- package/src/config/configTemplate.ts +23 -0
- package/src/index.ts +15 -2
- package/src/project/ProjectContainer.ts +1 -1
- package/src/project/ProjectContainerResolver.ts +4 -17
- package/src/projectGroup/ProjectGroupContainer.ts +12 -3
- package/src/projectGroup/ProjectGroupResolver.ts +12 -0
- package/src/start.ts +18 -127
- package/src/utils/index.ts +0 -4
- package/src/utils/sentry.ts +1 -1
- package/src/utils/serverStartup.ts +42 -0
- package/src/utils/serverTermination.ts +20 -0
- package/tests/e2e/acl-condition-variable.test.ts +74 -0
- package/tests/e2e/assume-identity.test.ts +127 -0
- package/tests/e2e/assume-membership.test.ts +64 -0
- package/tests/e2e/content-api-basic.test.ts +51 -0
- package/tests/e2e/content-invalid-schema.test.ts +31 -0
- package/tests/e2e/homepage.test.ts +10 -0
- package/tests/e2e/tenant-member-access.test.ts +51 -0
- package/tests/e2e/x-contember-ref.test.ts +71 -0
- package/tests/src/requests.ts +81 -0
- package/tests/src/tester.ts +118 -0
- package/alpine.dockerfile +0 -30
- package/debian.dockerfile +0 -27
- package/dist/src/http/CollectHttpMetricsMiddelware.d.ts +0 -5
- package/dist/src/http/CollectHttpMetricsMiddelware.d.ts.map +0 -1
- package/dist/src/http/CollectHttpMetricsMiddelware.js +0 -36
- package/dist/src/http/CollectHttpMetricsMiddelware.js.map +0 -1
- package/dist/src/http/ShowMetricsMiddleware.d.ts +0 -4
- package/dist/src/http/ShowMetricsMiddleware.d.ts.map +0 -1
- package/dist/src/http/ShowMetricsMiddleware.js +0 -20
- package/dist/src/http/ShowMetricsMiddleware.js.map +0 -1
- package/dist/src/http/index.d.ts +0 -3
- package/dist/src/http/index.d.ts.map +0 -1
- package/dist/src/http/index.js +0 -19
- package/dist/src/http/index.js.map +0 -1
- package/dist/src/projectGroup/ProjectGroupContainerResolver.d.ts +0 -12
- package/dist/src/projectGroup/ProjectGroupContainerResolver.d.ts.map +0 -1
- package/dist/src/projectGroup/ProjectGroupContainerResolver.js +0 -36
- package/dist/src/projectGroup/ProjectGroupContainerResolver.js.map +0 -1
- package/dist/src/utils/cluster.d.ts +0 -9
- package/dist/src/utils/cluster.d.ts.map +0 -1
- package/dist/src/utils/cluster.js +0 -47
- package/dist/src/utils/cluster.js.map +0 -1
- package/dist/src/utils/dbMetrics.d.ts +0 -16
- package/dist/src/utils/dbMetrics.d.ts.map +0 -1
- package/dist/src/utils/dbMetrics.js +0 -98
- package/dist/src/utils/dbMetrics.js.map +0 -1
- package/dist/src/utils/timeout.d.ts +0 -2
- package/dist/src/utils/timeout.d.ts.map +0 -1
- package/dist/src/utils/timeout.js +0 -8
- package/dist/src/utils/timeout.js.map +0 -1
- package/dist/src/utils/tuple.d.ts +0 -2
- package/dist/src/utils/tuple.d.ts.map +0 -1
- package/dist/src/utils/tuple.js +0 -6
- package/dist/src/utils/tuple.js.map +0 -1
- package/dist/tests/e2e/http.test.d.ts +0 -2
- package/dist/tests/e2e/http.test.d.ts.map +0 -1
- package/dist/tests/e2e/http.test.js +0 -275
- package/dist/tests/e2e/http.test.js.map +0 -1
- package/jasmine.json +0 -7
- package/src/http/CollectHttpMetricsMiddelware.ts +0 -32
- package/src/http/ShowMetricsMiddleware.ts +0 -12
- package/src/http/index.ts +0 -2
- package/src/projectGroup/ProjectGroupContainerResolver.ts +0 -47
- package/src/utils/cluster.ts +0 -40
- package/src/utils/dbMetrics.ts +0 -111
- package/src/utils/timeout.ts +0 -4
- package/src/utils/tuple.ts +0 -1
- package/tests/e2e/http.test.ts +0 -303
- package/tslint.json +0 -14
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { assert, test } from 'vitest'
|
|
2
|
+
import { createSchema, SchemaDefinition as def } from '@contember/schema-definition'
|
|
3
|
+
import { createTester, gql } from '../src/tester'
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
namespace TagModel {
|
|
7
|
+
export class Tag {
|
|
8
|
+
label = def.stringColumn()
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
test('Content API: invalid schema error', async () => {
|
|
13
|
+
const tester = await createTester(createSchema(TagModel))
|
|
14
|
+
|
|
15
|
+
await tester(
|
|
16
|
+
gql`
|
|
17
|
+
mutation {
|
|
18
|
+
createFoo(data: { label: "graphql" }) {
|
|
19
|
+
ok
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
`,
|
|
23
|
+
)
|
|
24
|
+
.expect(400)
|
|
25
|
+
.expect(response => {
|
|
26
|
+
assert.deepStrictEqual(
|
|
27
|
+
response.body.errors[0].message,
|
|
28
|
+
'Cannot query field "createFoo" on type "Mutation". Did you mean "createTag"?',
|
|
29
|
+
)
|
|
30
|
+
})
|
|
31
|
+
})
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { assert, test } from 'vitest'
|
|
2
|
+
import { createSchema, SchemaDefinition as def } from '@contember/schema-definition'
|
|
3
|
+
import { createTester, gql } from '../src/tester'
|
|
4
|
+
import { addProjectMember, signIn, signUp } from '../src/requests'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
namespace TagModel {
|
|
8
|
+
export class Tag {
|
|
9
|
+
label = def.stringColumn()
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
test('Tenant API: sign up, add to a project and check project access', async () => {
|
|
15
|
+
const tester = await createTester(createSchema(TagModel))
|
|
16
|
+
|
|
17
|
+
const email = `john+${Date.now()}@doe.com`
|
|
18
|
+
const identityId = await signUp(email)
|
|
19
|
+
const authKey = await signIn(email)
|
|
20
|
+
|
|
21
|
+
await tester(
|
|
22
|
+
gql`
|
|
23
|
+
query {
|
|
24
|
+
listTag {
|
|
25
|
+
id
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
`,
|
|
29
|
+
{ authorizationToken: authKey },
|
|
30
|
+
)
|
|
31
|
+
.expect(404)
|
|
32
|
+
.expect({ errors: [{ message: `Project ${tester.projectSlug} NOT found`, code: 404 }] })
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
await addProjectMember(identityId, tester.projectSlug)
|
|
36
|
+
|
|
37
|
+
await tester(
|
|
38
|
+
gql`
|
|
39
|
+
query {
|
|
40
|
+
listTag {
|
|
41
|
+
id
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
`,
|
|
45
|
+
{ authorizationToken: authKey },
|
|
46
|
+
)
|
|
47
|
+
.expect(response => {
|
|
48
|
+
assert.deepStrictEqual(response.body.data, { listTag: [] })
|
|
49
|
+
})
|
|
50
|
+
.expect(200)
|
|
51
|
+
})
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { assert, test } from 'vitest'
|
|
2
|
+
import { createTester, gql } from '../src/tester'
|
|
3
|
+
import { createSchema, SchemaDefinition as def } from '@contember/schema-definition'
|
|
4
|
+
|
|
5
|
+
namespace TagModel {
|
|
6
|
+
export class Tag {
|
|
7
|
+
label = def.stringColumn()
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
test('Content API: X-Contember-Ref header', async () => {
|
|
13
|
+
|
|
14
|
+
const tester = await createTester(createSchema(TagModel))
|
|
15
|
+
|
|
16
|
+
await tester(
|
|
17
|
+
gql`
|
|
18
|
+
mutation {
|
|
19
|
+
createTag(data: { label: "typescript" }) {
|
|
20
|
+
ok
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
`,
|
|
24
|
+
).expect(200)
|
|
25
|
+
|
|
26
|
+
const response = await tester(
|
|
27
|
+
gql`
|
|
28
|
+
query {
|
|
29
|
+
listTag(filter: { label: { eq: "typescript" } }) {
|
|
30
|
+
label
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
`,
|
|
34
|
+
)
|
|
35
|
+
.set('X-Contember-Ref', 'None')
|
|
36
|
+
.expect(response => {
|
|
37
|
+
assert.deepStrictEqual(response.body.data, {
|
|
38
|
+
listTag: [
|
|
39
|
+
{
|
|
40
|
+
label: 'typescript',
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
})
|
|
44
|
+
})
|
|
45
|
+
.expect(200)
|
|
46
|
+
const eventKey = response.get('X-Contember-Ref')
|
|
47
|
+
await tester(
|
|
48
|
+
gql`
|
|
49
|
+
query {
|
|
50
|
+
listTag {
|
|
51
|
+
label
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
`,
|
|
55
|
+
)
|
|
56
|
+
.set('X-Contember-Ref', eventKey)
|
|
57
|
+
.expect(304)
|
|
58
|
+
|
|
59
|
+
// ignored for mutation
|
|
60
|
+
await tester(
|
|
61
|
+
gql`
|
|
62
|
+
mutation {
|
|
63
|
+
createTag(data: { label: "typescript" }) {
|
|
64
|
+
ok
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
`,
|
|
68
|
+
)
|
|
69
|
+
.set('X-Contember-Ref', eventKey)
|
|
70
|
+
.expect(200)
|
|
71
|
+
})
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { executeGraphql, gql, loginToken } from './tester'
|
|
2
|
+
import { assert } from 'vitest'
|
|
3
|
+
import { Acl } from '@contember/schema'
|
|
4
|
+
|
|
5
|
+
export const signIn = async (email: string, password = '123456'): Promise<string> => {
|
|
6
|
+
const response = await executeGraphql(
|
|
7
|
+
'/tenant',
|
|
8
|
+
gql`
|
|
9
|
+
mutation ($email: String!, $password: String!) {
|
|
10
|
+
signIn(email: $email, password: $password) {
|
|
11
|
+
ok
|
|
12
|
+
result {
|
|
13
|
+
token
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
`,
|
|
18
|
+
{
|
|
19
|
+
variables: { email, password },
|
|
20
|
+
authorizationToken: loginToken,
|
|
21
|
+
},
|
|
22
|
+
).expect(200)
|
|
23
|
+
|
|
24
|
+
return response.body.data.signIn.result.token
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
export const signUp = async (email: string, password = '123456') => {
|
|
29
|
+
const signUpResponse = await executeGraphql(
|
|
30
|
+
'/tenant',
|
|
31
|
+
gql`
|
|
32
|
+
mutation($email: String!, $password: String!) {
|
|
33
|
+
signUp(email: $email, password: $password) {
|
|
34
|
+
ok
|
|
35
|
+
result {
|
|
36
|
+
person {
|
|
37
|
+
identity {
|
|
38
|
+
id
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
`,
|
|
45
|
+
{
|
|
46
|
+
variables: { email, password },
|
|
47
|
+
},
|
|
48
|
+
).expect(200)
|
|
49
|
+
|
|
50
|
+
return signUpResponse.body.data.signUp.result.person.identity.id
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
export const addProjectMember = async (identityId: string, projectSlug: string, membership: Acl.Membership = { role: 'admin', variables: [] }) => {
|
|
55
|
+
await executeGraphql(
|
|
56
|
+
'/tenant',
|
|
57
|
+
gql`
|
|
58
|
+
mutation ($identity: String!, $projectSlug: String!, $membership: MembershipInput!) {
|
|
59
|
+
addProjectMember(identityId: $identity, projectSlug: $projectSlug, memberships: [$membership]) {
|
|
60
|
+
ok
|
|
61
|
+
error {
|
|
62
|
+
code
|
|
63
|
+
developerMessage
|
|
64
|
+
membershipValidation {
|
|
65
|
+
code
|
|
66
|
+
role
|
|
67
|
+
variable
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
`,
|
|
73
|
+
{
|
|
74
|
+
variables: { identity: identityId, projectSlug, membership },
|
|
75
|
+
},
|
|
76
|
+
)
|
|
77
|
+
.expect(200)
|
|
78
|
+
.expect(response => {
|
|
79
|
+
assert.deepStrictEqual(response.body.data, { addProjectMember: { ok: true, error: null } })
|
|
80
|
+
})
|
|
81
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import nodeAssert from 'assert'
|
|
2
|
+
import supertest from 'supertest'
|
|
3
|
+
import { Schema } from '@contember/schema'
|
|
4
|
+
import {
|
|
5
|
+
Migration,
|
|
6
|
+
MigrationVersionHelper,
|
|
7
|
+
ModificationHandlerFactory,
|
|
8
|
+
SchemaDiffer,
|
|
9
|
+
SchemaMigrator, VERSION_LATEST,
|
|
10
|
+
} from '@contember/schema-migrations'
|
|
11
|
+
import { emptySchema } from '@contember/schema-utils'
|
|
12
|
+
import { assert } from 'vitest'
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
export const rootToken = String(process.env.CONTEMBER_ROOT_TOKEN)
|
|
16
|
+
export const loginToken = String(process.env.CONTEMBER_LOGIN_TOKEN)
|
|
17
|
+
export const apiUrl = String(process.env.CONTEMBER_API_URL)
|
|
18
|
+
|
|
19
|
+
// Used to allow prettier formatting of GraphQL queries
|
|
20
|
+
export const gql = (strings: TemplateStringsArray) => {
|
|
21
|
+
nodeAssert.strictEqual(strings.length, 1)
|
|
22
|
+
return strings[0]
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
export const executeGraphql = (
|
|
27
|
+
path: string,
|
|
28
|
+
query: string,
|
|
29
|
+
options: { authorizationToken?: string; variables?: Record<string, any> },
|
|
30
|
+
) => {
|
|
31
|
+
return supertest(apiUrl)
|
|
32
|
+
.post(path)
|
|
33
|
+
.set('Authorization', 'Bearer ' + (options.authorizationToken || rootToken))
|
|
34
|
+
.send({
|
|
35
|
+
query,
|
|
36
|
+
variables: options.variables || {},
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
const createMigrations = (schema: Schema) => {
|
|
42
|
+
const modificationHandlerFactory = new ModificationHandlerFactory(ModificationHandlerFactory.defaultFactoryMap)
|
|
43
|
+
const differ = new SchemaDiffer(new SchemaMigrator(modificationHandlerFactory))
|
|
44
|
+
return differ.diffSchemas(emptySchema, schema)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const createProject = async (slug: string) => {
|
|
48
|
+
await executeGraphql(
|
|
49
|
+
'/tenant',
|
|
50
|
+
gql`
|
|
51
|
+
mutation($projectSlug: String!, $config: Json!) {
|
|
52
|
+
createProject(projectSlug: $projectSlug, config: $config) {
|
|
53
|
+
ok
|
|
54
|
+
error { code }
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
`,
|
|
58
|
+
{
|
|
59
|
+
variables: {
|
|
60
|
+
projectSlug: slug,
|
|
61
|
+
config: {},
|
|
62
|
+
},
|
|
63
|
+
})
|
|
64
|
+
.expect(response => {
|
|
65
|
+
assert.isOk(response.body)
|
|
66
|
+
assert.isOk(response.body.data)
|
|
67
|
+
assert.isOk(response.body.data.createProject)
|
|
68
|
+
assert.isOk(response.body.data.createProject.ok)
|
|
69
|
+
})
|
|
70
|
+
.expect(200)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const executeMigrations = async (projectSlug: string, modifications: Migration.Modification[]) => {
|
|
74
|
+
const [version, fullName] = MigrationVersionHelper.createVersion('test')
|
|
75
|
+
await executeGraphql(
|
|
76
|
+
'/system/' + projectSlug,
|
|
77
|
+
gql`
|
|
78
|
+
mutation($migrations: [Migration!]!) {
|
|
79
|
+
migrate(migrations: $migrations) {
|
|
80
|
+
ok
|
|
81
|
+
error { code }
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
`,
|
|
85
|
+
{
|
|
86
|
+
variables: {
|
|
87
|
+
migrations: [{
|
|
88
|
+
formatVersion: VERSION_LATEST,
|
|
89
|
+
modifications,
|
|
90
|
+
version,
|
|
91
|
+
name: fullName,
|
|
92
|
+
}],
|
|
93
|
+
},
|
|
94
|
+
})
|
|
95
|
+
.expect(response => {
|
|
96
|
+
assert.deepStrictEqual(response.body.data, {
|
|
97
|
+
migrate: {
|
|
98
|
+
error: null,
|
|
99
|
+
ok: true,
|
|
100
|
+
},
|
|
101
|
+
})
|
|
102
|
+
})
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export const createTester = async (schema: Schema) => {
|
|
106
|
+
const projectSlug = 'test_' + Date.now()
|
|
107
|
+
await createProject(projectSlug)
|
|
108
|
+
const migrations = createMigrations(schema)
|
|
109
|
+
await executeMigrations(projectSlug, migrations)
|
|
110
|
+
|
|
111
|
+
const queryCb = (
|
|
112
|
+
query: string,
|
|
113
|
+
options: { path?: string; authorizationToken?: string; variables?: Record<string, any> } = {}) => {
|
|
114
|
+
return executeGraphql(options.path ?? '/content/' + projectSlug + '/live', query, options)
|
|
115
|
+
}
|
|
116
|
+
queryCb.projectSlug = projectSlug
|
|
117
|
+
return queryCb
|
|
118
|
+
}
|
package/alpine.dockerfile
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
FROM node:14-alpine as builder
|
|
2
|
-
|
|
3
|
-
WORKDIR /src
|
|
4
|
-
RUN apk --no-cache add bash
|
|
5
|
-
RUN apk --no-cache add build-base python3
|
|
6
|
-
COPY ./ ./
|
|
7
|
-
|
|
8
|
-
RUN test ! -f yarn.tar.gz || tar xf yarn.tar.gz -C "$(yarn cache dir)" .
|
|
9
|
-
RUN /src/packages/engine-server/build.sh
|
|
10
|
-
|
|
11
|
-
FROM node:14-alpine
|
|
12
|
-
|
|
13
|
-
WORKDIR /src
|
|
14
|
-
RUN apk --no-cache add curl
|
|
15
|
-
|
|
16
|
-
COPY --from=builder /src/server/server.js /src/
|
|
17
|
-
COPY --from=builder /src/server/node_modules /src/node_modules
|
|
18
|
-
COPY --from=builder /src/packages/engine-system-api/src/migrations /src/system-migrations
|
|
19
|
-
COPY --from=builder /src/packages/engine-tenant-api/src/migrations /src/tenant-migrations
|
|
20
|
-
COPY --from=builder /src/packages/engine-server/package.json /src/package.json
|
|
21
|
-
COPY --from=builder /src/license.md /src/
|
|
22
|
-
|
|
23
|
-
ENV NODE_ENV "production"
|
|
24
|
-
ENV CONTEMBER_PORT 4000
|
|
25
|
-
ENV CONTEMBER_MONITORING_PORT 4001
|
|
26
|
-
ENV CONTEMBER_TENANT_MIGRATIONS_DIR /src/tenant-migrations
|
|
27
|
-
ENV CONTEMBER_SYSTEM_MIGRATIONS_DIR /src/system-migrations
|
|
28
|
-
ENV CONTEMBER_PACKAGE_JSON /src/package.json
|
|
29
|
-
|
|
30
|
-
CMD ["node", "./server.js"]
|
package/debian.dockerfile
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
FROM node:14 as builder
|
|
2
|
-
|
|
3
|
-
WORKDIR /src
|
|
4
|
-
COPY ./ ./
|
|
5
|
-
|
|
6
|
-
RUN test ! -f yarn.tar.gz || tar xf yarn.tar.gz -C "$(yarn cache dir)" .
|
|
7
|
-
RUN /src/packages/engine-server/build.sh
|
|
8
|
-
|
|
9
|
-
FROM node:14
|
|
10
|
-
|
|
11
|
-
WORKDIR /src
|
|
12
|
-
|
|
13
|
-
COPY --from=builder /src/server/server.js /src/
|
|
14
|
-
COPY --from=builder /src/server/node_modules /src/node_modules
|
|
15
|
-
COPY --from=builder /src/packages/engine-system-api/src/migrations /src/system-migrations
|
|
16
|
-
COPY --from=builder /src/packages/engine-tenant-api/src/migrations /src/tenant-migrations
|
|
17
|
-
COPY --from=builder /src/packages/engine-server/package.json /src/package.json
|
|
18
|
-
COPY --from=builder /src/license.md /src/
|
|
19
|
-
|
|
20
|
-
ENV NODE_ENV "production"
|
|
21
|
-
ENV CONTEMBER_PORT 4000
|
|
22
|
-
ENV CONTEMBER_MONITORING_PORT 4001
|
|
23
|
-
ENV CONTEMBER_TENANT_MIGRATIONS_DIR /src/tenant-migrations
|
|
24
|
-
ENV CONTEMBER_SYSTEM_MIGRATIONS_DIR /src/system-migrations
|
|
25
|
-
ENV CONTEMBER_PACKAGE_JSON /src/package.json
|
|
26
|
-
|
|
27
|
-
CMD ["node", "./server.js"]
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { KoaMiddleware, ModuleInfoMiddlewareState, ProjectInfoMiddlewareState } from '@contember/engine-http';
|
|
2
|
-
import prom from 'prom-client';
|
|
3
|
-
import { GraphQLKoaState } from '@contember/engine-http';
|
|
4
|
-
export declare const createColllectHttpMetricsMiddleware: (registry: prom.Registry) => KoaMiddleware<Partial<ProjectInfoMiddlewareState & ModuleInfoMiddlewareState & GraphQLKoaState>>;
|
|
5
|
-
//# sourceMappingURL=CollectHttpMetricsMiddelware.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CollectHttpMetricsMiddelware.d.ts","sourceRoot":"","sources":["../../../src/http/CollectHttpMetricsMiddelware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAA;AAC7G,OAAO,IAAI,MAAM,aAAa,CAAA;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,eAAO,MAAM,mCAAmC,aACrC,KAAK,QAAQ,KACrB,cAAc,QAAQ,0BAA0B,GAAG,yBAAyB,GAAG,eAAe,CAAC,CAyBjG,CAAA"}
|
|
@@ -1,36 +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
|
-
exports.createColllectHttpMetricsMiddleware = void 0;
|
|
7
|
-
const prom_client_1 = __importDefault(require("prom-client"));
|
|
8
|
-
const createColllectHttpMetricsMiddleware = (registry) => {
|
|
9
|
-
const requestSummary = new prom_client_1.default.Histogram({
|
|
10
|
-
name: 'contember_http_duration_seconds',
|
|
11
|
-
help: 'Incoming HTTP requests statistics by http_method (OPTIONS requests are ignored), http_code, contember_project (or "unknown" for undefined project), contember_project_group (or "unknown" for undefined project group), contember_module (system, tenant, content, unknown) and graphql_operation (query, mutation, unknown)',
|
|
12
|
-
registers: [registry],
|
|
13
|
-
labelNames: ['http_method', 'http_code', 'contember_project', 'contember_project_group', 'contember_module', 'graphql_operation'],
|
|
14
|
-
buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10],
|
|
15
|
-
});
|
|
16
|
-
return async (ctx, next) => {
|
|
17
|
-
var _a;
|
|
18
|
-
const end = ctx.method === 'OPTIONS' ? () => null : requestSummary.startTimer();
|
|
19
|
-
try {
|
|
20
|
-
await next();
|
|
21
|
-
}
|
|
22
|
-
finally {
|
|
23
|
-
const labels = {
|
|
24
|
-
http_method: ctx.method,
|
|
25
|
-
http_code: ctx.status,
|
|
26
|
-
contember_project: ctx.state.project || 'unknown',
|
|
27
|
-
contember_project_group: ctx.state.projectGroup || 'unknown',
|
|
28
|
-
contember_module: ctx.state.module || 'unknown',
|
|
29
|
-
graphql_operation: ((_a = ctx.state.graphql) === null || _a === void 0 ? void 0 : _a.operationName) || 'unknown',
|
|
30
|
-
};
|
|
31
|
-
end(labels);
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
};
|
|
35
|
-
exports.createColllectHttpMetricsMiddleware = createColllectHttpMetricsMiddleware;
|
|
36
|
-
//# sourceMappingURL=CollectHttpMetricsMiddelware.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CollectHttpMetricsMiddelware.js","sourceRoot":"","sources":["../../../src/http/CollectHttpMetricsMiddelware.ts"],"names":[],"mappings":";;;;;;AACA,8DAA8B;AAGvB,MAAM,mCAAmC,GAAG,CAClD,QAAuB,EAC4E,EAAE;IACrG,MAAM,cAAc,GAAG,IAAI,qBAAI,CAAC,SAAS,CAAC;QACzC,IAAI,EAAE,iCAAiC;QACvC,IAAI,EAAE,8TAA8T;QACpU,SAAS,EAAE,CAAC,QAAQ,CAAC;QACrB,UAAU,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,mBAAmB,CAAC;QACjI,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;KAClE,CAAC,CAAA;IAEF,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;;QAC1B,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;QAC/E,IAAI;YACH,MAAM,IAAI,EAAE,CAAA;SACZ;gBAAS;YACT,MAAM,MAAM,GAAG;gBACd,WAAW,EAAE,GAAG,CAAC,MAAM;gBACvB,SAAS,EAAE,GAAG,CAAC,MAAM;gBACrB,iBAAiB,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,SAAS;gBACjD,uBAAuB,EAAE,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,SAAS;gBAC5D,gBAAgB,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,SAAS;gBAC/C,iBAAiB,EAAE,CAAA,MAAA,GAAG,CAAC,KAAK,CAAC,OAAO,0CAAE,aAAa,KAAI,SAAS;aAChE,CAAA;YACD,GAAG,CAAC,MAAM,CAAC,CAAA;SACX;IACF,CAAC,CAAA;AACF,CAAC,CAAA;AA3BY,QAAA,mCAAmC,uCA2B/C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ShowMetricsMiddleware.d.ts","sourceRoot":"","sources":["../../../src/http/ShowMetricsMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAS,MAAM,wBAAwB,CAAA;AAC7D,OAAO,IAAI,MAAM,aAAa,CAAA;AAE9B,eAAO,MAAM,2BAA2B,aAAc,KAAK,QAAQ,KAAG,cAAc,GAAG,CAQtF,CAAA"}
|
|
@@ -1,20 +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
|
-
exports.createShowMetricsMiddleware = void 0;
|
|
7
|
-
const engine_http_1 = require("@contember/engine-http");
|
|
8
|
-
const prom_client_1 = __importDefault(require("prom-client"));
|
|
9
|
-
const createShowMetricsMiddleware = (registry) => {
|
|
10
|
-
return (0, engine_http_1.route)('/metrics', async (ctx) => {
|
|
11
|
-
if (registry instanceof prom_client_1.default.AggregatorRegistry) {
|
|
12
|
-
ctx.body = await registry.clusterMetrics();
|
|
13
|
-
}
|
|
14
|
-
else {
|
|
15
|
-
ctx.body = registry.metrics();
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
};
|
|
19
|
-
exports.createShowMetricsMiddleware = createShowMetricsMiddleware;
|
|
20
|
-
//# sourceMappingURL=ShowMetricsMiddleware.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ShowMetricsMiddleware.js","sourceRoot":"","sources":["../../../src/http/ShowMetricsMiddleware.ts"],"names":[],"mappings":";;;;;;AAAA,wDAA6D;AAC7D,8DAA8B;AAEvB,MAAM,2BAA2B,GAAG,CAAC,QAAuB,EAAsB,EAAE;IAC1F,OAAO,IAAA,mBAAK,EAAC,UAAU,EAAE,KAAK,EAAC,GAAG,EAAC,EAAE;QACpC,IAAI,QAAQ,YAAY,qBAAI,CAAC,kBAAkB,EAAE;YAChD,GAAG,CAAC,IAAI,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,CAAA;SAC1C;aAAM;YACN,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAA;SAC7B;IACF,CAAC,CAAC,CAAA;AACH,CAAC,CAAA;AARY,QAAA,2BAA2B,+BAQvC"}
|
package/dist/src/http/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/http/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAA;AAC9C,cAAc,yBAAyB,CAAA"}
|
package/dist/src/http/index.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./CollectHttpMetricsMiddelware"), exports);
|
|
18
|
-
__exportStar(require("./ShowMetricsMiddleware"), exports);
|
|
19
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/http/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAA8C;AAC9C,0DAAuC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { TenantConfigResolver } from '../config/tenantConfigResolver';
|
|
2
|
-
import { ProjectGroupContainer, ProjectGroupContainerResolver as ProjectGroupContainerResolverInterface } from '@contember/engine-http';
|
|
3
|
-
import { ProjectGroupContainerFactory } from './ProjectGroupContainer';
|
|
4
|
-
export declare class ProjectGroupContainerResolver implements ProjectGroupContainerResolverInterface {
|
|
5
|
-
private readonly configResolver;
|
|
6
|
-
private readonly containerFactory;
|
|
7
|
-
private containers;
|
|
8
|
-
readonly onCreate: ((container: ProjectGroupContainer, slug: string | undefined) => void | (() => void))[];
|
|
9
|
-
constructor(configResolver: TenantConfigResolver, containerFactory: ProjectGroupContainerFactory);
|
|
10
|
-
getProjectGroupContainer(slug: string | undefined, config?: any): Promise<ProjectGroupContainer>;
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=ProjectGroupContainerResolver.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectGroupContainerResolver.d.ts","sourceRoot":"","sources":["../../../src/projectGroup/ProjectGroupContainerResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrE,OAAO,EACN,qBAAqB,EACrB,6BAA6B,IAAI,sCAAsC,EACvE,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAA;AAUtE,qBAAa,6BAA8B,YAAW,sCAAsC;IAM1F,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IANlC,OAAO,CAAC,UAAU,CAA0D;IAE5E,SAAgB,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,qBAAqB,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAK;gBAGpG,cAAc,EAAE,oBAAoB,EACpC,gBAAgB,EAAE,4BAA4B;IAGnD,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,GAAE,GAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAqBjH"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ProjectGroupContainerResolver = void 0;
|
|
4
|
-
const engine_common_1 = require("@contember/engine-common");
|
|
5
|
-
const util_1 = require("util");
|
|
6
|
-
class ProjectGroupContainerResolver {
|
|
7
|
-
constructor(configResolver, containerFactory) {
|
|
8
|
-
this.configResolver = configResolver;
|
|
9
|
-
this.containerFactory = containerFactory;
|
|
10
|
-
this.containers = new engine_common_1.PromiseMap();
|
|
11
|
-
this.onCreate = [];
|
|
12
|
-
}
|
|
13
|
-
async getProjectGroupContainer(slug, config = {}) {
|
|
14
|
-
const existing = this.containers.get(slug);
|
|
15
|
-
if (existing) {
|
|
16
|
-
const existingAwaited = await existing;
|
|
17
|
-
if ((0, util_1.isDeepStrictEqual)(config, existingAwaited.inputConfig)) {
|
|
18
|
-
return existingAwaited.container;
|
|
19
|
-
}
|
|
20
|
-
existingAwaited.cleanups.forEach(it => it());
|
|
21
|
-
this.containers.delete(slug);
|
|
22
|
-
}
|
|
23
|
-
return (await this.containers.fetch(slug, async (slug) => {
|
|
24
|
-
const container = this.containerFactory.create({
|
|
25
|
-
config: this.configResolver(slug, config),
|
|
26
|
-
slug,
|
|
27
|
-
});
|
|
28
|
-
const cleanups = this.onCreate.map(it => it(container, slug) || (() => null));
|
|
29
|
-
// eslint-disable-next-line no-console
|
|
30
|
-
await container.tenantContainer.migrationsRunner.run(console.log);
|
|
31
|
-
return { container, inputConfig: config, cleanups };
|
|
32
|
-
})).container;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
exports.ProjectGroupContainerResolver = ProjectGroupContainerResolver;
|
|
36
|
-
//# sourceMappingURL=ProjectGroupContainerResolver.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectGroupContainerResolver.js","sourceRoot":"","sources":["../../../src/projectGroup/ProjectGroupContainerResolver.ts"],"names":[],"mappings":";;;AAMA,4DAAqD;AACrD,+BAAwC;AAQxC,MAAa,6BAA6B;IAKzC,YACkB,cAAoC,EACpC,gBAA8C;QAD9C,mBAAc,GAAd,cAAc,CAAsB;QACpC,qBAAgB,GAAhB,gBAAgB,CAA8B;QANxD,eAAU,GAAG,IAAI,0BAAU,EAAyC,CAAA;QAE5D,aAAQ,GAA4F,EAAE,CAAA;IAKnH,CAAC;IAEG,KAAK,CAAC,wBAAwB,CAAC,IAAwB,EAAE,SAAc,EAAE;QAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC1C,IAAI,QAAQ,EAAE;YACb,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAA;YACtC,IAAI,IAAA,wBAAiB,EAAC,MAAM,EAAE,eAAe,CAAC,WAAW,CAAC,EAAE;gBAC3D,OAAO,eAAe,CAAC,SAAS,CAAA;aAChC;YACD,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;YAC5C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;SAC5B;QACD,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAC,IAAI,EAAC,EAAE;YACtD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;gBAC9C,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC;gBACzC,IAAI;aACJ,CAAC,CAAA;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;YAC7E,sCAAsC;YACtC,MAAM,SAAS,CAAC,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACjE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;QACpD,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACd,CAAC;CACD;AA/BD,sEA+BC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export declare const getClusterProcessType: (isClusterMode: boolean) => ProcessType;
|
|
2
|
-
export declare enum ProcessType {
|
|
3
|
-
singleNode = 0,
|
|
4
|
-
clusterMaster = 1,
|
|
5
|
-
clusterWorker = 2
|
|
6
|
-
}
|
|
7
|
-
export declare const waitForWorker: (timeoutMs: number) => Promise<unknown>;
|
|
8
|
-
export declare const notifyWorkerStarted: () => boolean | undefined;
|
|
9
|
-
//# sourceMappingURL=cluster.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cluster.d.ts","sourceRoot":"","sources":["../../../src/utils/cluster.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,qBAAqB,kBAAmB,OAAO,gBACuD,CAAA;AAEnH,oBAAY,WAAW;IACtB,UAAU,IAAA;IACV,aAAa,IAAA;IACb,aAAa,IAAA;CACb;AAID,eAAO,MAAM,aAAa,cAAe,MAAM,qBAoB9C,CAAA;AAED,eAAO,MAAM,mBAAmB,2BAG7B,CAAA"}
|
|
@@ -1,47 +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
|
-
exports.notifyWorkerStarted = exports.waitForWorker = exports.ProcessType = exports.getClusterProcessType = void 0;
|
|
7
|
-
const cluster_1 = __importDefault(require("cluster"));
|
|
8
|
-
const timeout_1 = require("./timeout");
|
|
9
|
-
const getClusterProcessType = (isClusterMode) => !isClusterMode ? ProcessType.singleNode : cluster_1.default.isMaster ? ProcessType.clusterMaster : ProcessType.clusterWorker;
|
|
10
|
-
exports.getClusterProcessType = getClusterProcessType;
|
|
11
|
-
var ProcessType;
|
|
12
|
-
(function (ProcessType) {
|
|
13
|
-
ProcessType[ProcessType["singleNode"] = 0] = "singleNode";
|
|
14
|
-
ProcessType[ProcessType["clusterMaster"] = 1] = "clusterMaster";
|
|
15
|
-
ProcessType[ProcessType["clusterWorker"] = 2] = "clusterWorker";
|
|
16
|
-
})(ProcessType = exports.ProcessType || (exports.ProcessType = {}));
|
|
17
|
-
const MSG_WORKER_STARTED = 'msg_worker_started';
|
|
18
|
-
const waitForWorker = (timeoutMs) => {
|
|
19
|
-
let ok = false;
|
|
20
|
-
return Promise.race([
|
|
21
|
-
new Promise(async (resolve) => {
|
|
22
|
-
const listener = ({}, message) => {
|
|
23
|
-
if ('type' in message && message.type === MSG_WORKER_STARTED) {
|
|
24
|
-
ok = true;
|
|
25
|
-
resolve(null);
|
|
26
|
-
cluster_1.default.removeListener('message', listener);
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
await cluster_1.default.on('message', listener);
|
|
30
|
-
}),
|
|
31
|
-
(0, timeout_1.timeout)(timeoutMs).then(() => {
|
|
32
|
-
if (!ok) {
|
|
33
|
-
throw new Error('Worker start timed out');
|
|
34
|
-
}
|
|
35
|
-
return true;
|
|
36
|
-
}),
|
|
37
|
-
]);
|
|
38
|
-
};
|
|
39
|
-
exports.waitForWorker = waitForWorker;
|
|
40
|
-
const notifyWorkerStarted = () => {
|
|
41
|
-
var _a;
|
|
42
|
-
return (_a = process.send) === null || _a === void 0 ? void 0 : _a.call(process, {
|
|
43
|
-
type: MSG_WORKER_STARTED,
|
|
44
|
-
});
|
|
45
|
-
};
|
|
46
|
-
exports.notifyWorkerStarted = notifyWorkerStarted;
|
|
47
|
-
//# sourceMappingURL=cluster.js.map
|