@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.
Files changed (177) hide show
  1. package/config.d.ts +284 -0
  2. package/eslint.config.js +8 -0
  3. package/fixtures/botched-start/platformatic.runtime.json +1 -1
  4. package/fixtures/botched-start/services/a/platformatic.service.json +1 -1
  5. package/fixtures/composerApp/platformatic.composer.json +1 -1
  6. package/fixtures/configs/invalid-autoload-with-services.json +1 -1
  7. package/fixtures/configs/invalid-entrypoint.json +1 -1
  8. package/fixtures/configs/invalid-schema-type.config.json +1 -1
  9. package/fixtures/configs/missing-property.config.json +1 -1
  10. package/fixtures/configs/missing-service-config.json +1 -1
  11. package/fixtures/configs/monorepo-composer-no-autoload.json +2 -2
  12. package/fixtures/configs/monorepo-composer.json +2 -2
  13. package/fixtures/configs/monorepo-create-cycle.json +2 -2
  14. package/fixtures/configs/monorepo-missing-dependencies.json +2 -2
  15. package/fixtures/configs/monorepo-no-cycles.json +2 -2
  16. package/fixtures/configs/monorepo-openapi.json +2 -2
  17. package/fixtures/configs/{monorepo-hotreload-env.json → monorepo-watch-env.json} +2 -2
  18. package/fixtures/configs/monorepo-watch-single.json +12 -0
  19. package/fixtures/configs/monorepo-watch.json +26 -9
  20. package/fixtures/configs/monorepo-with-dependencies.json +2 -2
  21. package/fixtures/configs/monorepo-with-management-api-without-metrics.json +21 -0
  22. package/fixtures/configs/monorepo-with-management-api.json +2 -2
  23. package/fixtures/configs/{monorepo-hotreload.json → monorepo-with-metrics.json} +5 -4
  24. package/fixtures/configs/monorepo.json +2 -2
  25. package/fixtures/configs/no-services.config.json +1 -1
  26. package/fixtures/configs/no-sources.config.json +1 -1
  27. package/fixtures/configs/service-throws-on-start.json +1 -1
  28. package/fixtures/configs/service-with-env-port.json +2 -2
  29. package/fixtures/configs/service-with-stdio.json +12 -0
  30. package/fixtures/configs/{hotreload.json → watch.json} +2 -2
  31. package/fixtures/crash-on-bootstrap/platformatic.runtime.json +15 -0
  32. package/fixtures/crash-on-bootstrap/services/service-1/platformatic.service.json +14 -0
  33. package/fixtures/crash-on-bootstrap/services/service-1/plugin.js +5 -0
  34. package/fixtures/crash-on-bootstrap/services/service-2/platformatic.service.json +14 -0
  35. package/fixtures/crash-on-bootstrap/services/service-2/plugin.js +5 -0
  36. package/fixtures/dbApp/platformatic.db.json +1 -1
  37. package/fixtures/dbAppNoName/platformatic.db.json +1 -1
  38. package/fixtures/dbAppNoPackageJson/platformatic.db.json +1 -1
  39. package/fixtures/dbAppWithMigrationError/platformatic.db.json +1 -1
  40. package/fixtures/do-not-reload-dependencies/platformatic.service.json +1 -1
  41. package/fixtures/do-not-restart-on-crash/platformatic.runtime.json +3 -2
  42. package/fixtures/do-not-restart-on-crash/services/a/platformatic.service.json +1 -1
  43. package/fixtures/express/platformatic.runtime.json +1 -1
  44. package/fixtures/express/services/a/platformatic.service.json +1 -1
  45. package/fixtures/express/services/b/platformatic.service.json +1 -1
  46. package/fixtures/external-client/platformatic.service.json +1 -1
  47. package/fixtures/interceptors/idp.js +2 -2
  48. package/fixtures/interceptors/platformatic.runtime.json +1 -1
  49. package/fixtures/interceptors/services/a/platformatic.service.json +1 -1
  50. package/fixtures/interceptors-2/platformatic.runtime.json +1 -1
  51. package/fixtures/interceptors-2/services/a/platformatic.service.json +1 -1
  52. package/fixtures/leven/platformatic.runtime.json +2 -2
  53. package/fixtures/leven/services/deeply-spittle/platformatic.service.json +1 -1
  54. package/fixtures/leven/services/rainy-empire/platformatic.composer.json +1 -1
  55. package/fixtures/management-api/platformatic.json +8 -3
  56. package/fixtures/management-api/services/service-1/platformatic.json +1 -1
  57. package/fixtures/management-api/services/service-1/plugin.js +4 -3
  58. package/fixtures/management-api/services/service-2/platformatic.json +1 -1
  59. package/fixtures/management-api/services/service-db/platformatic.db.json +1 -1
  60. package/fixtures/management-api-custom-labels/platformatic.json +2 -2
  61. package/fixtures/management-api-custom-labels/services/service-1/platformatic.json +1 -1
  62. package/fixtures/management-api-custom-labels/services/service-1/plugin.js +4 -3
  63. package/fixtures/management-api-custom-labels/services/service-2/platformatic.json +1 -1
  64. package/fixtures/management-api-custom-labels/services/service-db/platformatic.db.json +1 -1
  65. package/fixtures/management-api-without-metrics/platformatic.json +3 -2
  66. package/fixtures/management-api-without-metrics/services/service-1/platformatic.json +1 -1
  67. package/fixtures/monorepo/composerApp/platformatic.composer.json +1 -1
  68. package/fixtures/monorepo/dbApp/platformatic.db.json +1 -1
  69. package/fixtures/monorepo/serviceApp/platformatic.service.json +3 -2
  70. package/fixtures/monorepo/serviceApp/with-logger/with-logger.cjs +2 -2
  71. package/fixtures/monorepo/serviceApp/with-logger/with-logger.d.ts +7 -7
  72. package/fixtures/monorepo/serviceAppWithLogger/platformatic.service.json +1 -1
  73. package/fixtures/monorepo/serviceAppWithLogger/plugin.js +12 -0
  74. package/fixtures/monorepo/serviceAppWithMultiplePlugins/platformatic.service.json +3 -2
  75. package/fixtures/monorepo-missing-dependencies/composer/platformatic.json +1 -1
  76. package/fixtures/monorepo-openapi/serviceAppWithoutOpenapi/platformatic.service.json +1 -1
  77. package/fixtures/monorepo-watch/service1/platformatic.service.json +1 -1
  78. package/fixtures/monorepo-with-dependencies/main/platformatic.json +1 -1
  79. package/fixtures/monorepo-with-dependencies/service-1/platformatic.json +1 -1
  80. package/fixtures/monorepo-with-dependencies/service-2/platformatic.json +1 -1
  81. package/fixtures/no-env.service.json +1 -1
  82. package/fixtures/preload/platformatic.runtime.json +1 -1
  83. package/fixtures/preload/services/a/platformatic.service.json +1 -1
  84. package/fixtures/prom-server/platformatic.json +2 -2
  85. package/fixtures/prom-server/services/service-1/platformatic.json +1 -1
  86. package/fixtures/prom-server/services/service-2/platformatic.json +1 -1
  87. package/fixtures/restart-on-crash/platformatic.runtime.json +1 -1
  88. package/fixtures/restart-on-crash/services/a/platformatic.service.json +1 -1
  89. package/fixtures/sample-runtime/package.json +2 -2
  90. package/fixtures/sample-runtime/platformatic.json +2 -2
  91. package/fixtures/sample-runtime/services/rival/package.json +1 -1
  92. package/fixtures/sample-runtime/services/rival/platformatic.json +1 -1
  93. package/fixtures/sample-runtime-with-2-services/package.json +2 -2
  94. package/fixtures/sample-runtime-with-2-services/platformatic.json +2 -2
  95. package/fixtures/sample-runtime-with-2-services/services/foobar/package.json +1 -1
  96. package/fixtures/sample-runtime-with-2-services/services/foobar/platformatic.json +1 -1
  97. package/fixtures/sample-runtime-with-2-services/services/rival/package.json +1 -1
  98. package/fixtures/sample-runtime-with-2-services/services/rival/platformatic.json +1 -1
  99. package/fixtures/server/logger-transport/platformatic.runtime.json +2 -2
  100. package/fixtures/server/logger-transport/services/echo/platformatic.service.json +1 -1
  101. package/fixtures/server/overrides-service/platformatic.runtime.json +2 -2
  102. package/fixtures/server/overrides-service/services/echo/platformatic.service.json +1 -1
  103. package/fixtures/server/runtime-server/platformatic.runtime.json +2 -2
  104. package/fixtures/server/runtime-server/services/echo/platformatic.service.json +1 -1
  105. package/fixtures/serviceAppThrowsOnStart/platformatic.service.json +1 -1
  106. package/fixtures/stackables/node_modules/foo/foo.js +2 -1
  107. package/fixtures/start-command-in-runtime.js +1 -1
  108. package/fixtures/stdio/platformatic.service.json +6 -0
  109. package/fixtures/stdio/plugin.js +24 -0
  110. package/fixtures/telemetry/platformatic.runtime.json +2 -2
  111. package/fixtures/telemetry/services/echo/platformatic.service.json +1 -1
  112. package/fixtures/telemetry/services/echo/routes/span.js +16 -2
  113. package/fixtures/telemetry/services/service-1/platformatic.service.json +19 -0
  114. package/fixtures/telemetry/services/service-1/routes/echo.js +7 -0
  115. package/fixtures/typescript/platformatic.runtime.json +2 -2
  116. package/fixtures/typescript/services/composer/platformatic.composer.json +1 -1
  117. package/fixtures/typescript/services/movies/global.d.ts +2 -3
  118. package/fixtures/typescript/services/movies/platformatic.db.json +1 -1
  119. package/fixtures/typescript/services/movies/types/Movie.d.ts +3 -3
  120. package/fixtures/typescript/services/movies/types/index.d.ts +6 -6
  121. package/fixtures/typescript/services/titles/client/client.d.ts +35 -35
  122. package/fixtures/typescript/services/titles/platformatic.service.json +1 -1
  123. package/fixtures/typescript-custom-flags/platformatic.runtime.json +2 -2
  124. package/fixtures/typescript-custom-flags/services/composer/platformatic.composer.json +1 -1
  125. package/fixtures/typescript-custom-flags/services/movies/global.d.ts +2 -3
  126. package/fixtures/typescript-custom-flags/services/movies/platformatic.db.json +1 -1
  127. package/fixtures/typescript-custom-flags/services/movies/types/Movie.d.ts +3 -3
  128. package/fixtures/typescript-custom-flags/services/movies/types/index.d.ts +6 -6
  129. package/fixtures/typescript-custom-flags/services/titles/client/client.d.ts +35 -35
  130. package/fixtures/typescript-custom-flags/services/titles/platformatic.service.json +1 -1
  131. package/fixtures/typescript-no-env/platformatic.runtime.json +2 -2
  132. package/fixtures/typescript-no-env/services/composer/platformatic.composer.json +1 -1
  133. package/fixtures/typescript-no-env/services/movies/global.d.ts +2 -3
  134. package/fixtures/typescript-no-env/services/movies/platformatic.db.json +1 -1
  135. package/fixtures/typescript-no-env/services/movies/types/Movie.d.ts +3 -3
  136. package/fixtures/typescript-no-env/services/movies/types/index.d.ts +6 -6
  137. package/fixtures/typescript-no-env/services/titles/client/client.d.ts +35 -35
  138. package/fixtures/typescript-no-env/services/titles/platformatic.service.json +1 -1
  139. package/index.d.ts +7 -8
  140. package/index.js +15 -10
  141. package/index.test-d.ts +10 -12
  142. package/lib/build-server.js +11 -13
  143. package/lib/compile.js +11 -10
  144. package/lib/config.js +21 -14
  145. package/lib/dependencies.js +2 -1
  146. package/lib/errors.js +5 -2
  147. package/lib/generator/errors.js +1 -1
  148. package/lib/generator/runtime-generator.d.ts +15 -15
  149. package/lib/generator/runtime-generator.js +93 -64
  150. package/lib/logger.js +55 -0
  151. package/lib/management-api.js +29 -44
  152. package/lib/prom-server.js +5 -9
  153. package/lib/runtime.js +1005 -0
  154. package/lib/schema.js +46 -41
  155. package/lib/start.js +42 -109
  156. package/lib/upgrade.js +4 -3
  157. package/lib/utils.js +49 -1
  158. package/lib/versions/v1.36.0.js +1 -1
  159. package/lib/versions/v1.5.0.js +1 -1
  160. package/lib/versions/v2.0.0.js +17 -0
  161. package/lib/worker/app.js +266 -0
  162. package/lib/worker/default-stackable.js +32 -0
  163. package/lib/worker/itc.js +149 -0
  164. package/lib/worker/main.js +129 -0
  165. package/lib/worker/metrics.js +106 -0
  166. package/lib/worker/symbols.js +7 -0
  167. package/package.json +34 -31
  168. package/runtime.mjs +5 -5
  169. package/schema.json +840 -0
  170. package/lib/api-client.js +0 -500
  171. package/lib/api.js +0 -420
  172. package/lib/app.js +0 -397
  173. package/lib/load-config.js +0 -12
  174. package/lib/loader.mjs +0 -103
  175. package/lib/message-port-writable.js +0 -50
  176. package/lib/worker.js +0 -182
  177. /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 { schemas: { server } } = require('@platformatic/utils')
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/schemas/${version}/runtime`,
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', 'config'],
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
- hotReload: {
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
- hotReloadDisabled: {
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
- type: 'array',
99
- items: {
100
- $ref: '#/$defs/undiciInterceptor'
101
- }
102
- }, {
103
- type: 'object',
104
- properties: {
105
- Client: {
106
- type: 'array',
107
- items: {
108
- $ref: '#/$defs/undiciInterceptor'
109
- }
110
- },
111
- Pool: {
112
- type: 'array',
113
- items: {
114
- $ref: '#/$defs/undiciInterceptor'
115
- }
116
- },
117
- Agent: {
118
- type: 'array',
119
- items: {
120
- $ref: '#/$defs/undiciInterceptor'
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
- { type: 'string' }
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', 'config'],
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 { pathToFileURL } = require('node:url')
8
- const { Worker } = require('node:worker_threads')
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 kLoaderFile = pathToFileURL(join(__dirname, 'loader.mjs')).href
22
- const kWorkerFile = join(__dirname, 'worker.js')
23
- const kWorkerExecArgv = [
24
- '--no-warnings',
25
- '--experimental-loader',
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
- // The configManager cannot be transferred to the worker, so remove it.
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
- if (config.hotReload) {
68
- /* c8 ignore next 3 */
69
- process.on('SIGUSR2', () => {
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
- /* c8 ignore next 3 */
74
- configManager.on('update', () => {
75
- // TODO(cjihrig): Need to clean up and restart the worker.
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
- return runtimeApiClient
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
- let startErr = null
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(pretty({
177
- translateTime: 'SYS:HH:MM:ss',
178
- ignore: 'hostname,pid'
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({}, args)
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 (event) => {
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/schemas/v${pkg.version}/service`,
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((s) => ' * ' + s).join('\n')}
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/schemas/v${pkg.version}/runtime`
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
  }
@@ -7,5 +7,5 @@ module.exports = {
7
7
  config.restartOnError = false
8
8
  }
9
9
  return config
10
- }
10
+ },
11
11
  }
@@ -7,5 +7,5 @@ module.exports = {
7
7
  delete config.watch
8
8
  }
9
9
  return config
10
- }
10
+ },
11
11
  }
@@ -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
+ }