@platformatic/runtime 2.0.0-alpha.2 → 2.0.0-alpha.4

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 (176) hide show
  1. package/config.d.ts +285 -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 +3 -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 +1 -1
  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 +1 -1
  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 +14 -10
  141. package/index.test-d.ts +10 -12
  142. package/lib/build-server.js +5 -11
  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 +3 -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 +92 -63
  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 +955 -0
  154. package/lib/schema.js +79 -76
  155. package/lib/start.js +35 -113
  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 +250 -0
  162. package/lib/worker/default-stackable.js +27 -0
  163. package/lib/worker/itc.js +128 -0
  164. package/lib/worker/main.js +127 -0
  165. package/lib/worker/symbols.js +7 -0
  166. package/package.json +25 -25
  167. package/runtime.mjs +4 -4
  168. package/schema.json +824 -0
  169. package/lib/api-client.js +0 -500
  170. package/lib/api.js +0 -420
  171. package/lib/app.js +0 -397
  172. package/lib/load-config.js +0 -12
  173. package/lib/loader.mjs +0 -103
  174. package/lib/message-port-writable.js +0 -50
  175. package/lib/worker.js +0 -182
  176. /package/lib/{interceptors.js → worker/interceptors.js} +0 -0
@@ -1,22 +1,23 @@
1
1
  'use strict'
2
2
 
3
- const { tmpdir } = require('node:os')
4
- const { platform } = require('node:os')
3
+ const { platform, tmpdir } = require('node:os')
5
4
  const { join } = require('node:path')
6
- const { mkdir, rm } = require('node:fs/promises')
5
+ const { createDirectory, safeRemove } = require('@platformatic/utils')
6
+
7
7
  const fastify = require('fastify')
8
8
  const ws = require('ws')
9
- const { getRuntimeLogsDir } = require('./api-client.js')
9
+
10
10
  const errors = require('./errors')
11
+ const { getRuntimeLogsDir } = require('./utils')
11
12
 
12
13
  const PLATFORMATIC_TMP_DIR = join(tmpdir(), 'platformatic', 'runtimes')
13
14
 
