@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.
- package/.claude/settings.local.json +24 -0
- package/package.json +1 -1
- package/plugins/init.js +17 -0
- package/test/init.test.js +52 -0
|
@@ -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
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()
|