@platformatic/runtime 2.0.0-alpha.1 → 2.0.0-alpha.11
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/config.d.ts +284 -0
- package/eslint.config.js +8 -0
- package/fixtures/botched-start/platformatic.runtime.json +1 -1
- package/fixtures/botched-start/services/a/platformatic.service.json +1 -1
- package/fixtures/composerApp/platformatic.composer.json +1 -1
- package/fixtures/configs/invalid-autoload-with-services.json +1 -1
- package/fixtures/configs/invalid-entrypoint.json +1 -1
- package/fixtures/configs/invalid-schema-type.config.json +1 -1
- package/fixtures/configs/missing-property.config.json +1 -1
- package/fixtures/configs/missing-service-config.json +1 -1
- package/fixtures/configs/monorepo-composer-no-autoload.json +2 -2
- package/fixtures/configs/monorepo-composer.json +2 -2
- package/fixtures/configs/monorepo-create-cycle.json +2 -2
- package/fixtures/configs/monorepo-missing-dependencies.json +2 -2
- package/fixtures/configs/monorepo-no-cycles.json +2 -2
- package/fixtures/configs/monorepo-openapi.json +2 -2
- package/fixtures/configs/{monorepo-hotreload-env.json → monorepo-watch-env.json} +2 -2
- package/fixtures/configs/monorepo-watch-single.json +12 -0
- package/fixtures/configs/monorepo-watch.json +26 -9
- package/fixtures/configs/monorepo-with-dependencies.json +2 -2
- package/fixtures/configs/monorepo-with-management-api-without-metrics.json +21 -0
- package/fixtures/configs/monorepo-with-management-api.json +2 -2
- package/fixtures/configs/{monorepo-hotreload.json → monorepo-with-metrics.json} +5 -4
- package/fixtures/configs/monorepo.json +2 -2
- package/fixtures/configs/no-services.config.json +1 -1
- package/fixtures/configs/no-sources.config.json +1 -1
- package/fixtures/configs/service-throws-on-start.json +1 -1
- package/fixtures/configs/service-with-env-port.json +2 -2
- package/fixtures/configs/service-with-stdio.json +12 -0
- package/fixtures/configs/{hotreload.json → watch.json} +2 -2
- package/fixtures/crash-on-bootstrap/platformatic.runtime.json +15 -0
- package/fixtures/crash-on-bootstrap/services/service-1/platformatic.service.json +14 -0
- package/fixtures/crash-on-bootstrap/services/service-1/plugin.js +5 -0
- package/fixtures/crash-on-bootstrap/services/service-2/platformatic.service.json +14 -0
- package/fixtures/crash-on-bootstrap/services/service-2/plugin.js +5 -0
- package/fixtures/dbApp/platformatic.db.json +1 -1
- package/fixtures/dbAppNoName/platformatic.db.json +1 -1
- package/fixtures/dbAppNoPackageJson/platformatic.db.json +1 -1
- package/fixtures/dbAppWithMigrationError/platformatic.db.json +1 -1
- package/fixtures/do-not-reload-dependencies/platformatic.service.json +1 -1
- package/fixtures/do-not-restart-on-crash/platformatic.runtime.json +3 -2
- package/fixtures/do-not-restart-on-crash/services/a/platformatic.service.json +1 -1
- package/fixtures/express/platformatic.runtime.json +1 -1
- package/fixtures/express/services/a/platformatic.service.json +1 -1
- package/fixtures/express/services/b/platformatic.service.json +1 -1
- package/fixtures/external-client/platformatic.service.json +1 -1
- package/fixtures/interceptors/idp.js +2 -2
- package/fixtures/interceptors/platformatic.runtime.json +1 -1
- package/fixtures/interceptors/services/a/platformatic.service.json +1 -1
- package/fixtures/interceptors-2/platformatic.runtime.json +1 -1
- package/fixtures/interceptors-2/services/a/platformatic.service.json +1 -1
- package/fixtures/leven/platformatic.runtime.json +2 -2
- package/fixtures/leven/services/deeply-spittle/platformatic.service.json +1 -1
- package/fixtures/leven/services/rainy-empire/platformatic.composer.json +1 -1
- package/fixtures/management-api/platformatic.json +8 -3
- package/fixtures/management-api/services/service-1/platformatic.json +1 -1
- package/fixtures/management-api/services/service-1/plugin.js +4 -3
- package/fixtures/management-api/services/service-2/platformatic.json +1 -1
- package/fixtures/management-api/services/service-db/platformatic.db.json +1 -1
- package/fixtures/management-api-custom-labels/platformatic.json +2 -2
- package/fixtures/management-api-custom-labels/services/service-1/platformatic.json +1 -1
- package/fixtures/management-api-custom-labels/services/service-1/plugin.js +4 -3
- package/fixtures/management-api-custom-labels/services/service-2/platformatic.json +1 -1
- package/fixtures/management-api-custom-labels/services/service-db/platformatic.db.json +1 -1
- package/fixtures/management-api-without-metrics/platformatic.json +3 -2
- package/fixtures/management-api-without-metrics/services/service-1/platformatic.json +1 -1
- package/fixtures/monorepo/composerApp/platformatic.composer.json +1 -1
- package/fixtures/monorepo/dbApp/platformatic.db.json +1 -1
- package/fixtures/monorepo/serviceApp/platformatic.service.json +3 -2
- package/fixtures/monorepo/serviceApp/with-logger/with-logger.cjs +2 -2
- package/fixtures/monorepo/serviceApp/with-logger/with-logger.d.ts +7 -7
- package/fixtures/monorepo/serviceAppWithLogger/platformatic.service.json +1 -1
- package/fixtures/monorepo/serviceAppWithLogger/plugin.js +12 -0
- package/fixtures/monorepo/serviceAppWithMultiplePlugins/platformatic.service.json +3 -2
- package/fixtures/monorepo-missing-dependencies/composer/platformatic.json +1 -1
- package/fixtures/monorepo-openapi/serviceAppWithoutOpenapi/platformatic.service.json +1 -1
- package/fixtures/monorepo-watch/service1/platformatic.service.json +1 -1
- package/fixtures/monorepo-with-dependencies/main/platformatic.json +1 -1
- package/fixtures/monorepo-with-dependencies/service-1/platformatic.json +1 -1
- package/fixtures/monorepo-with-dependencies/service-2/platformatic.json +1 -1
- package/fixtures/no-env.service.json +1 -1
- package/fixtures/preload/platformatic.runtime.json +1 -1
- package/fixtures/preload/services/a/platformatic.service.json +1 -1
- package/fixtures/prom-server/platformatic.json +2 -2
- package/fixtures/prom-server/services/service-1/platformatic.json +1 -1
- package/fixtures/prom-server/services/service-2/platformatic.json +1 -1
- package/fixtures/restart-on-crash/platformatic.runtime.json +1 -1
- package/fixtures/restart-on-crash/services/a/platformatic.service.json +1 -1
- package/fixtures/sample-runtime/package.json +2 -2
- package/fixtures/sample-runtime/platformatic.json +2 -2
- package/fixtures/sample-runtime/services/rival/package.json +1 -1
- package/fixtures/sample-runtime/services/rival/platformatic.json +1 -1
- package/fixtures/sample-runtime-with-2-services/package.json +2 -2
- package/fixtures/sample-runtime-with-2-services/platformatic.json +2 -2
- package/fixtures/sample-runtime-with-2-services/services/foobar/package.json +1 -1
- package/fixtures/sample-runtime-with-2-services/services/foobar/platformatic.json +1 -1
- package/fixtures/sample-runtime-with-2-services/services/rival/package.json +1 -1
- package/fixtures/sample-runtime-with-2-services/services/rival/platformatic.json +1 -1
- package/fixtures/server/logger-transport/platformatic.runtime.json +2 -2
- package/fixtures/server/logger-transport/services/echo/platformatic.service.json +1 -1
- package/fixtures/server/overrides-service/platformatic.runtime.json +2 -2
- package/fixtures/server/overrides-service/services/echo/platformatic.service.json +1 -1
- package/fixtures/server/runtime-server/platformatic.runtime.json +2 -2
- package/fixtures/server/runtime-server/services/echo/platformatic.service.json +1 -1
- package/fixtures/serviceAppThrowsOnStart/platformatic.service.json +1 -1
- package/fixtures/stackables/node_modules/foo/foo.js +2 -1
- package/fixtures/start-command-in-runtime.js +1 -1
- package/fixtures/stdio/platformatic.service.json +6 -0
- package/fixtures/stdio/plugin.js +24 -0
- package/fixtures/telemetry/platformatic.runtime.json +2 -2
- package/fixtures/telemetry/services/echo/platformatic.service.json +1 -1
- package/fixtures/telemetry/services/echo/routes/span.js +16 -2
- package/fixtures/telemetry/services/service-1/platformatic.service.json +19 -0
- package/fixtures/telemetry/services/service-1/routes/echo.js +7 -0
- package/fixtures/typescript/platformatic.runtime.json +2 -2
- package/fixtures/typescript/services/composer/platformatic.composer.json +1 -1
- package/fixtures/typescript/services/movies/global.d.ts +2 -3
- package/fixtures/typescript/services/movies/platformatic.db.json +1 -1
- package/fixtures/typescript/services/movies/types/Movie.d.ts +3 -3
- package/fixtures/typescript/services/movies/types/index.d.ts +6 -6
- package/fixtures/typescript/services/titles/client/client.d.ts +35 -35
- package/fixtures/typescript/services/titles/platformatic.service.json +1 -1
- package/fixtures/typescript-custom-flags/platformatic.runtime.json +2 -2
- package/fixtures/typescript-custom-flags/services/composer/platformatic.composer.json +1 -1
- package/fixtures/typescript-custom-flags/services/movies/global.d.ts +2 -3
- package/fixtures/typescript-custom-flags/services/movies/platformatic.db.json +1 -1
- package/fixtures/typescript-custom-flags/services/movies/types/Movie.d.ts +3 -3
- package/fixtures/typescript-custom-flags/services/movies/types/index.d.ts +6 -6
- package/fixtures/typescript-custom-flags/services/titles/client/client.d.ts +35 -35
- package/fixtures/typescript-custom-flags/services/titles/platformatic.service.json +1 -1
- package/fixtures/typescript-no-env/platformatic.runtime.json +2 -2
- package/fixtures/typescript-no-env/services/composer/platformatic.composer.json +1 -1
- package/fixtures/typescript-no-env/services/movies/global.d.ts +2 -3
- package/fixtures/typescript-no-env/services/movies/platformatic.db.json +1 -1
- package/fixtures/typescript-no-env/services/movies/types/Movie.d.ts +3 -3
- package/fixtures/typescript-no-env/services/movies/types/index.d.ts +6 -6
- package/fixtures/typescript-no-env/services/titles/client/client.d.ts +35 -35
- package/fixtures/typescript-no-env/services/titles/platformatic.service.json +1 -1
- package/index.d.ts +7 -8
- package/index.js +15 -10
- package/index.test-d.ts +10 -12
- package/lib/build-server.js +11 -13
- package/lib/compile.js +11 -10
- package/lib/config.js +21 -14
- package/lib/dependencies.js +2 -1
- package/lib/errors.js +5 -2
- package/lib/generator/errors.js +1 -1
- package/lib/generator/runtime-generator.d.ts +15 -15
- package/lib/generator/runtime-generator.js +93 -64
- package/lib/logger.js +55 -0
- package/lib/management-api.js +29 -44
- package/lib/prom-server.js +5 -9
- package/lib/runtime.js +1005 -0
- package/lib/schema.js +46 -41
- package/lib/start.js +42 -109
- package/lib/upgrade.js +4 -3
- package/lib/utils.js +49 -1
- package/lib/versions/v1.36.0.js +1 -1
- package/lib/versions/v1.5.0.js +1 -1
- package/lib/versions/v2.0.0.js +17 -0
- package/lib/worker/app.js +266 -0
- package/lib/worker/default-stackable.js +32 -0
- package/lib/worker/itc.js +149 -0
- package/lib/worker/main.js +129 -0
- package/lib/worker/metrics.js +106 -0
- package/lib/worker/symbols.js +7 -0
- package/package.json +34 -31
- package/runtime.mjs +5 -5
- package/schema.json +840 -0
- package/lib/api-client.js +0 -500
- package/lib/api.js +0 -420
- package/lib/app.js +0 -397
- package/lib/load-config.js +0 -12
- package/lib/loader.mjs +0 -103
- package/lib/message-port-writable.js +0 -50
- package/lib/worker.js +0 -182
- /package/lib/{interceptors.js → worker/interceptors.js} +0 -0
package/lib/schema.js
CHANGED
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
'use strict'
|
|
3
3
|
|
|
4
4
|
const telemetry = require('@platformatic/telemetry').schema
|
|
5
|
-
const {
|
|
5
|
+
const {
|
|
6
|
+
schemaComponents: { server }
|
|
7
|
+
} = require('@platformatic/utils')
|
|
8
|
+
|
|
6
9
|
const pkg = require('../package.json')
|
|
7
|
-
const version = 'v' + pkg.version
|
|
8
10
|
const platformaticRuntimeSchema = {
|
|
9
|
-
$id: `https://platformatic.dev/
|
|
11
|
+
$id: `https://schemas.platformatic.dev/@platformatic/runtime/${pkg.version}.json`,
|
|
10
12
|
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
11
13
|
type: 'object',
|
|
12
14
|
properties: {
|
|
@@ -38,7 +40,7 @@ const platformaticRuntimeSchema = {
|
|
|
38
40
|
additionalProperties: {
|
|
39
41
|
type: 'object',
|
|
40
42
|
additionalProperties: false,
|
|
41
|
-
required: ['id'
|
|
43
|
+
required: ['id'],
|
|
42
44
|
properties: {
|
|
43
45
|
id: {
|
|
44
46
|
type: 'string'
|
|
@@ -59,7 +61,7 @@ const platformaticRuntimeSchema = {
|
|
|
59
61
|
entrypoint: {
|
|
60
62
|
type: 'string'
|
|
61
63
|
},
|
|
62
|
-
|
|
64
|
+
watch: {
|
|
63
65
|
anyOf: [
|
|
64
66
|
{
|
|
65
67
|
type: 'boolean'
|
|
@@ -81,7 +83,7 @@ const platformaticRuntimeSchema = {
|
|
|
81
83
|
breakFirstLine: {
|
|
82
84
|
type: 'boolean'
|
|
83
85
|
},
|
|
84
|
-
|
|
86
|
+
watchDisabled: {
|
|
85
87
|
type: 'boolean'
|
|
86
88
|
}
|
|
87
89
|
}
|
|
@@ -94,34 +96,37 @@ const platformaticRuntimeSchema = {
|
|
|
94
96
|
additionalProperties: true
|
|
95
97
|
},
|
|
96
98
|
interceptors: {
|
|
97
|
-
anyOf: [
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
99
|
+
anyOf: [
|
|
100
|
+
{
|
|
101
|
+
type: 'array',
|
|
102
|
+
items: {
|
|
103
|
+
$ref: '#/$defs/undiciInterceptor'
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
type: 'object',
|
|
108
|
+
properties: {
|
|
109
|
+
Client: {
|
|
110
|
+
type: 'array',
|
|
111
|
+
items: {
|
|
112
|
+
$ref: '#/$defs/undiciInterceptor'
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
Pool: {
|
|
116
|
+
type: 'array',
|
|
117
|
+
items: {
|
|
118
|
+
$ref: '#/$defs/undiciInterceptor'
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
Agent: {
|
|
122
|
+
type: 'array',
|
|
123
|
+
items: {
|
|
124
|
+
$ref: '#/$defs/undiciInterceptor'
|
|
125
|
+
}
|
|
121
126
|
}
|
|
122
127
|
}
|
|
123
128
|
}
|
|
124
|
-
|
|
129
|
+
]
|
|
125
130
|
}
|
|
126
131
|
}
|
|
127
132
|
},
|
|
@@ -152,10 +157,7 @@ const platformaticRuntimeSchema = {
|
|
|
152
157
|
type: 'object',
|
|
153
158
|
properties: {
|
|
154
159
|
port: {
|
|
155
|
-
anyOf: [
|
|
156
|
-
{ type: 'integer' },
|
|
157
|
-
{ type: 'string' }
|
|
158
|
-
]
|
|
160
|
+
anyOf: [{ type: 'integer' }, { type: 'string' }]
|
|
159
161
|
},
|
|
160
162
|
hostname: { type: 'string' },
|
|
161
163
|
endpoint: { type: 'string' },
|
|
@@ -181,14 +183,17 @@ const platformaticRuntimeSchema = {
|
|
|
181
183
|
default: true,
|
|
182
184
|
anyOf: [
|
|
183
185
|
{ type: 'boolean' },
|
|
184
|
-
{
|
|
186
|
+
{
|
|
187
|
+
type: 'number',
|
|
188
|
+
minimum: 100
|
|
189
|
+
}
|
|
185
190
|
]
|
|
186
191
|
},
|
|
187
192
|
services: {
|
|
188
193
|
type: 'array',
|
|
189
194
|
items: {
|
|
190
195
|
type: 'object',
|
|
191
|
-
required: ['id', 'path', '
|
|
196
|
+
anyOf: [{ required: ['id', 'path'] }, { required: ['id', 'url'] }],
|
|
192
197
|
properties: {
|
|
193
198
|
id: {
|
|
194
199
|
type: 'string'
|
|
@@ -200,6 +205,9 @@ const platformaticRuntimeSchema = {
|
|
|
200
205
|
config: {
|
|
201
206
|
type: 'string'
|
|
202
207
|
},
|
|
208
|
+
url: {
|
|
209
|
+
type: 'string'
|
|
210
|
+
},
|
|
203
211
|
useHttp: {
|
|
204
212
|
type: 'boolean'
|
|
205
213
|
}
|
|
@@ -207,10 +215,7 @@ const platformaticRuntimeSchema = {
|
|
|
207
215
|
}
|
|
208
216
|
}
|
|
209
217
|
},
|
|
210
|
-
anyOf: [
|
|
211
|
-
{ required: ['autoload', 'entrypoint'] },
|
|
212
|
-
{ required: ['services', 'entrypoint'] }
|
|
213
|
-
],
|
|
218
|
+
anyOf: [{ required: ['autoload', 'entrypoint'] }, { required: ['services', 'entrypoint'] }],
|
|
214
219
|
additionalProperties: false,
|
|
215
220
|
$defs: {
|
|
216
221
|
undiciInterceptor: {
|
package/lib/start.js
CHANGED
|
@@ -1,46 +1,25 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const { once } = require('node:events')
|
|
4
3
|
const inspector = require('node:inspector')
|
|
5
|
-
const { join, resolve, dirname } = require('node:path')
|
|
6
4
|
const { writeFile } = require('node:fs/promises')
|
|
7
|
-
const {
|
|
8
|
-
|
|
5
|
+
const { join, resolve, dirname } = require('node:path')
|
|
6
|
+
|
|
9
7
|
const { printConfigValidationErrors } = require('@platformatic/config')
|
|
8
|
+
const {
|
|
9
|
+
errors: { ensureLoggableError }
|
|
10
|
+
} = require('@platformatic/utils')
|
|
10
11
|
const closeWithGrace = require('close-with-grace')
|
|
11
|
-
const { loadConfig } = require('./load-config')
|
|
12
|
-
const { startManagementApi } = require('./management-api')
|
|
13
|
-
const { startPrometheusServer } = require('./prom-server.js')
|
|
14
|
-
const { parseInspectorOptions, wrapConfigInRuntimeConfig } = require('./config')
|
|
15
|
-
const { RuntimeApiClient, getRuntimeLogsDir } = require('./api-client.js')
|
|
16
|
-
const errors = require('./errors')
|
|
17
|
-
const pkg = require('../package.json')
|
|
18
12
|
const pino = require('pino')
|
|
19
13
|
const pretty = require('pino-pretty')
|
|
20
14
|
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
kLoaderFile
|
|
27
|
-
]
|
|
28
|
-
|
|
29
|
-
function startWorker ({ config, dirname, runtimeLogsDir }, env) {
|
|
30
|
-
const worker = new Worker(kWorkerFile, {
|
|
31
|
-
/* c8 ignore next */
|
|
32
|
-
execArgv: config.hotReload ? kWorkerExecArgv : [],
|
|
33
|
-
transferList: config.loggingPort ? [config.loggingPort] : [],
|
|
34
|
-
workerData: { config, dirname, runtimeLogsDir },
|
|
35
|
-
env
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
return worker
|
|
39
|
-
}
|
|
15
|
+
const pkg = require('../package.json')
|
|
16
|
+
const { parseInspectorOptions, wrapConfigInRuntimeConfig } = require('./config')
|
|
17
|
+
const { Runtime } = require('./runtime')
|
|
18
|
+
const errors = require('./errors')
|
|
19
|
+
const { getRuntimeLogsDir, loadConfig } = require('./utils')
|
|
40
20
|
|
|
41
21
|
async function buildRuntime (configManager, env) {
|
|
42
22
|
env = env || process.env
|
|
43
|
-
const config = configManager.current
|
|
44
23
|
|
|
45
24
|
if (inspector.url()) {
|
|
46
25
|
throw new errors.NodeInspectorFlagsNotSupportedError()
|
|
@@ -50,80 +29,24 @@ async function buildRuntime (configManager, env) {
|
|
|
50
29
|
parseInspectorOptions(configManager)
|
|
51
30
|
}
|
|
52
31
|
|
|
53
|
-
if (config.hotReload) {
|
|
54
|
-
config.loaderFile = kLoaderFile
|
|
55
|
-
}
|
|
56
|
-
|
|
57
32
|
const dirname = configManager.dirname
|
|
58
33
|
const runtimeLogsDir = getRuntimeLogsDir(dirname, process.pid)
|
|
59
34
|
|
|
60
|
-
|
|
61
|
-
delete config.configManager
|
|
62
|
-
|
|
63
|
-
let worker = startWorker({ config, dirname, runtimeLogsDir }, env)
|
|
64
|
-
|
|
65
|
-
let managementApi = null
|
|
35
|
+
const runtime = new Runtime(configManager, runtimeLogsDir, env)
|
|
66
36
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
worker.postMessage({ signal: 'SIGUSR2' })
|
|
71
|
-
})
|
|
37
|
+
/* c8 ignore next 3 */
|
|
38
|
+
process.on('SIGUSR2', async () => {
|
|
39
|
+
runtime.logger.info('Received SIGUSR2, restarting all services ...')
|
|
72
40
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
function setupExit () {
|
|
80
|
-
worker.on('exit', (code) => {
|
|
81
|
-
// runtimeApiClient.started can be false if a stop command was issued
|
|
82
|
-
// via the management API.
|
|
83
|
-
if (config.restartOnError === false || !runtimeApiClient.started) {
|
|
84
|
-
// We must stop those here in case the `closeWithGrace` callback
|
|
85
|
-
// was not called.
|
|
86
|
-
configManager.fileWatcher?.stopWatching()
|
|
87
|
-
managementApi?.close()
|
|
88
|
-
return
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
worker = startWorker({ config, dirname, runtimeLogsDir }, env)
|
|
92
|
-
setupExit()
|
|
93
|
-
|
|
94
|
-
once(worker, 'message').then((msg) => {
|
|
95
|
-
runtimeApiClient.setWorker(worker).catch(() => {
|
|
96
|
-
// TODO: currently we restart if the worker fails to start intermitently
|
|
97
|
-
// should we limit this to a number of retries?
|
|
98
|
-
})
|
|
99
|
-
})
|
|
100
|
-
})
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
setupExit()
|
|
104
|
-
|
|
105
|
-
await once(worker, 'message') // plt:init
|
|
106
|
-
|
|
107
|
-
const runtimeApiClient = new RuntimeApiClient(
|
|
108
|
-
worker,
|
|
109
|
-
configManager,
|
|
110
|
-
runtimeLogsDir
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
if (config.managementApi) {
|
|
114
|
-
managementApi = await startManagementApi(runtimeApiClient, configManager)
|
|
115
|
-
runtimeApiClient.managementApi = managementApi
|
|
116
|
-
runtimeApiClient.on('start', () => {
|
|
117
|
-
runtimeApiClient.startCollectingMetrics()
|
|
118
|
-
})
|
|
119
|
-
}
|
|
120
|
-
if (config.metrics) {
|
|
121
|
-
runtimeApiClient.on('start', async () => {
|
|
122
|
-
await startPrometheusServer(runtimeApiClient, config.metrics)
|
|
123
|
-
})
|
|
124
|
-
}
|
|
41
|
+
try {
|
|
42
|
+
await runtime.restart()
|
|
43
|
+
} catch (err) {
|
|
44
|
+
runtime.logger.error({ err: ensureLoggableError(err) }, 'Failed to restart services.')
|
|
45
|
+
}
|
|
46
|
+
})
|
|
125
47
|
|
|
126
|
-
|
|
48
|
+
await runtime.init()
|
|
49
|
+
return runtime
|
|
127
50
|
}
|
|
128
51
|
|
|
129
52
|
async function start (args) {
|
|
@@ -155,15 +78,15 @@ async function setupAndStartRuntime (config) {
|
|
|
155
78
|
let runtime = await buildRuntime(runtimeConfig)
|
|
156
79
|
|
|
157
80
|
let address = null
|
|
158
|
-
|
|
81
|
+
const startErr = null
|
|
159
82
|
const originalPort = runtimeConfig.current.server?.port || 0
|
|
160
83
|
while (address === null) {
|
|
161
84
|
try {
|
|
162
85
|
address = await runtime.start()
|
|
163
86
|
} catch (err) {
|
|
164
|
-
startErr = err
|
|
165
87
|
if (err.code === 'EADDRINUSE') {
|
|
166
88
|
await runtime.close()
|
|
89
|
+
|
|
167
90
|
if (runtimeConfig.current?.server?.port > MAX_PORT) throw err
|
|
168
91
|
runtimeConfig.current.server.port++
|
|
169
92
|
runtime = await buildRuntime(runtimeConfig)
|
|
@@ -173,10 +96,12 @@ async function setupAndStartRuntime (config) {
|
|
|
173
96
|
}
|
|
174
97
|
}
|
|
175
98
|
if (startErr?.code === 'PLT_RUNTIME_EADDR_IN_USE') {
|
|
176
|
-
const logger = pino(
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
99
|
+
const logger = pino(
|
|
100
|
+
pretty({
|
|
101
|
+
translateTime: 'SYS:HH:MM:ss',
|
|
102
|
+
ignore: 'hostname,pid'
|
|
103
|
+
})
|
|
104
|
+
)
|
|
180
105
|
logger.warn(`Port: ${originalPort} is already in use!`)
|
|
181
106
|
logger.warn(`Starting service on port: ${runtimeConfig.current.server.port}`)
|
|
182
107
|
}
|
|
@@ -185,14 +110,22 @@ async function setupAndStartRuntime (config) {
|
|
|
185
110
|
|
|
186
111
|
async function startCommand (args) {
|
|
187
112
|
try {
|
|
188
|
-
const config = await loadConfig(
|
|
113
|
+
const config = await loadConfig(
|
|
114
|
+
{
|
|
115
|
+
alias: {
|
|
116
|
+
p: 'production'
|
|
117
|
+
},
|
|
118
|
+
boolean: ['p', 'production']
|
|
119
|
+
},
|
|
120
|
+
args
|
|
121
|
+
)
|
|
189
122
|
|
|
190
123
|
const startResult = await setupAndStartRuntime(config)
|
|
191
124
|
|
|
192
125
|
const runtime = startResult.runtime
|
|
193
126
|
const res = startResult.address
|
|
194
127
|
|
|
195
|
-
closeWithGrace(async
|
|
128
|
+
closeWithGrace(async event => {
|
|
196
129
|
if (event.err instanceof Error) {
|
|
197
130
|
console.error(event.err)
|
|
198
131
|
}
|
|
@@ -203,7 +136,7 @@ async function startCommand (args) {
|
|
|
203
136
|
} catch (err) {
|
|
204
137
|
if (err.code === 'PLT_CONFIG_NO_CONFIG_FILE_FOUND' && args.length === 1) {
|
|
205
138
|
const config = {
|
|
206
|
-
$schema: `https://platformatic.dev/
|
|
139
|
+
$schema: `https://schemas.platformatic.dev/@platformatic/service/${pkg.version}.json`,
|
|
207
140
|
server: {
|
|
208
141
|
hostname: '127.0.0.1',
|
|
209
142
|
port: 3042,
|
|
@@ -229,7 +162,7 @@ async function startCommand (args) {
|
|
|
229
162
|
console.error(`Missing config file!
|
|
230
163
|
Be sure to have a config file with one of the following names:
|
|
231
164
|
|
|
232
|
-
${err.filenames.map(
|
|
165
|
+
${err.filenames.map(s => ' * ' + s).join('\n')}
|
|
233
166
|
|
|
234
167
|
In alternative run "npm create platformatic@latest" to generate a basic plt service config.`)
|
|
235
168
|
process.exit(1)
|
package/lib/upgrade.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const { join } = require('path')
|
|
3
|
+
const { join } = require('node:path')
|
|
4
|
+
|
|
4
5
|
const pkg = require('../package.json')
|
|
5
6
|
|
|
6
7
|
module.exports = async function upgrade (config, version) {
|
|
@@ -10,7 +11,7 @@ module.exports = async function upgrade (config, version) {
|
|
|
10
11
|
version,
|
|
11
12
|
path: join(__dirname, 'versions'),
|
|
12
13
|
input: config,
|
|
13
|
-
logger: this.logger.child({ name: '@platformatic/runtime' })
|
|
14
|
+
logger: this.logger.child({ name: '@platformatic/runtime' }),
|
|
14
15
|
})
|
|
15
16
|
|
|
16
17
|
let result
|
|
@@ -19,7 +20,7 @@ module.exports = async function upgrade (config, version) {
|
|
|
19
20
|
result = updated.result
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
result.$schema = `https://platformatic.dev/
|
|
23
|
+
result.$schema = `https://schemas.platformatic.dev/@platformatic/runtime/${pkg.version}.json`
|
|
23
24
|
|
|
24
25
|
return result
|
|
25
26
|
}
|
package/lib/utils.js
CHANGED
|
@@ -1,10 +1,58 @@
|
|
|
1
1
|
'use strict'
|
|
2
|
+
|
|
3
|
+
const { createHash } = require('node:crypto')
|
|
4
|
+
const { tmpdir } = require('node:os')
|
|
5
|
+
const { join } = require('node:path')
|
|
6
|
+
|
|
7
|
+
const {
|
|
8
|
+
Store,
|
|
9
|
+
loadConfig: pltConfigLoadConfig,
|
|
10
|
+
loadEmptyConfig: pltConfigLoadEmptyConfig,
|
|
11
|
+
} = require('@platformatic/config')
|
|
12
|
+
|
|
13
|
+
const { platformaticRuntime } = require('./config')
|
|
14
|
+
|
|
2
15
|
function getArrayDifference (a, b) {
|
|
3
16
|
return a.filter(element => {
|
|
4
17
|
return !b.includes(element)
|
|
5
18
|
})
|
|
6
19
|
}
|
|
7
20
|
|
|
21
|
+
function getServiceUrl (id) {
|
|
22
|
+
return `http://${id}.plt.local`
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function getRuntimeTmpDir (runtimeDir) {
|
|
26
|
+
const platformaticTmpDir = join(tmpdir(), 'platformatic', 'applications')
|
|
27
|
+
const runtimeDirHash = createHash('md5').update(runtimeDir).digest('hex')
|
|
28
|
+
return join(platformaticTmpDir, runtimeDirHash)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function getRuntimeLogsDir (runtimeDir, runtimePID) {
|
|
32
|
+
const runtimeTmpDir = getRuntimeTmpDir(runtimeDir)
|
|
33
|
+
return join(runtimeTmpDir, runtimePID.toString(), 'logs')
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function loadConfig (minimistConfig, args, overrides, replaceEnv = true) {
|
|
37
|
+
const { default: platformaticBasic } = await import('@platformatic/basic')
|
|
38
|
+
const store = new Store()
|
|
39
|
+
store.add(platformaticRuntime)
|
|
40
|
+
store.add(platformaticBasic)
|
|
41
|
+
|
|
42
|
+
return pltConfigLoadConfig(minimistConfig, args, store, overrides, replaceEnv)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async function loadEmptyConfig (path, overrides, replaceEnv = true) {
|
|
46
|
+
const { default: platformaticBasic } = await import('@platformatic/basic')
|
|
47
|
+
|
|
48
|
+
return pltConfigLoadEmptyConfig(path, platformaticBasic, overrides, replaceEnv)
|
|
49
|
+
}
|
|
50
|
+
|
|
8
51
|
module.exports = {
|
|
9
|
-
getArrayDifference
|
|
52
|
+
getArrayDifference,
|
|
53
|
+
getRuntimeLogsDir,
|
|
54
|
+
getRuntimeTmpDir,
|
|
55
|
+
getServiceUrl,
|
|
56
|
+
loadConfig,
|
|
57
|
+
loadEmptyConfig,
|
|
10
58
|
}
|
package/lib/versions/v1.36.0.js
CHANGED
package/lib/versions/v1.5.0.js
CHANGED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
version: '1.99.0', // This is to account alpha versions as well
|
|
5
|
+
up: function (config) {
|
|
6
|
+
if (config.restartOnError === undefined) {
|
|
7
|
+
config.restartOnError = true
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
if (config.hotReload) {
|
|
11
|
+
config.watch = config.hotReload
|
|
12
|
+
delete config.hotReload
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return config
|
|
16
|
+
},
|
|
17
|
+
}
|