14
15
  async function managementApiPlugin (app, opts) {
15
16
  app.log.warn(
16
17
  'Runtime Management API is in the experimental stage. ' +
17
- 'The feature is not subject to semantic versioning rules. ' +
18
- 'Non-backward compatible changes or removal may occur in any future release. ' +
19
- 'Use of the feature is not recommended in production environments.'
18
+ 'The feature is not subject to semantic versioning rules. ' +
19
+ 'Non-backward compatible changes or removal may occur in any future release. ' +
20
+ 'Use of the feature is not recommended in production environments.'
20
21
  )
21
22
 
22
23
  const runtime = opts.runtime
@@ -35,7 +36,7 @@ async function managementApiPlugin (app, opts) {
35
36
 
36
37
  app.post('/stop', async () => {
37
38
  app.log.debug('stop services')
38
- await runtime.close()
39
+ await runtime.close(true)
39
40
  })
40
41
 
41
42
  app.post('/reload', async () => {
@@ -47,40 +48,40 @@ async function managementApiPlugin (app, opts) {
47
48
  return runtime.getServices()
48
49
  })
49
50
 
50
- app.get('/services/:id', async (request) => {
51
+ app.get('/services/:id', async request => {
51
52
  const { id } = request.params
52
53
  app.log.debug('get service details', { id })
53
54
  return runtime.getServiceDetails(id)
54
55
  })
55
56
 
56
- app.get('/services/:id/config', async (request) => {
57
+ app.get('/services/:id/config', async request => {
57
58
  const { id } = request.params
58
59
  app.log.debug('get service config', { id })
59
60
  return runtime.getServiceConfig(id)
60
61
  })
61
62
 
62
- app.get('/services/:id/openapi-schema', async (request) => {
63
+ app.get('/services/:id/openapi-schema', async request => {
63
64
  const { id } = request.params
64
65
  app.log.debug('get openapi-schema', { id })
65
66
  return runtime.getServiceOpenapiSchema(id)
66
67
  })
67
68
 
68
- app.get('/services/:id/graphql-schema', async (request) => {
69
+ app.get('/services/:id/graphql-schema', async request => {
69
70
  const { id } = request.params
70
71
  app.log.debug('get graphql-schema', { id })
71
72
  return runtime.getServiceGraphqlSchema(id)
72
73
  })
73
74
 
74
- app.post('/services/:id/start', async (request) => {
75
+ app.post('/services/:id/start', async request => {
75
76
  const { id } = request.params
76
77
  app.log.debug('start service', { id })
77
78
  await runtime.startService(id)
78
79
  })
79
80
 
80
- app.post('/services/:id/stop', async (request) => {
81
+ app.post('/services/:id/stop', async request => {
81
82
  const { id } = request.params
82
83
  app.log.debug('stop service', { id })
83
- await runtime.stopService(id)
84
+ await runtime._stopService(id)
84
85
  })
85
86
 
86
87
  app.all('/services/:id/proxy/*', async (request, reply) => {
@@ -97,27 +98,22 @@ async function managementApiPlugin (app, opts) {
97
98
  url: requestUrl || '/',
98
99
  headers: request.headers,
99
100
  query: request.query,
100
- body: request.body
101
+ body: request.body,
101
102
  }
102
103
 
103
104
  const res = await runtime.inject(id, injectParams)
104
105
 
105
- reply
106
- .code(res.statusCode)
107
- .headers(res.headers)
108
- .send(res.body)
106
+ reply.code(res.statusCode).headers(res.headers).send(res.body)
109
107
  })
110
108
 
111
- app.get('/metrics/live', { websocket: true }, async (socket) => {
109
+ app.get('/metrics/live', { websocket: true }, async socket => {
112
110
  const cachedMetrics = runtime.getCachedMetrics()
113
111
  if (cachedMetrics.length > 0) {
114
- const serializedMetrics = cachedMetrics
115
- .map((metric) => JSON.stringify(metric))
116
- .join('\n')
112
+ const serializedMetrics = cachedMetrics.map(metric => JSON.stringify(metric)).join('\n')
117
113
  socket.send(serializedMetrics + '\n')
118
114
  }
119
115
 
120
- const eventHandler = (metrics) => {
116
+ const eventHandler = metrics => {
121
117
  const serializedMetrics = JSON.stringify(metrics)
122
118
  socket.send(serializedMetrics + '\n')
123
119
  }
@@ -147,7 +143,7 @@ async function managementApiPlugin (app, opts) {
147
143
  runtime.pipeLogsStream(stream, req.log, startLogId)
148
144
  })
149
145
 
150
- app.get('/logs/indexes', async (req) => {
146
+ app.get('/logs/indexes', async req => {
151
147
  const returnAllIds = req.query.all === 'true'
152
148
 
153
149
  if (returnAllIds) {
@@ -168,16 +164,10 @@ async function managementApiPlugin (app, opts) {
168
164
 
169
165
  reply.hijack()
170
166
 
171
- runtime.pipeLogsStream(
172
- reply.raw,
173
- req.log,
174
- startLogId,
175
- endLogId,
176
- runtimePID
177
- )
167
+ runtime.pipeLogsStream(reply.raw, req.log, startLogId, endLogId, runtimePID)
178
168
  })
179
169
 
180
- app.get('/logs/:id', async (req) => {
170
+ app.get('/logs/:id', async req => {
181
171
  const logId = parseInt(req.params.id)
182
172
  const runtimePID = parseInt(req.query.pid) || process.pid
183
173
 
@@ -186,10 +176,7 @@ async function managementApiPlugin (app, opts) {
186
176
  throw new errors.LogFileNotFound(logId)
187
177
  }
188
178
 
189
- const logFileStream = await runtime.getLogFileStream(
190
- logId,
191
- runtimePID
192
- )
179
+ const logFileStream = await runtime.getLogFileStream(logId, runtimePID)
193
180
  return logFileStream
194
181
  })
195
182
  }
@@ -200,13 +187,11 @@ async function startManagementApi (runtime, configManager) {
200
187
  try {
201
188
  const runtimePIDDir = join(PLATFORMATIC_TMP_DIR, runtimePID.toString())
202
189
  if (platform() !== 'win32') {
203
- await rm(runtimePIDDir, { recursive: true, force: true }).catch()
204
- await mkdir(runtimePIDDir, { recursive: true })
190
+ await createDirectory(runtimePIDDir, true)
205
191
  }
206
192
 
207
193
  const runtimeLogsDir = getRuntimeLogsDir(configManager.dirname, process.pid)
208
- await rm(runtimeLogsDir, { recursive: true, force: true }).catch()
209
- await mkdir(runtimeLogsDir, { recursive: true })
194
+ await createDirectory(runtimeLogsDir, true)
210
195
 
211
196
  let socketPath = null
212
197
  if (platform() === 'win32') {
@@ -221,13 +206,13 @@ async function startManagementApi (runtime, configManager) {
221
206
 
222
207
  managementApi.addHook('onClose', async () => {
223
208
  if (platform() !== 'win32') {
224
- await rm(runtimePIDDir, { recursive: true, force: true }).catch()
209
+ await safeRemove(runtimePIDDir)
225
210
  }
226
211
  })
227
212
 
228
213
  await managementApi.listen({ path: socketPath })
229
214
  return managementApi
230
- /* c8 ignore next 4 */
215
+ /* c8 ignore next 4 */
231
216
  } catch (err) {
232
217
  console.error(err)
233
218
  process.exit(1)
@@ -2,7 +2,7 @@
2
2
 
3
3
  const fastify = require('fastify')
4
4
 
5
- async function startPrometheusServer (runtimeApiClient, opts) {
5
+ async function startPrometheusServer (runtime, opts) {
6
6
  const host = opts.hostname ?? '0.0.0.0'
7
7
  const port = opts.port ?? 9090
8
8
  const metricsEndpoint = opts.endpoint ?? '/metrics'
@@ -10,10 +10,6 @@ async function startPrometheusServer (runtimeApiClient, opts) {
10
10
 
11
11
  const promServer = fastify({ name: 'Prometheus server' })
12
12
 
13
- runtimeApiClient.on('close', async () => {
14
- await promServer.close()
15
- })
16
-
17
13
  let onRequestHook
18
14
  if (auth) {
19
15
  const { username, password } = auth
@@ -24,7 +20,7 @@ async function startPrometheusServer (runtimeApiClient, opts) {
24
20
  return reply.code(401).send({ message: 'Unauthorized' })
25
21
  }
26
22
  return done()
27
- }
23
+ },
28
24
  })
29
25
  onRequestHook = promServer.basicAuth
30
26
  }
@@ -36,9 +32,9 @@ async function startPrometheusServer (runtimeApiClient, opts) {
36
32
  onRequest: onRequestHook,
37
33
  handler: async (req, reply) => {
38
34
  reply.type('text/plain')
39
- const { metrics } = await runtimeApiClient.getMetrics('text')
35
+ const { metrics } = await runtime.getMetrics('text')
40
36
  return metrics
41
- }
37
+ },
42
38
  })
43
39
 
44
40
  await promServer.listen({ port, host })
@@ -46,5 +42,5 @@ async function startPrometheusServer (runtimeApiClient, opts) {
46
42
  }
47
43
 
48
44
  module.exports = {
49
- startPrometheusServer
45
+ startPrometheusServer,
50
46
  }