@platformatic/watt-extra 1.13.0 → 1.14.0

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.
@@ -0,0 +1,24 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Read(//work/workspaces/workspace-platformatic/platformatic/**)",
5
+ "Bash(npx borp:*)",
6
+ "Bash(timeout 30 npx borp -c 1 --timeout=20000 ./test/trigger-flamegraphs.test.js)",
7
+ "Bash(xargs cat:*)",
8
+ "Bash(pnpm install)",
9
+ "Bash(find:*)",
10
+ "Bash(cat:*)",
11
+ "WebFetch(domain:github.com)",
12
+ "Bash(node --test:*)",
13
+ "Bash(for i in 1 2 3)",
14
+ "Bash(do echo \"Run $i:\")",
15
+ "Bash(done)",
16
+ "Bash(git stash:*)",
17
+ "Bash(echo:*)",
18
+ "Bash(grep:*)",
19
+ "Bash(gh api:*)"
20
+ ],
21
+ "deny": [],
22
+ "ask": []
23
+ }
24
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platformatic/watt-extra",
3
- "version": "1.13.0",
3
+ "version": "1.14.0",
4
4
  "description": "The Platformatic runtime manager",
5
5
  "type": "module",
6
6
  "scripts": {
package/plugins/init.js CHANGED
@@ -52,6 +52,15 @@ async function initPlugin (app) {
52
52
  app.instanceConfig = instanceConfig
53
53
  app.instanceId = instanceId
54
54
 
55
+ // workerMissingVersion is true only when the runtime
56
+ // already spawned without this value (ICC was unreachable at boot).
57
+ const newDeploymentVersion = instanceConfig?.deploymentVersion
58
+ const workerMissingVersion = !!newDeploymentVersion &&
59
+ process.env.PLT_DEPLOYMENT_VERSION !== newDeploymentVersion
60
+ if (newDeploymentVersion) {
61
+ process.env.PLT_DEPLOYMENT_VERSION = newDeploymentVersion
62
+ }
63
+
55
64
  // If runtime already started (ICC recovery after startup), update its instance config
56
65
  if (app.watt?.runtime) {
57
66
  await app.watt.updateInstanceConfig(instanceConfig)
@@ -60,6 +69,14 @@ async function initPlugin (app) {
60
69
  await app.setupAlerts?.()
61
70
  await app.setupHealthSignals?.()
62
71
  await app.setupFlamegraphs?.()
72
+
73
+ // The app already spawned (ICC was unreachable at boot), so its worker's env is
74
+ // frozen without the version. Push it via the shared context: the runtime
75
+ // delivers it live to the running worker (no restart).
76
+ if (workerMissingVersion) {
77
+ app.log.info({ deploymentVersion: newDeploymentVersion }, 'Publishing deployment version to the shared context after startup')
78
+ await app.watt.updateSharedContext({ deploymentVersion: newDeploymentVersion })
79
+ }
63
80
  }
64
81
  }
65
82
  try {
package/test/init.test.js CHANGED
@@ -374,6 +374,58 @@ test('init plugin calls updateInstanceConfig on watt when ICC becomes available
374
374
  equal(setupFlamegraphsCalled, true)
375
375
  })
376
376
 
377
+ test('init plugin sets PLT_DEPLOYMENT_VERSION and pushes it to the shared context on ICC recovery', async (t) => {
378
+ const applicationName = 'test-app-version-recovery'
379
+ const applicationId = randomUUID()
380
+
381
+ const icc = await startICC(t, {
382
+ applicationId,
383
+ controlPlaneResponse: {
384
+ applicationId,
385
+ applicationName,
386
+ deploymentVersion: 'v9',
387
+ config: {}
388
+ }
389
+ })
390
+ t.after(async () => { await icc.close() })
391
+
392
+ const originalVersion = process.env.PLT_DEPLOYMENT_VERSION
393
+ delete process.env.PLT_DEPLOYMENT_VERSION
394
+ t.after(() => {
395
+ if (originalVersion) process.env.PLT_DEPLOYMENT_VERSION = originalVersion
396
+ else delete process.env.PLT_DEPLOYMENT_VERSION
397
+ })
398
+
399
+ // Boot with ICC unavailable -> the app starts without a version.
400
+ const app = createMockApp({
401
+ PLT_APP_NAME: applicationName,
402
+ PLT_APP_DIR: '/test/dir',
403
+ PLT_ICC_URL: 'http://127.0.0.1:9999',
404
+ PLT_CONTROL_PLANE_URL: 'http://127.0.0.1:9999/control-plane'
405
+ })
406
+ await initPlugin(app)
407
+ equal(app.instanceConfig, null)
408
+ equal(process.env.PLT_DEPLOYMENT_VERSION, undefined)
409
+
410
+ // Runtime already spawned (env frozen without the version); capture pushes.
411
+ let pushedContext = null
412
+ app.watt.runtime = {}
413
+ app.watt.updateInstanceConfig = async () => {}
414
+ app.watt.updateSharedContext = async (ctx) => { pushedContext = ctx }
415
+ app.setupAlerts = async () => {}
416
+ app.setupHealthSignals = async () => {}
417
+ app.setupFlamegraphs = async () => {}
418
+
419
+ // ICC becomes available.
420
+ app.env.PLT_ICC_URL = `http://127.0.0.1:${icc.server.address().port}`
421
+ app.env.PLT_CONTROL_PLANE_URL = `http://127.0.0.1:${icc.server.address().port}/control-plane`
422
+ await app.initApplication()
423
+
424
+ // Applied to the env (for future spawns) and pushed live to the running worker.
425
+ equal(process.env.PLT_DEPLOYMENT_VERSION, 'v9')
426
+ equal(pushedContext?.deploymentVersion, 'v9')
427
+ })
428
+
377
429
  test('updateInstanceConfig calls runtime.updateMetricsConfig with merged config', async (t) => {
378
430
  const applicationName = 'test-app-metrics'
379
431
  const applicationId = randomUUID()