n8n-nodes-speedtest-net 0.2.0 → 0.2.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/README.md CHANGED
@@ -22,7 +22,7 @@ npm run build
22
22
  npm pack
23
23
  ```
24
24
 
25
- Install the generated `n8n-nodes-speedtest-net-0.2.0.tgz` into your self-hosted n8n community-package directory (typically `~/.n8n/nodes`) with npm, using the n8n file owner's account, then restart n8n. Install on all workers in queue mode. The official CLI must be installed separately in each execution environment.
25
+ Install the generated `n8n-nodes-speedtest-net-0.2.1.tgz` into your self-hosted n8n community-package directory (typically `~/.n8n/nodes`) with npm, using the n8n file owner's account, then restart n8n. Install on all workers in queue mode. The official CLI must be installed separately in each execution environment.
26
26
 
27
27
  For local development, point `N8N_CUSTOM_EXTENSIONS` at the built `dist/nodes` directory and make the project's dependencies available alongside it. Real n8n discovery and real Ookla requests still require verification in your environment.
28
28
 
@@ -34,8 +34,13 @@ For local development, point `N8N_CUSTOM_EXTENSIONS` at the built `dist/nodes` d
34
34
 
35
35
  Success preserves the CLI JSON result and adds decimal `downloadMbps` and `uploadMbps`. Original bandwidth fields remain in bytes/second. All output items are linked to their input items.
36
36
 
37
- ## Structured errors (default)
38
- **Return Errors as Data is enabled by default.** Failures return JSON on the regular output instead of failing the node. Route errors with an IF node using `{{ $json.success === false }}`. Disable the switch to use normal n8n failure handling; n8n's continue-on-fail setting also produces structured JSON.
37
+ ## Structured errors
38
+ Failures use native n8n error handling. There is no separate error-data switch:
39
+ - **Stop Workflow** (default): throws a node error. Structured wrapper diagnostics are preserved in the error's `context.speedtest`.
40
+ - **Continue (using error output)**: failed items go to n8n's **Error** output with the structured JSON below. Successful items stay on the **Success** output.
41
+ - **Continue (using regular output)**: explicitly keeps failed items on the regular output with the same structured JSON.
42
+
43
+ Configure this under **Settings → On Error**. Each continued failure carries n8n's top-level error marker and retains its input-item link. Existing saved `returnErrors` parameters are ignored.
39
44
 
40
45
  Example for the reported Ookla rate limit:
41
46
 
@@ -36,13 +36,6 @@ class Speedtest {
36
36
  default: false,
37
37
  description: 'Whether you accept the Ookla GDPR terms and consent to the processing described by Ookla',
38
38
  },
39
- {
40
- displayName: 'Return Errors as Data',
41
- name: 'returnErrors',
42
- type: 'boolean',
43
- default: true,
44
- description: 'Whether to return structured errors on the regular output instead of failing the node. Diagnostics can contain network information.',
45
- },
46
39
  {
47
40
  displayName: 'Options',
48
41
  name: 'options',
@@ -104,11 +97,21 @@ class Speedtest {
104
97
  }
105
98
  catch (error) {
106
99
  const cause = error instanceof Error ? error : new Error(String(error));
107
- if (this.getNodeParameter('returnErrors', itemIndex, true) || this.continueOnFail()) {
108
- output.push({ json: { success: false, error: (0, speedtestError_1.structuredError)(cause) }, pairedItem: { item: itemIndex } });
100
+ const diagnostics = (0, speedtestError_1.structuredError)(cause);
101
+ const nodeError = new n8n_workflow_1.NodeOperationError(this.getNode(), cause, {
102
+ itemIndex,
103
+ });
104
+ nodeError.context.speedtest = diagnostics;
105
+ if (this.continueOnFail()) {
106
+ // n8n needs the top-level error marker to route this item to its error output.
107
+ output.push({
108
+ json: { success: false, error: diagnostics },
109
+ error: nodeError,
110
+ pairedItem: { item: itemIndex },
111
+ });
109
112
  continue;
110
113
  }
111
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), cause, { itemIndex });
114
+ throw nodeError;
112
115
  }
113
116
  }
114
117
  return [output];
@@ -1 +1 @@
1
- {"version":3,"file":"Speedtest.node.js","sourceRoot":"","sources":["../../../nodes/Speedtest/Speedtest.node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Speedtest.node.js","sourceRoot":"","sources":["../../../nodes/Speedtest/Speedtest.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function extractBinary(archive: Buffer): Buffer;
2
+ export declare function resolveBinary(): string | Promise<string>;
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractBinary = extractBinary;
4
+ exports.resolveBinary = resolveBinary;
5
+ const node_crypto_1 = require("node:crypto");
6
+ const promises_1 = require("node:fs/promises");
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = require("node:path");
9
+ const node_zlib_1 = require("node:zlib");
10
+ const speedtestError_1 = require("./speedtestError");
11
+ const VERSION = '1.2.0';
12
+ const RELEASES = {
13
+ 'linux-x64': { archive: 'linux-x86_64', sha256: '5690596c54ff9bed63fa3732f818a05dbc2db19ad36ed68f21ca5f64d5cfeeb7' },
14
+ 'linux-arm64': { archive: 'linux-aarch64', sha256: '3953d231da3783e2bf8904b6dd72767c5c6e533e163d3742fd0437affa431bd3' },
15
+ };
16
+ const MAX_ARCHIVE_BYTES = 16 * 1024 * 1024;
17
+ const pending = new Map();
18
+ // Extract only the known regular-file entry. Never trust archive paths or extract links.
19
+ function extractBinary(archive) {
20
+ const tar = (0, node_zlib_1.gunzipSync)(archive, { maxOutputLength: 32 * 1024 * 1024 });
21
+ for (let offset = 0; offset + 512 <= tar.length;) {
22
+ const header = tar.subarray(offset, offset + 512);
23
+ if (header.every(byte => byte === 0))
24
+ break;
25
+ const name = header.subarray(0, 100).toString().replace(/\0.*$/, '');
26
+ const sizeText = header.subarray(124, 136).toString().replace(/\0.*$/, '').trim();
27
+ if (!/^[0-7]+$/.test(sizeText))
28
+ throw new Error('Invalid tar entry size');
29
+ const size = parseInt(sizeText, 8);
30
+ const start = offset + 512;
31
+ if (start + size > tar.length)
32
+ throw new Error('Truncated tar entry');
33
+ if (name === 'speedtest' && (header[156] === 0 || header[156] === 48) && size > 0) {
34
+ return tar.subarray(start, start + size);
35
+ }
36
+ offset = start + Math.ceil(size / 512) * 512;
37
+ }
38
+ throw new Error('Archive contains no regular speedtest binary');
39
+ }
40
+ async function provision(key, directory) {
41
+ const release = RELEASES[key];
42
+ if (!release)
43
+ throw new speedtestError_1.SpeedtestError(`Automatic Ookla CLI provisioning is not supported on ${key}; set N8N_SPEEDTEST_BINARY`, 'UNSUPPORTED_PLATFORM');
44
+ const target = (0, node_path_1.join)(directory, `speedtest-${VERSION}-${key}`);
45
+ const archivePath = target + '.tgz';
46
+ try {
47
+ await (0, promises_1.mkdir)(directory, { recursive: true });
48
+ // Verify the cached archive on every resolution and regenerate a missing/modified executable.
49
+ let archive;
50
+ try {
51
+ archive = await (0, promises_1.readFile)(archivePath);
52
+ }
53
+ catch (error) {
54
+ if (error.code !== 'ENOENT')
55
+ throw error;
56
+ }
57
+ if (!archive) {
58
+ const response = await fetch(`https://install.speedtest.net/app/cli/ookla-speedtest-${VERSION}-${release.archive}.tgz`, {
59
+ signal: AbortSignal.timeout(60_000), redirect: 'error',
60
+ });
61
+ if (!response.ok || !response.body)
62
+ throw new Error(`Ookla download failed: HTTP ${response.status}`);
63
+ const chunks = [];
64
+ let size = 0;
65
+ for await (const chunk of response.body) {
66
+ size += chunk.length;
67
+ if (size > MAX_ARCHIVE_BYTES)
68
+ throw new Error('Ookla download exceeds 16 MiB');
69
+ chunks.push(Buffer.from(chunk));
70
+ }
71
+ archive = Buffer.concat(chunks);
72
+ }
73
+ if (archive.length > MAX_ARCHIVE_BYTES || (0, node_crypto_1.createHash)('sha256').update(archive).digest('hex') !== release.sha256) {
74
+ throw new Error('Ookla archive SHA-256 verification failed');
75
+ }
76
+ const binary = extractBinary(archive);
77
+ try {
78
+ const existing = await (0, promises_1.readFile)(target);
79
+ await (0, promises_1.access)(target, node_fs_1.constants.X_OK);
80
+ if (existing.equals(binary))
81
+ return target;
82
+ }
83
+ catch { /* Install atomically below. */ }
84
+ const staging = await (0, promises_1.mkdtemp)((0, node_path_1.join)(directory, 'install-'));
85
+ try {
86
+ await (0, promises_1.writeFile)((0, node_path_1.join)(staging, 'archive'), archive);
87
+ await (0, promises_1.writeFile)((0, node_path_1.join)(staging, 'binary'), binary, { mode: 0o755 });
88
+ await (0, promises_1.chmod)((0, node_path_1.join)(staging, 'binary'), 0o755);
89
+ await (0, promises_1.rename)((0, node_path_1.join)(staging, 'archive'), archivePath);
90
+ await (0, promises_1.rename)((0, node_path_1.join)(staging, 'binary'), target);
91
+ }
92
+ finally {
93
+ await (0, promises_1.rm)(staging, { recursive: true, force: true });
94
+ }
95
+ return target;
96
+ }
97
+ catch (error) {
98
+ throw new speedtestError_1.SpeedtestError(`Cannot provision Ookla CLI: ${error.message}`, 'BINARY_SETUP_ERROR');
99
+ }
100
+ }
101
+ function resolveBinary() {
102
+ // Overrides belong to the administrator, never to workflow input.
103
+ if (process.env.N8N_SPEEDTEST_BINARY)
104
+ return process.env.N8N_SPEEDTEST_BINARY;
105
+ const key = `${process.platform}-${process.arch}`;
106
+ // Visible cache alongside the installed node, as in the original package. No root or install scripts.
107
+ const directory = (0, node_path_1.resolve)(process.env.N8N_SPEEDTEST_CACHE_DIR || (0, node_path_1.join)(__dirname, 'binaries'));
108
+ const cacheKey = `${directory}:${key}`;
109
+ let result = pending.get(cacheKey);
110
+ if (!result) {
111
+ result = provision(key, directory).finally(() => { pending.delete(cacheKey); });
112
+ pending.set(cacheKey, result);
113
+ }
114
+ return result;
115
+ }
116
+ //# sourceMappingURL=resolveBinary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveBinary.js","sourceRoot":"","sources":["../../../nodes/Speedtest/resolveBinary.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-speedtest-net",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Run Ookla internet speed tests in n8n with structured CLI diagnostics",
5
5
  "license": "MIT",
6
6
  "keywords": [