dotrino-content 0.2.0 → 0.2.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dotrino-content",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Nodo de contenido del ecosistema Dotrino: guarda los bytes del usuario direccionados por su hash (cid), en su propia maquina y, si el dueno quiere, respaldados en su propio bucket (R2, Backblaze, Hetzner, Storj o S3). Lo publico sale por URL directa; lo privado, cifrado y solo por la red Dotrino.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -23,9 +23,9 @@
23
23
  "typescript": "5.9.3"
24
24
  },
25
25
  "dependencies": {
26
- "@dotrino/identity": "0.55.0",
26
+ "@dotrino/identity": "0.56.0",
27
27
  "@dotrino/remote-agent": "0.4.1",
28
- "@dotrino/vault": "0.27.0"
28
+ "@dotrino/vault": "0.28.0"
29
29
  },
30
30
  "keywords": [
31
31
  "dotrino",
package/src/storage.js CHANGED
@@ -120,8 +120,8 @@ export async function checkBuckets (cfg, { priv, pub }, f = fetch) {
120
120
  const cid = 'sha256-' + createHash('sha256').update(bytes).digest('hex')
121
121
  await pub.put(cid, bytes, { sha256: cid.slice(7), size: bytes.length, contentType: 'text/plain' })
122
122
  const r = await f(`${cfg.baseUrl.replace(/\/+$/, '')}/${cid}`, { method: 'GET' })
123
- const cuerpo = r.ok ? (await r.text()).trim() : ''
124
- if (cuerpo !== PROBE) {
123
+ const body = r.ok ? (await r.text()).trim() : ''
124
+ if (body !== PROBE) {
125
125
  warn.push(`${cfg.baseUrl} no sirve lo que hay en «${cfg.pub}» (HTTP ${r.status}): revisa que el dominio esté conectado AL BUCKET desde el panel`)
126
126
  }
127
127
  } catch (e) {
package/src/vaultEnv.js CHANGED
@@ -84,19 +84,21 @@ export function startVaultConfig ({ dir = serviceDir(), onSecrets, log = console
84
84
  let stopped = false
85
85
  let watcher = null
86
86
  /** @type {(v:any)=>void} */
87
- let llegaron = () => {}
88
- const ready = new Promise((resolve) => { llegaron = resolve })
87
+ let arrive = () => {}
88
+ const ready = new Promise((resolve) => { arrive = resolve })
89
89
 
90
90
  // La configuración decide QUÉ ALMACÉN usa este node, así que quien arranca la espera…
91
91
  // pero con plazo. Si la bóveda está apagada, seguir esperando sería dejar al usuario
92
92
  // sin su propio contenido local por una pieza que el ecosistema promete no exigir
93
93
  // (`CLAUDE.md`: ninguna app puede requerir un daemon encendido). Al vencer el plazo se
94
94
  // sigue en local, y cuando la configuración llegue, `watchEnv` reinicia con ella.
95
- const plazo = setTimeout(() => {
96
- log(`[vault] la bóveda no contestó en ${Math.round(firstWaitMs / 1000)}s: arranco con lo local y sigo esperando`)
97
- llegaron(null)
95
+ let expired = false
96
+ const deadline = setTimeout(() => {
97
+ expired = true
98
+ log(`[vault] la bóveda no contestó en ${Math.round(firstWaitMs / 1000)}s: arranco con lo local y me reinicio cuando llegue`)
99
+ arrive(null)
98
100
  }, firstWaitMs)
99
- plazo.unref?.()
101
+ deadline.unref?.()
100
102
 
101
103
  ;(async () => {
102
104
  const { waitForSecrets } = await import('@dotrino/vault/service')
@@ -111,10 +113,22 @@ export function startVaultConfig ({ dir = serviceDir(), onSecrets, log = console
111
113
  const { injected, overridden } = applyEnv(secrets)
112
114
  log(`[vault] ${injected.length} valor(es) del vault aplicados al entorno`)
113
115
  if (overridden.length) log(`[vault] pisaron el entorno de esta máquina: ${overridden.join(', ')}`)
114
- clearTimeout(plazo)
115
- llegaron(secrets)
116
+ clearTimeout(deadline)
117
+ arrive(secrets)
116
118
  onSecrets?.(secrets)
117
119
 
120
+ // LLEGÓ TARDE: el node ya arrancó, y arrancó con lo que había — o sea, con el
121
+ // almacén equivocado si la configuración dice otro. `watchEnv` no sirve aquí
122
+ // porque solo reacciona a CAMBIOS, y esto es la primera llegada: sin esto, un node
123
+ // que arrancó antes que su bóveda se queda en local para siempre, con la
124
+ // configuración correcta puesta en el entorno y sin usarla. Se sale, y el
125
+ // supervisor lo levanta ya con todo.
126
+ if (expired) {
127
+ log('[vault] llegó la configuración después de arrancar: me reinicio para tomarla')
128
+ setTimeout(() => process.exit(0), 300)
129
+ return
130
+ }
131
+
118
132
  // Sin `onUpdate`, `watchEnv` sale del proceso él mismo (con el código que
119
133
  // corresponda: 0 si cambió la configuración, 1 si revocaron a este agente, para
120
134
  // que un supervisor que lo relance no gire en silencio). Es lo que queremos, así
@@ -131,13 +145,13 @@ export function startVaultConfig ({ dir = serviceDir(), onSecrets, log = console
131
145
  }
132
146
  : {})
133
147
  })
134
- })().catch((e) => { log(`[vault] no se pudo leer la configuración: ${e.message}`); clearTimeout(plazo); llegaron(null) })
148
+ })().catch((e) => { log(`[vault] no se pudo leer la configuración: ${e.message}`); clearTimeout(deadline); arrive(null) })
135
149
 
136
150
  return {
137
151
  enabled: true,
138
152
  /** Resuelve con la configuración, o con `null` si venció el plazo o falló. */
139
153
  ready,
140
- close () { stopped = true; clearTimeout(plazo); try { watcher?.close?.() } catch (_) {} }
154
+ close () { stopped = true; clearTimeout(deadline); try { watcher?.close?.() } catch (_) {} }
141
155
  }
142
156
  }
143
157