@contember/engine-server 1.1.0-rc.1 → 1.2.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.
Files changed (163) hide show
  1. package/dist/src/MasterContainer.d.ts +12 -25
  2. package/dist/src/MasterContainer.d.ts.map +1 -1
  3. package/dist/src/MasterContainer.js +36 -80
  4. package/dist/src/MasterContainer.js.map +1 -1
  5. package/dist/src/bootstrap/Initializer.d.ts +3 -3
  6. package/dist/src/bootstrap/Initializer.d.ts.map +1 -1
  7. package/dist/src/bootstrap/Initializer.js +15 -6
  8. package/dist/src/bootstrap/Initializer.js.map +1 -1
  9. package/dist/src/config/config.d.ts +5 -4
  10. package/dist/src/config/config.d.ts.map +1 -1
  11. package/dist/src/config/config.js +2 -2
  12. package/dist/src/config/config.js.map +1 -1
  13. package/dist/src/config/configSchema.d.ts +45 -11
  14. package/dist/src/config/configSchema.d.ts.map +1 -1
  15. package/dist/src/config/configSchema.js +20 -18
  16. package/dist/src/config/configSchema.js.map +1 -1
  17. package/dist/src/config/configTemplate.d.ts.map +1 -1
  18. package/dist/src/config/configTemplate.js +23 -0
  19. package/dist/src/config/configTemplate.js.map +1 -1
  20. package/dist/src/index.d.ts +9 -3
  21. package/dist/src/index.d.ts.map +1 -1
  22. package/dist/src/index.js +23 -4
  23. package/dist/src/index.js.map +1 -1
  24. package/dist/src/project/ProjectContainer.js +1 -1
  25. package/dist/src/project/ProjectContainer.js.map +1 -1
  26. package/dist/src/project/ProjectContainerResolver.d.ts +6 -3
  27. package/dist/src/project/ProjectContainerResolver.d.ts.map +1 -1
  28. package/dist/src/project/ProjectContainerResolver.js +4 -16
  29. package/dist/src/project/ProjectContainerResolver.js.map +1 -1
  30. package/dist/src/projectGroup/ProjectGroupContainer.d.ts +2 -1
  31. package/dist/src/projectGroup/ProjectGroupContainer.d.ts.map +1 -1
  32. package/dist/src/projectGroup/ProjectGroupContainer.js +8 -4
  33. package/dist/src/projectGroup/ProjectGroupContainer.js.map +1 -1
  34. package/dist/src/projectGroup/ProjectGroupResolver.d.ts +7 -0
  35. package/dist/src/projectGroup/ProjectGroupResolver.d.ts.map +1 -0
  36. package/dist/src/projectGroup/ProjectGroupResolver.js +13 -0
  37. package/dist/src/projectGroup/ProjectGroupResolver.js.map +1 -0
  38. package/dist/src/start.js +15 -112
  39. package/dist/src/start.js.map +1 -1
  40. package/dist/src/tsconfig.tsbuildinfo +1 -1
  41. package/dist/src/utils/index.d.ts +0 -4
  42. package/dist/src/utils/index.d.ts.map +1 -1
  43. package/dist/src/utils/index.js +0 -4
  44. package/dist/src/utils/index.js.map +1 -1
  45. package/dist/src/utils/serverStartup.d.ts +31 -0
  46. package/dist/src/utils/serverStartup.d.ts.map +1 -0
  47. package/dist/src/utils/serverStartup.js +42 -0
  48. package/dist/src/utils/serverStartup.js.map +1 -0
  49. package/dist/src/utils/serverTermination.d.ts +12 -0
  50. package/dist/src/utils/serverTermination.d.ts.map +1 -0
  51. package/dist/src/utils/serverTermination.js +26 -0
  52. package/dist/src/utils/serverTermination.js.map +1 -0
  53. package/dist/tests/e2e/acl-condition-variable.test.d.ts +2 -0
  54. package/dist/tests/e2e/acl-condition-variable.test.d.ts.map +1 -0
  55. package/dist/tests/e2e/acl-condition-variable.test.js +77 -0
  56. package/dist/tests/e2e/acl-condition-variable.test.js.map +1 -0
  57. package/dist/tests/e2e/assume-membership.test.d.ts +2 -0
  58. package/dist/tests/e2e/assume-membership.test.d.ts.map +1 -0
  59. package/dist/tests/e2e/assume-membership.test.js +58 -0
  60. package/dist/tests/e2e/assume-membership.test.js.map +1 -0
  61. package/dist/tests/e2e/content-api-basic.test.d.ts +2 -0
  62. package/dist/tests/e2e/content-api-basic.test.d.ts.map +1 -0
  63. package/dist/tests/e2e/content-api-basic.test.js +50 -0
  64. package/dist/tests/e2e/content-api-basic.test.js.map +1 -0
  65. package/dist/tests/e2e/content-invalid-schema.test.d.ts +2 -0
  66. package/dist/tests/e2e/content-invalid-schema.test.d.ts.map +1 -0
  67. package/dist/tests/e2e/content-invalid-schema.test.js +29 -0
  68. package/dist/tests/e2e/content-invalid-schema.test.js.map +1 -0
  69. package/dist/tests/e2e/homepage.test.d.ts +2 -0
  70. package/dist/tests/e2e/homepage.test.d.ts.map +1 -0
  71. package/dist/tests/e2e/homepage.test.js +15 -0
  72. package/dist/tests/e2e/homepage.test.js.map +1 -0
  73. package/dist/tests/e2e/tenant-member-access.test.d.ts +2 -0
  74. package/dist/tests/e2e/tenant-member-access.test.d.ts.map +1 -0
  75. package/dist/tests/e2e/tenant-member-access.test.js +43 -0
  76. package/dist/tests/e2e/tenant-member-access.test.js.map +1 -0
  77. package/dist/tests/e2e/x-contember-ref.test.d.ts +2 -0
  78. package/dist/tests/e2e/x-contember-ref.test.d.ts.map +1 -0
  79. package/dist/tests/e2e/x-contember-ref.test.js +63 -0
  80. package/dist/tests/e2e/x-contember-ref.test.js.map +1 -0
  81. package/dist/tests/src/requests.d.ts +5 -0
  82. package/dist/tests/src/requests.d.ts.map +1 -0
  83. package/dist/tests/src/requests.js +59 -0
  84. package/dist/tests/src/requests.js.map +1 -0
  85. package/dist/tests/src/tester.d.ts +19 -0
  86. package/dist/tests/src/tester.d.ts.map +1 -0
  87. package/dist/tests/src/tester.js +99 -0
  88. package/dist/tests/src/tester.js.map +1 -0
  89. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  90. package/esbuild.js +7 -14
  91. package/package.json +20 -20
  92. package/src/MasterContainer.ts +58 -110
  93. package/src/bootstrap/Initializer.ts +16 -6
  94. package/src/config/config.ts +7 -5
  95. package/src/config/configSchema.ts +30 -33
  96. package/src/config/configTemplate.ts +23 -0
  97. package/src/index.ts +15 -2
  98. package/src/project/ProjectContainer.ts +1 -1
  99. package/src/project/ProjectContainerResolver.ts +4 -17
  100. package/src/projectGroup/ProjectGroupContainer.ts +12 -3
  101. package/src/projectGroup/ProjectGroupResolver.ts +12 -0
  102. package/src/start.ts +18 -127
  103. package/src/utils/index.ts +0 -4
  104. package/src/utils/serverStartup.ts +42 -0
  105. package/src/utils/serverTermination.ts +20 -0
  106. package/tests/e2e/acl-condition-variable.test.ts +74 -0
  107. package/tests/e2e/assume-membership.test.ts +64 -0
  108. package/tests/e2e/content-api-basic.test.ts +51 -0
  109. package/tests/e2e/content-invalid-schema.test.ts +31 -0
  110. package/tests/e2e/homepage.test.ts +10 -0
  111. package/tests/e2e/tenant-member-access.test.ts +51 -0
  112. package/tests/e2e/x-contember-ref.test.ts +71 -0
  113. package/tests/src/requests.ts +72 -0
  114. package/tests/src/tester.ts +118 -0
  115. package/alpine.dockerfile +0 -30
  116. package/debian.dockerfile +0 -27
  117. package/dist/src/http/CollectHttpMetricsMiddelware.d.ts +0 -5
  118. package/dist/src/http/CollectHttpMetricsMiddelware.d.ts.map +0 -1
  119. package/dist/src/http/CollectHttpMetricsMiddelware.js +0 -36
  120. package/dist/src/http/CollectHttpMetricsMiddelware.js.map +0 -1
  121. package/dist/src/http/ShowMetricsMiddleware.d.ts +0 -4
  122. package/dist/src/http/ShowMetricsMiddleware.d.ts.map +0 -1
  123. package/dist/src/http/ShowMetricsMiddleware.js +0 -20
  124. package/dist/src/http/ShowMetricsMiddleware.js.map +0 -1
  125. package/dist/src/http/index.d.ts +0 -3
  126. package/dist/src/http/index.d.ts.map +0 -1
  127. package/dist/src/http/index.js +0 -19
  128. package/dist/src/http/index.js.map +0 -1
  129. package/dist/src/projectGroup/ProjectGroupContainerResolver.d.ts +0 -12
  130. package/dist/src/projectGroup/ProjectGroupContainerResolver.d.ts.map +0 -1
  131. package/dist/src/projectGroup/ProjectGroupContainerResolver.js +0 -36
  132. package/dist/src/projectGroup/ProjectGroupContainerResolver.js.map +0 -1
  133. package/dist/src/utils/cluster.d.ts +0 -9
  134. package/dist/src/utils/cluster.d.ts.map +0 -1
  135. package/dist/src/utils/cluster.js +0 -47
  136. package/dist/src/utils/cluster.js.map +0 -1
  137. package/dist/src/utils/dbMetrics.d.ts +0 -16
  138. package/dist/src/utils/dbMetrics.d.ts.map +0 -1
  139. package/dist/src/utils/dbMetrics.js +0 -98
  140. package/dist/src/utils/dbMetrics.js.map +0 -1
  141. package/dist/src/utils/timeout.d.ts +0 -2
  142. package/dist/src/utils/timeout.d.ts.map +0 -1
  143. package/dist/src/utils/timeout.js +0 -8
  144. package/dist/src/utils/timeout.js.map +0 -1
  145. package/dist/src/utils/tuple.d.ts +0 -2
  146. package/dist/src/utils/tuple.d.ts.map +0 -1
  147. package/dist/src/utils/tuple.js +0 -6
  148. package/dist/src/utils/tuple.js.map +0 -1
  149. package/dist/tests/e2e/http.test.d.ts +0 -2
  150. package/dist/tests/e2e/http.test.d.ts.map +0 -1
  151. package/dist/tests/e2e/http.test.js +0 -275
  152. package/dist/tests/e2e/http.test.js.map +0 -1
  153. package/jasmine.json +0 -7
  154. package/src/http/CollectHttpMetricsMiddelware.ts +0 -32
  155. package/src/http/ShowMetricsMiddleware.ts +0 -12
  156. package/src/http/index.ts +0 -2
  157. package/src/projectGroup/ProjectGroupContainerResolver.ts +0 -47
  158. package/src/utils/cluster.ts +0 -40
  159. package/src/utils/dbMetrics.ts +0 -111
  160. package/src/utils/timeout.ts +0 -4
  161. package/src/utils/tuple.ts +0 -1
  162. package/tests/e2e/http.test.ts +0 -303
  163. package/tslint.json +0 -14
