@nextdog/node 1.0.0 → 1.1.1

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/dist/sidecar.js CHANGED
@@ -1,23 +1,69 @@
1
1
  import { spawn } from 'node:child_process';
2
- import { readFile, writeFile, mkdir, open } from 'node:fs/promises';
3
- import { homedir } from 'node:os';
4
- import { join, dirname } from 'node:path';
2
+ import { existsSync } from 'node:fs';
3
+ import { mkdir, open, readFile, writeFile } from 'node:fs/promises';
5
4
  import { createRequire } from 'node:module';
5
+ import { homedir } from 'node:os';
6
+ import { dirname, join, parse as parsePath } from 'node:path';
7
+ import { fileURLToPath, pathToFileURL } from 'node:url';
8
+ import { NEXTDOG_HEALTH_MARKER } from '@nextdog/core';
6
9
  const NEXTDOG_DIR = join(homedir(), '.nextdog');
7
10
  const PID_FILE = join(NEXTDOG_DIR, 'nextdog.pid');
8
11
  const LOG_FILE = join(NEXTDOG_DIR, 'sidecar.log');
9
- async function isHealthy(url) {
12
+ const PROBE_TIMEOUT_MS = 2000;
13
+ /**
14
+ * Single source of truth for reading and classifying `${url}/health`. Both
15
+ * {@link isHealthy} and {@link isForeignOccupant} are thin views over this so
16
+ * the fetch/timeout/JSON/marker logic lives in exactly one place.
17
+ *
18
+ * @internal exported for testing.
19
+ */
20
+ export async function probeHealth(url) {
10
21
  try {
11
22
  const controller = new AbortController();
12
- const timeout = setTimeout(() => controller.abort(), 2000);
13
- const res = await fetch(`${url}/health`, { signal: controller.signal });
14
- clearTimeout(timeout);
15
- return res.ok;
23
+ const timeout = setTimeout(() => controller.abort(), PROBE_TIMEOUT_MS);
24
+ let res;
25
+ try {
26
+ res = await fetch(`${url}/health`, { signal: controller.signal });
27
+ }
28
+ finally {
29
+ clearTimeout(timeout);
30
+ }
31
+ if (!res.ok)
32
+ return 'absent';
33
+ let body;
34
+ try {
35
+ body = await res.json();
36
+ }
37
+ catch {
38
+ return 'foreign'; // 2xx, but not even JSON — something else holds the port.
39
+ }
40
+ const marked = typeof body === 'object' &&
41
+ body !== null &&
42
+ body.service === NEXTDOG_HEALTH_MARKER;
43
+ return marked ? 'nextdog' : 'foreign';
16
44
  }
17
45
  catch {
18
- return false;
46
+ return 'absent'; // connection refused / aborted — port is free, not foreign.
19
47
  }
20
48
  }
49
+ /**
50
+ * Whether `${url}/health` is answered by a genuine NextDog sidecar. A 2xx alone
51
+ * is NOT enough: the body must be JSON carrying the `service: "nextdog"`
52
+ * signature, so we never silently ship telemetry to a foreign process (#17).
53
+ *
54
+ * @internal exported for testing.
55
+ */
56
+ export async function isHealthy(url) {
57
+ return (await probeHealth(url)) === 'nextdog';
58
+ }
59
+ /**
60
+ * Whether `${url}/health` is answered by a process that is NOT a NextDog
61
+ * sidecar (a 2xx lacking the signature). Distinguishes "foreign occupant" from
62
+ * "nothing listening" — the latter returns false.
63
+ */
64
+ async function isForeignOccupant(url) {
65
+ return (await probeHealth(url)) === 'foreign';
66
+ }
21
67
  async function isProcessRunning(pid) {
22
68
  try {
23
69
  process.kill(pid, 0);
@@ -37,21 +83,102 @@ async function readPid() {
37
83
  return null;
38
84
  }
39
85
  }
40
- function resolveCoreCliPath() {
41
- const require = createRequire(import.meta.url);
86
+ /**
87
+ * A `file://` URL points at a real on-disk location only if none of its path
88
+ * segments is a bundler-virtual placeholder. Turbopack rewrites a bundled
89
+ * module's `import.meta.url` to a virtual URL carrying a literal `[project]`
90
+ * segment (and similar `[...]` markers), so `createRequire()` on that URL
91
+ * resolves dependencies to non-existent `[project]/node_modules/...` paths.
92
+ * See issue #15.
93
+ *
94
+ * @internal exported for testing.
95
+ */
96
+ export function isRealFileUrl(url) {
97
+ if (!url.startsWith('file:'))
98
+ return false;
99
+ let p;
42
100
  try {
43
- const corePkgPath = require.resolve('@nextdog/core/package.json');
44
- return join(dirname(corePkgPath), 'dist', 'cli.js');
101
+ p = fileURLToPath(url);
45
102
  }
46
103
  catch {
47
- // Fallback: try resolving the bin entry directly
104
+ return false;
105
+ }
106
+ // Reject any virtual `[...]` path segment (e.g. Turbopack's `[project]`).
107
+ return !/\[[^/\\]+\]/.test(p);
108
+ }
109
+ function coreCliFromPackageJson(corePkgPath) {
110
+ return join(dirname(corePkgPath), 'dist', 'cli.js');
111
+ }
112
+ /**
113
+ * Resolve the absolute path to the `@nextdog/core` CLI (`dist/cli.js`) in a way
114
+ * that works regardless of the bundler the host dev server uses.
115
+ *
116
+ * Resolution order, returning the first candidate that exists on disk:
117
+ * 1. `createRequire(anchorUrl)` — the module's own `import.meta.url`, but only
118
+ * when it is a real on-disk URL (skipped under Turbopack's virtual URL).
119
+ * 2. `createRequire(<projectRoot>/package.json)` — resolves through the real
120
+ * `node_modules` graph of the user's project, independent of any bundler.
121
+ * 3. A direct walk up the `node_modules` chain from the project root.
122
+ *
123
+ * Each candidate is validated against the filesystem before being returned, so
124
+ * a bundler that hands us a plausible-but-wrong path never makes it through.
125
+ *
126
+ * @internal exported for testing.
127
+ */
128
+ export function resolveCoreCliPath(opts = {}) {
129
+ const anchorUrl = opts.anchorUrl ?? import.meta.url;
130
+ const projectRoot = opts.projectRoot ?? process.cwd();
131
+ const tried = [];
132
+ const tryRequire = (fromUrl) => {
133
+ let req;
48
134
  try {
49
- return require.resolve('@nextdog/core/dist/cli.js');
135
+ req = createRequire(fromUrl);
50
136
  }
51
137
  catch {
52
- throw new Error('@nextdog/core not found. Make sure it is installed: npm install @nextdog/core');
138
+ return undefined;
139
+ }
140
+ for (const spec of ['@nextdog/core/package.json', '@nextdog/core/dist/cli.js']) {
141
+ try {
142
+ const resolved = req.resolve(spec);
143
+ const cli = spec.endsWith('package.json') ? coreCliFromPackageJson(resolved) : resolved;
144
+ tried.push(cli);
145
+ if (existsSync(cli))
146
+ return cli;
147
+ }
148
+ catch {
149
+ // not resolvable from this anchor — try the next spec/anchor
150
+ }
53
151
  }
152
+ return undefined;
153
+ };
154
+ // 1. The module's own location — but only if it's a real, non-virtual URL.
155
+ // Under Turbopack this is virtual and is skipped so we don't resolve to a
156
+ // bogus `[project]/node_modules/...` path.
157
+ if (isRealFileUrl(anchorUrl)) {
158
+ const fromAnchor = tryRequire(anchorUrl);
159
+ if (fromAnchor)
160
+ return fromAnchor;
54
161
  }
162
+ // 2. Resolve through the real project root's module graph. `process.cwd()` is
163
+ // the user's project directory and is never virtualized by a bundler.
164
+ const fromProject = tryRequire(pathToFileURL(join(projectRoot, 'package.json')).href);
165
+ if (fromProject)
166
+ return fromProject;
167
+ // 3. Last-resort: walk up node_modules from the project root and probe for an
168
+ // installed @nextdog/core (covers hoisted and nested layouts).
169
+ let dir = projectRoot;
170
+ for (;;) {
171
+ const cli = join(dir, 'node_modules', '@nextdog', 'core', 'dist', 'cli.js');
172
+ tried.push(cli);
173
+ if (existsSync(cli))
174
+ return cli;
175
+ const parent = parsePath(dir).dir;
176
+ if (parent === dir)
177
+ break;
178
+ dir = parent;
179
+ }
180
+ throw new Error('@nextdog/core not found. Make sure it is installed: npm install @nextdog/core' +
181
+ (tried.length ? ` (looked in: ${tried.join(', ')})` : ''));
55
182
  }
56
183
  async function spawnSidecar(url) {
57
184
  const coreCliPath = resolveCoreCliPath();
@@ -71,28 +198,49 @@ async function spawnSidecar(url) {
71
198
  }
72
199
  // Wait for the sidecar to become healthy (up to 3 seconds)
73
200
  for (let i = 0; i < 6; i++) {
74
- await new Promise(r => setTimeout(r, 500));
201
+ await new Promise((r) => setTimeout(r, 500));
75
202
  if (await isHealthy(url))
76
203
  return;
77
204
  }
78
205
  console.warn(`[nextdog] sidecar spawned (PID ${child.pid}) but health check not passing yet`);
79
206
  console.warn(`[nextdog] check ${LOG_FILE} for sidecar logs`);
80
207
  }
208
+ /** Track ports we've already warned about so the foreign-occupant notice fires once. */
209
+ const warnedForeignPorts = new Set();
210
+ function warnForeignOccupant(url) {
211
+ if (warnedForeignPorts.has(url))
212
+ return;
213
+ warnedForeignPorts.add(url);
214
+ console.warn(`[nextdog] ${url} is already in use by a process that is NOT a NextDog sidecar ` +
215
+ `(its /health response lacks the NextDog signature).`);
216
+ console.warn(`[nextdog] refusing to adopt it — no telemetry will be sent and no dashboard will start. ` +
217
+ `Free the port, or set NEXTDOG_URL to a different port.`);
218
+ }
219
+ /** Exposed for tests so each case starts from a clean warning state. */
220
+ export function _resetForeignOccupantWarnings() {
221
+ warnedForeignPorts.clear();
222
+ }
81
223
  export async function ensureSidecar(url) {
82
224
  // Already running and healthy — fast path
83
225
  if (await isHealthy(url))
84
- return;
226
+ return { ready: true, foreignOccupant: false };
227
+ // The port answers 2xx but without the NextDog signature: a foreign process
228
+ // holds it. Do not adopt it; warn once and tell the caller to skip telemetry.
229
+ if (await isForeignOccupant(url)) {
230
+ warnForeignOccupant(url);
231
+ return { ready: false, foreignOccupant: true };
232
+ }
85
233
  // PID file exists and process is alive — wait for it to become healthy
86
234
  const pid = await readPid();
87
- if (pid && await isProcessRunning(pid)) {
235
+ if (pid && (await isProcessRunning(pid))) {
88
236
  for (let i = 0; i < 4; i++) {
89
- await new Promise(r => setTimeout(r, 500));
237
+ await new Promise((r) => setTimeout(r, 500));
90
238
  if (await isHealthy(url))
91
- return;
239
+ return { ready: true, foreignOccupant: false };
92
240
  }
93
241
  console.warn(`[nextdog] sidecar process ${pid} is running but not responding at ${url}`);
94
242
  console.warn(`[nextdog] check ${LOG_FILE} for sidecar logs`);
95
- return;
243
+ return { ready: false, foreignOccupant: false };
96
244
  }
97
245
  // No sidecar running — spawn one
98
246
  try {
@@ -101,6 +249,16 @@ export async function ensureSidecar(url) {
101
249
  catch (err) {
102
250
  console.warn('[nextdog] failed to spawn sidecar:', err.message);
103
251
  console.warn('[nextdog] you can start it manually with: npx nextdog');
252
+ return { ready: false, foreignOccupant: false };
253
+ }
254
+ // Confirm the thing now answering is genuinely our sidecar (a foreign process
255
+ // could have bound the port in the race window).
256
+ if (await isHealthy(url))
257
+ return { ready: true, foreignOccupant: false };
258
+ if (await isForeignOccupant(url)) {
259
+ warnForeignOccupant(url);
260
+ return { ready: false, foreignOccupant: true };
104
261
  }
262
+ return { ready: false, foreignOccupant: false };
105
263
  }
106
264
  //# sourceMappingURL=sidecar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sidecar.js","sourceRoot":"","sources":["../src/sidecar.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sidecar.js","sourceRoot":"","sources":["../src/sidecar.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextdog/node",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "Shared Node.js instrumentation for NextDog — OTel exporter, sidecar, console capture",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -11,7 +11,8 @@
11
11
  "./sidecar": "./dist/sidecar.js",
12
12
  "./console-patch": "./dist/console-patch.js",
13
13
  "./request-capture": "./dist/request-capture.js",
14
- "./request-context": "./dist/request-context.js"
14
+ "./request-context": "./dist/request-context.js",
15
+ "./instrumentation": "./dist/instrumentation.js"
15
16
  },
16
17
  "files": [
17
18
  "dist"
@@ -24,7 +25,7 @@
24
25
  "@opentelemetry/sdk-trace-node": "^1",
25
26
  "@opentelemetry/resources": "^1",
26
27
  "@opentelemetry/semantic-conventions": "^1",
27
- "@nextdog/core": "1.0.0"
28
+ "@nextdog/core": "1.1.1"
28
29
  },
29
30
  "devDependencies": {
30
31
  "@types/node": "^25",
@@ -46,6 +47,7 @@
46
47
  ],
47
48
  "scripts": {
48
49
  "build": "tsc",
49
- "test": "vitest run --passWithNoTests"
50
+ "test": "vitest run --passWithNoTests",
51
+ "typecheck": "tsc --noEmit"
50
52
  }
51
53
  }