@glassnote/client 2.4.5 → 2.4.7

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 (2) hide show
  1. package/bin/glassnote.js +51 -6
  2. package/package.json +1 -1
package/bin/glassnote.js CHANGED
@@ -27,8 +27,15 @@ const MARK_B = '# <<< glassnote <<<';
27
27
  // El PATH que se le da a npm lleva delante nuestro bin: si install.sh tuvo que bajar
28
28
  // Node, sus enlaces viven ahí y de otro modo npm no existiría para este proceso.
29
29
  function npmEnv() {
30
+ // El directorio del node va en el PATH, no solo BIN_DIR: npm lanza los scripts de
31
+ // instalacion por cmd.exe (`cmd /c node install.js`, el postinstall de electron) y
32
+ // esos hijos buscan `node` en el PATH. Sin esto la actualizacion moria a medias con
33
+ // «"node" no se reconoce como un comando», dejando el paquete sin binario.
34
+ const nodeBinary = mode.resolveNodeBinary(process.execPath);
35
+ const dirs = [mode.BIN_DIR];
36
+ if (nodeBinary) dirs.push(path.dirname(nodeBinary));
30
37
  return Object.assign({}, process.env, {
31
- PATH: `${mode.BIN_DIR}${path.delimiter}${process.env.PATH || ''}`,
38
+ PATH: `${dirs.join(path.delimiter)}${path.delimiter}${process.env.PATH || ''}`,
32
39
  // Cache propia, bajo ~/.glassnote. Un ~/.npm con archivos de root —herencia de
33
40
  // cualquier `sudo npm` viejo— hace que npm muera con EACCES antes de bajar nada,
34
41
  // y el usuario tiene que andar con chown. Se pisa a propósito el npm_config_cache
@@ -103,6 +110,24 @@ function sleepSync(ms) {
103
110
  Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
104
111
  }
105
112
 
113
+ // Dormir un rato fijo no alcanzaba. En Windows npm no puede borrar el árbol mientras
114
+ // quede vivo UN proceso del cliente, y electron cierra media docena de procesos hijos:
115
+ // con los 4 segundos de antes npm entraba con la app a medio cerrar y salía con
116
+ // «EPERM: rmdir ...\node_modules\got\dist», dejando la instalación rota. Se espera a
117
+ // que el servidor local del cliente deje de responder, que es la señal de que ya no está.
118
+ function esperarAQueCierre(maxMs) {
119
+ const tope = Date.now() + Math.max(maxMs, 30000);
120
+ while (Date.now() < tope) {
121
+ if (!clienteEnMarcha()) {
122
+ sleepSync(1500); // margen para que el SO suelte los handles
123
+ return true;
124
+ }
125
+ sleepSync(1000);
126
+ }
127
+ console.error('glassnote: el cliente sigue en marcha; se actualiza igual y puede fallar.');
128
+ return false;
129
+ }
130
+
106
131
  const log = (...args) => console.log(...args);
107
132
  // Cada paso se dice EN CUANTO EMPIEZA: lo que hace que un instalador parezca colgado
108
133
  // no es que tarde, es que tarde sin decir en qué está.
@@ -204,10 +229,10 @@ function addToPathUnix() {
204
229
  return { touched, line };
205
230
  }
206
231
 
207
- function addToPathWindows() {
232
+ function addToPathWindows(dir = mode.BIN_DIR) {
208
233
  // Nada de `setx`: trunca el PATH a 1024 caracteres y se come el de la gente.
209
234
  const ps = [
210
- "$dir = '" + mode.BIN_DIR.replace(/'/g, "''") + "'",
235
+ "$dir = '" + dir.replace(/'/g, "''") + "'",
211
236
  "$cur = [Environment]::GetEnvironmentVariable('Path','User')",
212
237
  "if ($null -eq $cur) { $cur = '' }",
213
238
  "if (($cur -split ';') -notcontains $dir) {",
@@ -220,7 +245,22 @@ function addToPathWindows() {
220
245
  encoding: 'utf8',
221
246
  });
222
247
  const added = res.status === 0 && String(res.stdout).includes('added');
223
- return { touched: added ? ['PATH de usuario (sin administrador)'] : [], line: mode.BIN_DIR };
248
+ return { touched: added ? ['PATH de usuario (sin administrador)'] : [], line: dir };
249
+ }
250
+
251
+ // El shim `glassnote.cmd` que crea npm invoca `node` del PATH. Cuando el Node lo bajó el
252
+ // instalador a ~/.glassnote, ese directorio solo quedaba en el PATH de la sesión de
253
+ // PowerShell que corrió la instalación: en una terminal nueva —o en cualquier proceso
254
+ // posterior— `glassnote` moría con «"node" no se reconoce como un comando». Se agrega el
255
+ // directorio del node al PATH de usuario, igual que BIN_DIR.
256
+ function addNodeToPathWindows() {
257
+ if (!IS_WIN) return null;
258
+ const nodeBinary = mode.resolveNodeBinary(process.execPath);
259
+ // Solo el node que trajimos nosotros: el del sistema ya está donde tiene que estar.
260
+ if (!nodeBinary || !mode.isInside(nodeBinary, mode.HOME_DIR)) return null;
261
+ const dir = path.dirname(nodeBinary);
262
+ const res = addToPathWindows(dir);
263
+ return res.touched.length ? dir : null;
224
264
  }
225
265
 
226
266
  function removeFromPathUnix() {
@@ -253,7 +293,10 @@ function removeFromPathWindows() {
253
293
  "$dir = '" + mode.BIN_DIR.replace(/'/g, "''") + "'",
254
294
  "$cur = [Environment]::GetEnvironmentVariable('Path','User')",
255
295
  "if ($null -eq $cur) { Write-Output 'absent'; exit }",
256
- "$new = (($cur -split ';') | Where-Object { $_ -ne '' -and $_ -ne $dir }) -join ';'",
296
+ // Se quita cualquier entrada bajo ~/.glassnote, no solo BIN_DIR: el install tambien
297
+ // agrega el directorio del node que bajo, y dejarlo seria una ruta muerta.
298
+ "$home2 = '" + mode.HOME_DIR.replace(/'/g, "''") + "'",
299
+ "$new = (($cur -split ';') | Where-Object { $_ -ne '' -and $_ -ne $dir -and -not $_.StartsWith($home2, [StringComparison]::OrdinalIgnoreCase) }) -join ';'",
257
300
  'if ($new -ne $cur) {',
258
301
  " [Environment]::SetEnvironmentVariable('Path', $new, 'User')",
259
302
  " Write-Output 'removed'",
@@ -457,6 +500,8 @@ function cmdInstall(args) {
457
500
  if (!noPath) {
458
501
  pathInfo = IS_WIN ? addToPathWindows() : addToPathUnix();
459
502
  if (pathInfo.touched.length) step(`agregado al PATH en: ${pathInfo.touched.join(' ')}`);
503
+ const nodeDir = addNodeToPathWindows();
504
+ if (nodeDir) step(`agregado al PATH: ${nodeDir} (lo necesita el comando glassnote)`);
460
505
  }
461
506
 
462
507
  log('');
@@ -512,7 +557,7 @@ function cmdUpdate(args) {
512
557
  );
513
558
  const version = positional[0] || 'latest';
514
559
 
515
- if (waitMs > 0) sleepSync(waitMs);
560
+ if (waitMs > 0) esperarAQueCierre(waitMs);
516
561
 
517
562
  // El cwd no puede estar dentro de lo que npm va a borrar: en Windows un directorio
518
563
  // que es el cwd de un proceso vivo no se puede eliminar, y ese proceso es este.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glassnote/client",
3
- "version": "2.4.5",
3
+ "version": "2.4.7",
4
4
  "description": "GlassNote — cliente de escritorio de notas superpuestas. Se instala con npx, sin instaladores nativos ni firmas.",
5
5
  "main": "main.js",
6
6
  "publishConfig": {