@@ -0,0 +1,72 @@
1
+ import { executeGraphql, gql, loginToken } from './tester'
2
+ import { assert } from 'vitest'
3
+ import { Membership } from '@contember/engine-tenant-api'
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: 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
+ }
62
+ }
63
+ `,
64
+ {
65
+ variables: { identity: identityId, projectSlug, membership },
66
+ },
67
+ )
68
+ .expect(200)
69
+ .expect(response => {
70
+ assert.deepStrictEqual(response.body.data, { addProjectMember: { ok: true } })
71
+ })
72
+ }
@@ -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,4 +0,0 @@
1
- import { KoaMiddleware } from '@contember/engine-http';
2
- import prom from 'prom-client';
3
- export declare const createShowMetricsMiddleware: (registry: prom.Registry) => KoaMiddleware<any>;
4
- //# sourceMappingURL=ShowMetricsMiddleware.d.ts.map
@@ -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"}
@@ -1,3 +0,0 @@
1
- export * from './CollectHttpMetricsMiddelware';
2
- export * from './ShowMetricsMiddleware';
3
- //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"cluster.js","sourceRoot":"","sources":["../../../src/utils/cluster.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA6B;AAC7B,uCAAmC;AAE5B,MAAM,qBAAqB,GAAG,CAAC,aAAsB,EAAE,EAAE,CAC/D,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,aAAa,CAAA;AADtG,QAAA,qBAAqB,yBACiF;AAEnH,IAAY,WAIX;AAJD,WAAY,WAAW;IACtB,yDAAU,CAAA;IACV,+DAAa,CAAA;IACb,+DAAa,CAAA;AACd,CAAC,EAJW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAItB;AAED,MAAM,kBAAkB,GAAG,oBAAoB,CAAA;AAExC,MAAM,aAAa,GAAG,CAAC,SAAiB,EAAE,EAAE;IAClD,IAAI,EAAE,GAAG,KAAK,CAAA;IACd,OAAO,OAAO,CAAC,IAAI,CAAC;QACnB,IAAI,OAAO,CAAC,KAAK,EAAC,OAAO,EAAC,EAAE;YAC3B,MAAM,QAAQ,GAAG,CAAC,EAAE,EAAE,OAAY,EAAE,EAAE;gBACrC,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,EAAE;oBAC7D,EAAE,GAAG,IAAI,CAAA;oBACT,OAAO,CAAC,IAAI,CAAC,CAAA;oBACb,iBAAO,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;iBAC3C;YACF,CAAC,CAAA;YACD,MAAM,iBAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QACtC,CAAC,CAAC;QACF,IAAA,iBAAO,EAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,EAAE,EAAE;gBACR,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;aACzC;YACD,OAAO,IAAI,CAAA;QACZ,CAAC,CAAC;KACF,CAAC,CAAA;AACH,CAAC,CAAA;AApBY,QAAA,aAAa,iBAoBzB;AAEM,MAAM,mBAAmB,GAAG,GAAG,EAAE;;IACvC,OAAA,MAAA,OAAO,CAAC,IAAI,wDAAG;QACd,IAAI,EAAE,kBAAkB;KACxB,CAAC,CAAA;CAAA,CAAA;AAHU,QAAA,mBAAmB,uBAG7B"}
@@ -1,16 +0,0 @@
1
- import prom from 'prom-client';
2
- import { Connection } from '@contember/database';
3
- declare const labelNames: ("contember_project" | "contember_module" | "contember_project_group")[];
4
- declare type LabelNames = typeof labelNames[number];
5
- declare type Labels = {
6
- [K in LabelNames]: string;
7
- };
8
- declare type DatabaseMetricsEntry = {
9
- connection: Connection.PoolStatusProvider & Connection.Queryable;
10
- labels: Labels;
11
- };
12
- declare type Unregistrar = () => void;
13
- declare type DatabaseMetricsRegistrar = (entry: DatabaseMetricsEntry) => Unregistrar;
14
- export declare const createDbMetricsRegistrar: (registry: prom.Registry) => DatabaseMetricsRegistrar;
15
- export {};
16
- //# sourceMappingURL=dbMetrics.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dbMetrics.d.ts","sourceRoot":"","sources":["../../../src/utils/dbMetrics.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,aAAa,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAgB,MAAM,qBAAqB,CAAA;AAE9D,QAAA,MAAM,UAAU,0EAAkG,CAAA;AAClH,aAAK,UAAU,GAAG,OAAO,UAAU,CAAC,MAAM,CAAC,CAAA;AAC3C,aAAK,MAAM,GAAG;KAAG,CAAC,IAAI,UAAU,GAAG,MAAM;CAAE,CAAA;AAC3C,aAAK,oBAAoB,GAAG;IAC3B,UAAU,EAAE,UAAU,CAAC,kBAAkB,GAAG,UAAU,CAAC,SAAS,CAAA;IAChE,MAAM,EAAE,MAAM,CAAA;CACd,CAAA;AACD,aAAK,WAAW,GAAG,MAAM,IAAI,CAAA;AAC7B,aAAK,wBAAwB,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,WAAW,CAAA;AAE5E,eAAO,MAAM,wBAAwB,aAAc,KAAK,QAAQ,KAAG,wBAkBlE,CAAA"}
@@ -1,98 +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.createDbMetricsRegistrar = void 0;
7
- const prom_client_1 = __importDefault(require("prom-client"));
8
- const database_1 = require("@contember/database");
9
- const labelNames = ['contember_project', 'contember_module', 'contember_project_group'];
10
- const createDbMetricsRegistrar = (registry) => {
11
- const dbPoolCollectorInner = createSingleDbPoolMetricsCollector(registry);
12
- const entries = new Set();
13
- const collector = () => {
14
- for (const entry of entries) {
15
- dbPoolCollectorInner(entry.connection, entry.labels);
16
- }
17
- };
18
- registry.registerCollector(collector);
19
- const sqlMetricsRegistrar = createSqlMetricsRegistrar(registry);
20
- return entry => {
21
- entries.add(entry);
22
- const sqlMetricsUnregistrar = sqlMetricsRegistrar(entry.connection, entry.labels);
23
- return () => {
24
- entries.delete(entry);
25
- sqlMetricsUnregistrar();
26
- };
27
- };
28
- };
29
- exports.createDbMetricsRegistrar = createDbMetricsRegistrar;
30
- const createSingleDbPoolMetricsCollector = (registry) => {
31
- const totalCount = new prom_client_1.default.Gauge({
32
- registers: [registry],
33
- name: `contember_db_pool_total_count`,
34
- help: 'The total number of clients existing within the pool by contember_module (tenant or content; system is not used since it uses the same connection) and contember_project for contember_module=content.',
35
- labelNames,
36
- });
37
- const idleCount = new prom_client_1.default.Gauge({
38
- registers: [registry],
39
- name: `contember_db_pool_idle_count`,
40
- help: 'The number of clients which are not checked out but are currently idle in the pool by contember_module (tenant or content; system is not used since it uses the same connection) and contember_project for contember_module=content.',
41
- labelNames,
42
- });
43
- const waitingCount = new prom_client_1.default.Gauge({
44
- registers: [registry],
45
- name: `contember_db_pool_waiting_count`,
46
- help: 'The number of queued requests waiting on a client when all clients are checked out. It can be helpful to monitor this number to see if you need to adjust the size of the pool by contember_module (tenant or content; system is not used since it uses the same connection) and contember_project for contember_module=content.',
47
- labelNames,
48
- });
49
- const maxCount = new prom_client_1.default.Gauge({
50
- registers: [registry],
51
- name: `contember_db_pool_max_count`,
52
- help: 'Maximum number of clients the pool should contain by contember_module (tenant or content; system is not used since it uses the same connection) and contember_project for contember_module=content.',
53
- labelNames,
54
- });
55
- return (db, labels) => {
56
- const poolInfo = db.getPoolStatus();
57
- totalCount.set(labels, poolInfo.totalCount);
58
- idleCount.set(labels, poolInfo.idleCount);
59
- waitingCount.set(labels, poolInfo.waitingCount);
60
- maxCount.set(labels, poolInfo.maxCount);
61
- };
62
- };
63
- const createSqlMetricsRegistrar = (registry) => {
64
- const sqlDuration = new prom_client_1.default.Histogram({
65
- name: 'contember_sql_duration_ms',
66
- help: 'Executed SQL queries by contember_module (system, tenant, content or unknown) and contember_project (or "unknown" for unknown project)',
67
- registers: [registry],
68
- labelNames,
69
- buckets: [1, 2, 5, 10, 25, 50, 100, 250, 500, 1000],
70
- });
71
- const sqlErrorRate = new prom_client_1.default.Counter({
72
- name: 'contember_sql_error_count',
73
- help: 'Failed SQL queries by contember_module (system, tenant, content or unknown) and contember_project (or "unknown" for unknown project)',
74
- labelNames,
75
- registers: [registry],
76
- });
77
- return (connection, labels) => {
78
- const queryEndCallback = ({ meta }, { timing }) => {
79
- sqlDuration.observe({
80
- ...labels,
81
- contember_module: meta.module || labels.contember_module,
82
- }, timing ? timing.selfDuration / 1000 : 0);
83
- };
84
- const queryErrorCallback = ({ meta }) => {
85
- sqlErrorRate.inc({
86
- ...labels,
87
- contember_module: meta.module || labels.contember_module,
88
- });
89
- };
90
- connection.eventManager.on(database_1.EventManager.Event.queryEnd, queryEndCallback);
91
- connection.eventManager.on(database_1.EventManager.Event.queryError, queryErrorCallback);
92
- return () => {
93
- connection.eventManager.removeListener(database_1.EventManager.Event.queryEnd, queryEndCallback);
94
- connection.eventManager.removeListener(database_1.EventManager.Event.queryError, queryErrorCallback);
95
- };
96
- };
97
- };
98
- //# sourceMappingURL=dbMetrics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dbMetrics.js","sourceRoot":"","sources":["../../../src/utils/dbMetrics.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare const timeout: (ms: number) => Promise<unknown>;
2
- //# sourceMappingURL=timeout.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../../src/utils/timeout.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,OAAQ,MAAM,qBAG/B,CAAA"}
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.timeout = void 0;
4
- const timeout = (ms) => new Promise(resolve => {
5
- setTimeout(resolve, ms);
6
- });
7
- exports.timeout = timeout;
8
- //# sourceMappingURL=timeout.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../../src/utils/timeout.ts"],"names":[],"mappings":";;;AAAO,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,EAAE,CACrC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;IACrB,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;AACxB,CAAC,CAAC,CAAA;AAHU,QAAA,OAAO,WAGjB"}