balena-cli 24.1.3 → 24.1.4

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/CHANGELOG.md CHANGED
@@ -4,7 +4,11 @@ All notable changes to this project will be documented in this file
4
4
  automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
5
5
  This project adheres to [Semantic Versioning](http://semver.org/).
6
6
 
7
- ## 24.1.3 - 2026-04-07
7
+ ## 24.1.4 - 2026-04-27
8
+
9
+ * Retry ratelimited requests that have a Retry-After less than 60 seconds [Thodoris Greasidis]
10
+
11
+ ## 24.1.3 - 2026-04-08
8
12
 
9
13
  * test(device ssh): unset proxy env vars that break stderr assertions [Kyle Harding]
10
14
 
package/build/app.js CHANGED
@@ -25,11 +25,27 @@ async function checkNodeVersion() {
25
25
  console.warn(getNodeEngineVersionWarn(process.version, validNodeVersions));
26
26
  }
27
27
  }
28
+ const DEFAULT_REQUEST_LIMIT_PER_MINUTE = 350;
29
+ const MAX_REQUEST_RETRY_AFTER_MS = 60000;
30
+ const REQUESTS_THROTTLED_NOTICE_MS = 10000;
31
+ let lastThrottlingLogTimestamp;
32
+ function retryRateLimitedRequests(retryAfterMs) {
33
+ const shouldRetry = retryAfterMs < MAX_REQUEST_RETRY_AFTER_MS;
34
+ if (shouldRetry &&
35
+ (lastThrottlingLogTimestamp == null ||
36
+ lastThrottlingLogTimestamp + REQUESTS_THROTTLED_NOTICE_MS < Date.now())) {
37
+ console.info('We need to slow down your requests temporarily. Please wait a moment, we will process them shortly.');
38
+ lastThrottlingLogTimestamp = Date.now();
39
+ }
40
+ return shouldRetry;
41
+ }
28
42
  async function setupBalenaSdkSharedOptions(settings) {
29
43
  const BalenaSdk = await Promise.resolve().then(() => require('balena-sdk'));
30
44
  BalenaSdk.setSharedOptions({
31
45
  apiUrl: settings.get('apiUrl'),
32
46
  dataDirectory: settings.get('dataDirectory'),
47
+ requestLimit: DEFAULT_REQUEST_LIMIT_PER_MINUTE,
48
+ retryRateLimitedRequests,
33
49
  });
34
50
  }
35
51
  async function init() {
package/build/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":";;;AA2KA,kBA+BC;AAxLD,2CAIqB;AACrB,iDAAgD;AAChD,uCAAyD;AACzD,sCAA+D;AAMlD,QAAA,WAAW,GAAG,IAAA,gBAAS,EAAC,KAAK,IAAI,EAAE;IAC/C,MAAM,MAAM,GAAG,2CAAa,UAAU,EAAC,CAAC;IACxC,MAAM,MAAM,GAAG,2CAAa,cAAc,EAAC,CAAC;IAC5C,MAAM,CAAC,IAAI,CAAC;QACX,GAAG,EAAE,MAAM,CAAC,SAAS;QACrB,OAAO,EAAE,IAAA,qBAAc,GAAE,CAAC,OAAO;KACjC,CAAC,CAAC;IACH,MAAM,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC;QAClC,YAAY,EAAE,OAAO,CAAC,OAAO;QAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC1B,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,gBAAgB;IAC9B,MAAM,iBAAiB,GAAG,IAAA,qBAAc,GAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,CAAC,2CAAa,QAAQ,EAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAC7E,MAAM,EAAE,wBAAwB,EAAE,GAAG,2CAAa,kBAAkB,EAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC5E,CAAC;AACF,CAAC;AAGD,KAAK,UAAU,2BAA2B,CAAC,QAAqB;IAC/D,MAAM,SAAS,GAAG,2CAAa,YAAY,EAAC,CAAC;IAC7C,SAAS,CAAC,gBAAgB,CAAC;QAC1B,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAS,QAAQ,CAAC;QACtC,aAAa,EAAE,QAAQ,CAAC,GAAG,CAAS,eAAe,CAAC;KACpD,CAAC,CAAC;AACJ,CAAC;AAGD,KAAK,UAAU,IAAI;IAClB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC5D,CAAC;IACF,CAAC;SAAM,CAAC;QACP,MAAM,IAAA,mBAAW,GAAE,CAAC;IACrB,CAAC;IACD,MAAM,gBAAgB,EAAE,CAAC;IAEzB,MAAM,QAAQ,GAAG,IAAI,uBAAW,EAAE,CAAC;IAGnC,MAAM,CAAC,2CAAa,eAAe,EAAC,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAErE,MAAM,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IAG5C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;QACxC,CAAC,2CAAa,gBAAgB,EAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC3C,CAAC;AACF,CAAC;AAGD,KAAK,UAAU,QAAQ,CAAC,OAAiB,EAAE,OAAmB;IAC7D,IAAI,kBAA6C,CAAC;IAElD,IAAI,CAAC,CAAC,2BAAe,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC5D,MAAM,EAAE,kBAAkB,EAAE,GAAG,2CAAa,eAAe,EAAC,CAAC;QAC7D,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,IAAA,qBAAc,GAAE,CAAC,OAAO,CAAC,CAAC;QAE5E,MAAM,kBAAkB,CAAC,wBAAwB,EAAE,CAAC;QAEpD,kBAAkB,GAAG,kBAAkB,CAAC,2BAA2B,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,KAAK,WAAW,WAAoB;;QACvD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC;YACJ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBAEzB,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAC;gBACrC,eAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;YACvB,CAAC;YAGD,MAAM,IAAA,UAAO,EAAC,OAAO,EAAE,MAAA,OAAO,CAAC,WAAW,mCAAI,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAKhB,IAAI,CAAA,MAAA,KAAK,CAAC,KAAK,0CAAE,IAAI,MAAK,CAAC,EAAE,CAAC;gBAC7B,OAAO,GAAG,IAAI,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACP,IAAI,KAAK,YAAY,aAAM,CAAC,QAAQ,EAAE,CAAC;oBACtC,MAAM,sBAAsB,GAAG,mCAAmC,CAAC;oBACnE,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;wBACxD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO;6BAC3B,KAAK,CAAC,IAAI,CAAC;6BACX,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;4BAChB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gCAEb,OAAO,IAAI,CAAC,OAAO,CAClB,sBAAsB,EACtB,gCAAgC,CAChC,CAAC;4BACH,CAAC;4BAED,OAAO,IAAI,CAAC,OAAO,CAClB,gEAAgE,EAChE,4CAA4C,CAC5C,CAAC;wBACH,CAAC,CAAC;6BACD,IAAI,CAAC,IAAI,CAAC,CAAC;wBAEb,MAAM,WAAW,GAAG,UAAU,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;wBAC7G,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CACpC,6BAA6B,EAC7B,0BAA0B,WAAW,IAAI,CACzC,CAAC;oBACH,CAAC;gBACF,CAAC;gBACD,MAAM,KAAK,CAAC;YACb,CAAC;QACF,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,EAAE,KAAK,EAAE,GAAG,2CAAa,aAAa,EAAC,CAAC;YAC9C,MAAM,KAAK,EAAE,CAAC;QACf,CAAC;QASD,IAAI,OAAO,EAAE,CAAC;YACb,CAAC,2CAAa,aAAa,EAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,CAAC;IACF,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAErB,MAAM,EAAE,YAAY,EAAE,GAAG,2CAAa,gBAAgB,EAAC,CAAC;IAExD,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC,CAAC;AACnE,CAAC;AAGM,KAAK,UAAU,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,OAAmB;IACpE,IAAI,CAAC;QACJ,MAAM,EACL,4BAA4B,EAC5B,qBAAqB,EACrB,gBAAgB,GAChB,GAAG,2CAAa,mBAAmB,EAAC,CAAC;QACtC,4BAA4B,EAAE,CAAC;QAC/B,qBAAqB,EAAE,CAAC;QACxB,gBAAgB,EAAE,CAAC;QAEnB,MAAM,IAAI,EAAE,CAAC;QAGb,MAAM,IAAA,+BAAmB,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5C,MAAM,IAAI,GAAG,MAAM,IAAA,wBAAY,EAAC,OAAO,CAAC,CAAC;QACzC,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,2CAAa,UAAU,EAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;YAAS,CAAC;QACV,IAAI,CAAC;YACJ,CAAC,2CAAa,aAAa,EAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC;QACF,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
package/build/errors.js CHANGED
@@ -129,6 +129,22 @@ const messages = {
129
129
  Device type ${slug} not recognized. Perhaps misspelled?
130
130
  Check available device types with "balena device-type list"`;
131
131
  },
132
+ BalenaRequestError: (error) => {
133
+ var _a;
134
+ const balena = (0, lazy_1.getBalenaSdk)();
135
+ if (error instanceof balena.errors.BalenaRequestError &&
136
+ error.statusCode === 429) {
137
+ const retryAfterStr = (_a = error.responseHeaders) === null || _a === void 0 ? void 0 : _a.get('Retry-After');
138
+ const retryAfterMs = retryAfterStr != null ? parseInt(retryAfterStr, 10) * 1000 : undefined;
139
+ if (typeof retryAfterMs === 'number' && Number.isInteger(retryAfterMs)) {
140
+ const retryAfterDate = new Date(Date.now() + retryAfterMs);
141
+ const retryAfterDateTimeMessage = retryAfterMs >= 24 * 60 * 60000
142
+ ? `${retryAfterDate.toDateString()} ${retryAfterDate.toLocaleTimeString()}`
143
+ : retryAfterDate.toLocaleTimeString();
144
+ return `We need to slow down your requests temporarily. Please retry after ${retryAfterDateTimeMessage}`;
145
+ }
146
+ }
147
+ },
132
148
  };
133
149
  const EXPECTED_ERROR_REGEXES = [
134
150
  /cannot also be provided when using/,
@@ -152,6 +168,7 @@ const EXPECTED_ERROR_REGEXES = [
152
168
  /^Expected an integer/,
153
169
  /^Flag .* expects a value/,
154
170
  /^Error parsing config file.*balenarc\.yml/,
171
+ /^We need to slow down your requests temporarily\./,
155
172
  ];
156
173
  const getSentry = async function () {
157
174
  return await Promise.resolve().then(() => require('@sentry/node'));
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "balena-cli",
3
- "version": "24.1.3",
3
+ "version": "24.1.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "balena-cli",
9
- "version": "24.1.3",
9
+ "version": "24.1.4",
10
10
  "hasInstallScript": true,
11
11
  "license": "Apache-2.0",
12
12
  "dependencies": {
@@ -3132,9 +3132,9 @@
3132
3132
  }
3133
3133
  },
3134
3134
  "node_modules/@balena/lint/node_modules/lru-cache": {
3135
- "version": "11.3.2",
3136
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.2.tgz",
3137
- "integrity": "sha512-wgWa6FWQ3QRRJbIjbsldRJZxdxYngT/dO0I5Ynmlnin8qy7tC6xYzbcJjtN4wHLXtkbVwHzk0C+OejVw1XM+DQ==",
3135
+ "version": "11.3.5",
3136
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz",
3137
+ "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==",
3138
3138
  "dev": true,
3139
3139
  "license": "BlueOak-1.0.0",
3140
3140
  "engines": {
@@ -5086,9 +5086,9 @@
5086
5086
  }
5087
5087
  },
5088
5088
  "node_modules/@oclif/core/node_modules/brace-expansion": {
5089
- "version": "2.0.3",
5090
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
5091
- "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
5089
+ "version": "2.1.0",
5090
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
5091
+ "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
5092
5092
  "license": "MIT",
5093
5093
  "dependencies": {
5094
5094
  "balanced-match": "^1.0.0"
@@ -6419,9 +6419,9 @@
6419
6419
  }
6420
6420
  },
6421
6421
  "node_modules/@sentry/node/node_modules/brace-expansion": {
6422
- "version": "2.0.3",
6423
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
6424
- "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
6422
+ "version": "2.1.0",
6423
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
6424
+ "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
6425
6425
  "license": "MIT",
6426
6426
  "dependencies": {
6427
6427
  "balanced-match": "^1.0.0"
@@ -9709,9 +9709,9 @@
9709
9709
  }
9710
9710
  },
9711
9711
  "node_modules/brace-expansion": {
9712
- "version": "1.1.13",
9713
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
9714
- "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
9712
+ "version": "1.1.14",
9713
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz",
9714
+ "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==",
9715
9715
  "license": "MIT",
9716
9716
  "dependencies": {
9717
9717
  "balanced-match": "^1.0.0",
@@ -11223,9 +11223,9 @@
11223
11223
  }
11224
11224
  },
11225
11225
  "node_modules/depcheck/node_modules/brace-expansion": {
11226
- "version": "2.0.3",
11227
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
11228
- "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
11226
+ "version": "2.1.0",
11227
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
11228
+ "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
11229
11229
  "dev": true,
11230
11230
  "license": "MIT",
11231
11231
  "dependencies": {
@@ -11450,9 +11450,9 @@
11450
11450
  }
11451
11451
  },
11452
11452
  "node_modules/dockerode": {
11453
- "version": "4.0.10",
11454
- "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.10.tgz",
11455
- "integrity": "sha512-8L/P9JynLBiG7/coiA4FlQXegHltRqS0a+KqI44P1zgQh8QLHTg7FKOwhkBgSJwZTeHsq30WRoVFLuwkfK0YFg==",
11453
+ "version": "4.0.12",
11454
+ "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.12.tgz",
11455
+ "integrity": "sha512-/bCZd6KlGcjZO8Buqmi/vXuqEGVEZ0PNjx/biBNqJD3MhK9DmdiAuKxqfNhflgDESDIiBz3qF+0e55+CpnrUcw==",
11456
11456
  "license": "Apache-2.0",
11457
11457
  "dependencies": {
11458
11458
  "@balena/dockerignore": "^1.0.2",
@@ -12568,9 +12568,9 @@
12568
12568
  }
12569
12569
  },
12570
12570
  "node_modules/etcher-sdk/node_modules/brace-expansion": {
12571
- "version": "2.0.3",
12572
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
12573
- "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
12571
+ "version": "2.1.0",
12572
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
12573
+ "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
12574
12574
  "license": "MIT",
12575
12575
  "dependencies": {
12576
12576
  "balanced-match": "^1.0.0"
@@ -12751,9 +12751,9 @@
12751
12751
  "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
12752
12752
  },
12753
12753
  "node_modules/express/node_modules/body-parser": {
12754
- "version": "1.20.4",
12755
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz",
12756
- "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==",
12754
+ "version": "1.20.5",
12755
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz",
12756
+ "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==",
12757
12757
  "license": "MIT",
12758
12758
  "dependencies": {
12759
12759
  "bytes": "~3.1.2",
@@ -12764,7 +12764,7 @@
12764
12764
  "http-errors": "~2.0.1",
12765
12765
  "iconv-lite": "~0.4.24",
12766
12766
  "on-finished": "~2.4.1",
12767
- "qs": "~6.14.0",
12767
+ "qs": "~6.15.1",
12768
12768
  "raw-body": "~2.5.3",
12769
12769
  "type-is": "~1.6.18",
12770
12770
  "unpipe": "~1.0.0"
@@ -12774,6 +12774,21 @@
12774
12774
  "npm": "1.2.8000 || >= 1.4.16"
12775
12775
  }
12776
12776
  },
12777
+ "node_modules/express/node_modules/body-parser/node_modules/qs": {
12778
+ "version": "6.15.1",
12779
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz",
12780
+ "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==",
12781
+ "license": "BSD-3-Clause",
12782
+ "dependencies": {
12783
+ "side-channel": "^1.1.0"
12784
+ },
12785
+ "engines": {
12786
+ "node": ">=0.6"
12787
+ },
12788
+ "funding": {
12789
+ "url": "https://github.com/sponsors/ljharb"
12790
+ }
12791
+ },
12777
12792
  "node_modules/express/node_modules/cookie": {
12778
12793
  "version": "0.7.1",
12779
12794
  "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
@@ -13077,9 +13092,9 @@
13077
13092
  }
13078
13093
  },
13079
13094
  "node_modules/filelist/node_modules/brace-expansion": {
13080
- "version": "2.0.3",
13081
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
13082
- "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
13095
+ "version": "2.1.0",
13096
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
13097
+ "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
13083
13098
  "license": "MIT",
13084
13099
  "dependencies": {
13085
13100
  "balanced-match": "^1.0.0"
@@ -13845,9 +13860,9 @@
13845
13860
  }
13846
13861
  },
13847
13862
  "node_modules/globals": {
13848
- "version": "17.4.0",
13849
- "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz",
13850
- "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==",
13863
+ "version": "17.5.0",
13864
+ "resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz",
13865
+ "integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==",
13851
13866
  "dev": true,
13852
13867
  "license": "MIT",
13853
13868
  "engines": {
@@ -15867,9 +15882,9 @@
15867
15882
  }
15868
15883
  },
15869
15884
  "node_modules/jsonfile": {
15870
- "version": "6.2.0",
15871
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
15872
- "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
15885
+ "version": "6.2.1",
15886
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz",
15887
+ "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
15873
15888
  "license": "MIT",
15874
15889
  "dependencies": {
15875
15890
  "universalify": "^2.0.0"
@@ -16808,9 +16823,9 @@
16808
16823
  }
16809
16824
  },
16810
16825
  "node_modules/mocha/node_modules/brace-expansion": {
16811
- "version": "2.0.3",
16812
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
16813
- "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
16826
+ "version": "2.1.0",
16827
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
16828
+ "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
16814
16829
  "dev": true,
16815
16830
  "license": "MIT",
16816
16831
  "dependencies": {
@@ -16966,9 +16981,9 @@
16966
16981
  }
16967
16982
  },
16968
16983
  "node_modules/mockttp/node_modules/body-parser": {
16969
- "version": "1.20.4",
16970
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz",
16971
- "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==",
16984
+ "version": "1.20.5",
16985
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz",
16986
+ "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==",
16972
16987
  "dev": true,
16973
16988
  "license": "MIT",
16974
16989
  "dependencies": {
@@ -16980,7 +16995,7 @@
16980
16995
  "http-errors": "~2.0.1",
16981
16996
  "iconv-lite": "~0.4.24",
16982
16997
  "on-finished": "~2.4.1",
16983
- "qs": "~6.14.0",
16998
+ "qs": "~6.15.1",
16984
16999
  "raw-body": "~2.5.3",
16985
17000
  "type-is": "~1.6.18",
16986
17001
  "unpipe": "~1.0.0"
@@ -17076,6 +17091,22 @@
17076
17091
  "dev": true,
17077
17092
  "license": "MIT"
17078
17093
  },
17094
+ "node_modules/mockttp/node_modules/qs": {
17095
+ "version": "6.15.1",
17096
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz",
17097
+ "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==",
17098
+ "dev": true,
17099
+ "license": "BSD-3-Clause",
17100
+ "dependencies": {
17101
+ "side-channel": "^1.1.0"
17102
+ },
17103
+ "engines": {
17104
+ "node": ">=0.6"
17105
+ },
17106
+ "funding": {
17107
+ "url": "https://github.com/sponsors/ljharb"
17108
+ }
17109
+ },
17079
17110
  "node_modules/mockttp/node_modules/raw-body": {
17080
17111
  "version": "2.5.3",
17081
17112
  "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
@@ -18778,9 +18809,9 @@
18778
18809
  }
18779
18810
  },
18780
18811
  "node_modules/pinejs-client-core/node_modules/@balena/abstract-sql-compiler": {
18781
- "version": "11.3.18",
18782
- "resolved": "https://registry.npmjs.org/@balena/abstract-sql-compiler/-/abstract-sql-compiler-11.3.18.tgz",
18783
- "integrity": "sha512-f7AhBvSLBZrT/bchecsD2avWgXhnaBrWKli6F1oCy/VFHR/XK+EYbb/uqbHo3jxiIsCzD2lZs5VKEVAPOb/7Tw==",
18812
+ "version": "11.3.20",
18813
+ "resolved": "https://registry.npmjs.org/@balena/abstract-sql-compiler/-/abstract-sql-compiler-11.3.20.tgz",
18814
+ "integrity": "sha512-MP3BkKkcpQtzbbqUXLGZPhLtmaVvlhhPC3gn2DYYnheauHl9tzinSiVp73nrMTV2zHA80TfHoPbdYTp/0d1URQ==",
18784
18815
  "engines": {
18785
18816
  "node": ">=20.14.0",
18786
18817
  "npm": ">=10.7.0"
@@ -19254,9 +19285,9 @@
19254
19285
  }
19255
19286
  },
19256
19287
  "node_modules/qs": {
19257
- "version": "6.14.1",
19258
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
19259
- "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
19288
+ "version": "6.14.2",
19289
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
19290
+ "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==",
19260
19291
  "license": "BSD-3-Clause",
19261
19292
  "dependencies": {
19262
19293
  "side-channel": "^1.1.0"
@@ -19830,12 +19861,13 @@
19830
19861
  "integrity": "sha512-29GS75BE8asnTno3yB6ubOJOO0FboExEqNJy4bpz0GSmW/8wPTNL4h9h63c6s1uTrOopCmJYe/4yJLh5r92ZUA=="
19831
19862
  },
19832
19863
  "node_modules/resolve": {
19833
- "version": "1.22.11",
19834
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
19835
- "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
19864
+ "version": "1.22.12",
19865
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
19866
+ "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
19836
19867
  "dev": true,
19837
19868
  "license": "MIT",
19838
19869
  "dependencies": {
19870
+ "es-errors": "^1.3.0",
19839
19871
  "is-core-module": "^2.16.1",
19840
19872
  "path-parse": "^1.0.7",
19841
19873
  "supports-preserve-symlinks-flag": "^1.0.0"
@@ -3084,30 +3084,6 @@
3084
3084
  "flash.js"
3085
3085
  ]
3086
3086
  },
3087
- "logout": {
3088
- "aliases": [],
3089
- "args": {},
3090
- "description": "Logout from balena.\n\nLogout from your balena account.",
3091
- "examples": [
3092
- "$ balena logout"
3093
- ],
3094
- "flags": {},
3095
- "hasDynamicHelp": false,
3096
- "hiddenAliases": [],
3097
- "id": "logout",
3098
- "pluginAlias": "balena-cli",
3099
- "pluginName": "balena-cli",
3100
- "pluginType": "core",
3101
- "strict": true,
3102
- "enableJsonFlag": false,
3103
- "isESM": false,
3104
- "relativePath": [
3105
- "build",
3106
- "commands",
3107
- "logout",
3108
- "index.js"
3109
- ]
3110
- },
3111
3087
  "login": {
3112
3088
  "aliases": [],
3113
3089
  "args": {
@@ -3233,6 +3209,30 @@
3233
3209
  "index.js"
3234
3210
  ]
3235
3211
  },
3212
+ "logout": {
3213
+ "aliases": [],
3214
+ "args": {},
3215
+ "description": "Logout from balena.\n\nLogout from your balena account.",
3216
+ "examples": [
3217
+ "$ balena logout"
3218
+ ],
3219
+ "flags": {},
3220
+ "hasDynamicHelp": false,
3221
+ "hiddenAliases": [],
3222
+ "id": "logout",
3223
+ "pluginAlias": "balena-cli",
3224
+ "pluginName": "balena-cli",
3225
+ "pluginType": "core",
3226
+ "strict": true,
3227
+ "enableJsonFlag": false,
3228
+ "isESM": false,
3229
+ "relativePath": [
3230
+ "build",
3231
+ "commands",
3232
+ "logout",
3233
+ "index.js"
3234
+ ]
3235
+ },
3236
3236
  "organization:list": {
3237
3237
  "aliases": [],
3238
3238
  "args": {},
@@ -3258,6 +3258,136 @@
3258
3258
  "list.js"
3259
3259
  ]
3260
3260
  },
3261
+ "preload": {
3262
+ "aliases": [],
3263
+ "args": {
3264
+ "image": {
3265
+ "description": "the image file path",
3266
+ "name": "image",
3267
+ "required": true
3268
+ }
3269
+ },
3270
+ "description": "Preload a release on a disk image (or Edison zip archive).\n\nPreload a release (service images/containers) from a balena fleet, and optionally\na balenaOS splash screen, in a previously downloaded '.img' balenaOS image file\nin the local disk (a zip file is only accepted for the Intel Edison device type).\nAfter preloading, the balenaOS image file can be flashed to a device's SD card.\nWhen the device boots, it will not need to download the release, as it was\npreloaded. This is usually combined with release pinning\n(https://www.balena.io/docs/learn/deploy/release-strategy/release-policy/)\nto avoid the device downloading a newer release straight away, if available.\nCheck also the Preloading and Preregistering section of the balena CLI's advanced\nmasterclass document:\nhttps://www.balena.io/docs/learn/more/masterclasses/advanced-cli/#5-preloading-and-preregistering\n\nFleets may be specified by fleet name or slug. Fleet slugs are\nthe recommended option, as they are unique and unambiguous. Slugs can be\nlisted with the `balena fleet list` command. Note that slugs may change if the\nfleet is renamed. Fleet names are not unique and may result in \"Fleet is\nambiguous\" errors at any time (even if it \"used to work in the past\"), for\nexample if the name clashes with a newly created public fleet, or with fleets\nfrom other balena accounts that you may be invited to join under any role.\nFor this reason, fleet names are especially discouraged in scripts (e.g. CI\nenvironments).\n\nNote that the this command requires Docker to be installed, as further detailed\nin the balena CLI's installation instructions:\nhttps://github.com/balena-io/balena-cli/blob/master/INSTALL.md\nThe `--dockerHost` and `--dockerPort` flags allow a remote Docker engine to\nbe used, however the image file must be accessible to the remote Docker engine\non the same path given on the command line. This is because Docker's bind mount\nfeature is used to \"share\" the image with a container that performs the preload.",
3271
+ "examples": [
3272
+ "$ balena preload balena.img --fleet MyFleet --commit e1f2592fc6ee949e68756d4f4a48e49bff8d72a0",
3273
+ "$ balena preload balena.img --fleet myorg/myfleet --splash-image image.png",
3274
+ "$ balena preload balena.img"
3275
+ ],
3276
+ "flags": {
3277
+ "fleet": {
3278
+ "char": "f",
3279
+ "description": "fleet name or slug (preferred)",
3280
+ "name": "fleet",
3281
+ "hasDynamicHelp": false,
3282
+ "multiple": false,
3283
+ "type": "option"
3284
+ },
3285
+ "commit": {
3286
+ "char": "c",
3287
+ "description": "The commit hash of the release to preload. Use \"current\" to specify the current\nrelease (ignored if no appId is given). The current release is usually also the\nlatest, but can be pinned to a specific release. See:\nhttps://www.balena.io/docs/learn/deploy/release-strategy/release-policy/\nhttps://www.balena.io/docs/learn/more/masterclasses/fleet-management/#63-pin-using-the-api\nhttps://github.com/balena-io-examples/staged-releases",
3288
+ "name": "commit",
3289
+ "hasDynamicHelp": false,
3290
+ "multiple": false,
3291
+ "type": "option"
3292
+ },
3293
+ "splash-image": {
3294
+ "char": "s",
3295
+ "description": "path to a png image to replace the splash screen",
3296
+ "name": "splash-image",
3297
+ "hasDynamicHelp": false,
3298
+ "multiple": false,
3299
+ "type": "option"
3300
+ },
3301
+ "dont-check-arch": {
3302
+ "description": "disable architecture compatibility check between image and fleet",
3303
+ "name": "dont-check-arch",
3304
+ "allowNo": false,
3305
+ "type": "boolean"
3306
+ },
3307
+ "pin-device-to-release": {
3308
+ "char": "p",
3309
+ "description": "pin the preloaded device to the preloaded release on provision",
3310
+ "name": "pin-device-to-release",
3311
+ "allowNo": true,
3312
+ "type": "boolean"
3313
+ },
3314
+ "additional-space": {
3315
+ "description": "expand the image by this amount of bytes instead of automatically estimating the required amount",
3316
+ "name": "additional-space",
3317
+ "hasDynamicHelp": false,
3318
+ "multiple": false,
3319
+ "type": "option"
3320
+ },
3321
+ "add-certificate": {
3322
+ "description": "Add the given certificate (in PEM format) to /etc/ssl/certs in the preloading container.\nThe file name must end with '.crt' and must not be already contained in the preloader's\n/etc/ssl/certs folder.\nCan be repeated to add multiple certificates.",
3323
+ "name": "add-certificate",
3324
+ "hasDynamicHelp": false,
3325
+ "multiple": true,
3326
+ "type": "option"
3327
+ },
3328
+ "docker": {
3329
+ "char": "P",
3330
+ "description": "Path to a local docker socket (e.g. /var/run/docker.sock)",
3331
+ "name": "docker",
3332
+ "hasDynamicHelp": false,
3333
+ "multiple": false,
3334
+ "type": "option"
3335
+ },
3336
+ "dockerHost": {
3337
+ "char": "h",
3338
+ "description": "Docker daemon hostname or IP address (dev machine or balena device) ",
3339
+ "name": "dockerHost",
3340
+ "hasDynamicHelp": false,
3341
+ "multiple": false,
3342
+ "type": "option"
3343
+ },
3344
+ "dockerPort": {
3345
+ "description": "Docker daemon TCP port number (hint: 2375 for balena devices)",
3346
+ "name": "dockerPort",
3347
+ "hasDynamicHelp": false,
3348
+ "multiple": false,
3349
+ "type": "option"
3350
+ },
3351
+ "ca": {
3352
+ "description": "Docker host TLS certificate authority file",
3353
+ "name": "ca",
3354
+ "hasDynamicHelp": false,
3355
+ "multiple": false,
3356
+ "type": "option"
3357
+ },
3358
+ "cert": {
3359
+ "description": "Docker host TLS certificate file",
3360
+ "name": "cert",
3361
+ "hasDynamicHelp": false,
3362
+ "multiple": false,
3363
+ "type": "option"
3364
+ },
3365
+ "key": {
3366
+ "description": "Docker host TLS key file",
3367
+ "name": "key",
3368
+ "hasDynamicHelp": false,
3369
+ "multiple": false,
3370
+ "type": "option"
3371
+ }
3372
+ },
3373
+ "hasDynamicHelp": false,
3374
+ "hiddenAliases": [],
3375
+ "id": "preload",
3376
+ "pluginAlias": "balena-cli",
3377
+ "pluginName": "balena-cli",
3378
+ "pluginType": "core",
3379
+ "strict": true,
3380
+ "enableJsonFlag": false,
3381
+ "authenticated": true,
3382
+ "primary": true,
3383
+ "isESM": false,
3384
+ "relativePath": [
3385
+ "build",
3386
+ "commands",
3387
+ "preload",
3388
+ "index.js"
3389
+ ]
3390
+ },
3261
3391
  "os:configure": {
3262
3392
  "aliases": [],
3263
3393
  "args": {
@@ -3773,136 +3903,6 @@
3773
3903
  "index.js"
3774
3904
  ]
3775
3905
  },
3776
- "preload": {
3777
- "aliases": [],
3778
- "args": {
3779
- "image": {
3780
- "description": "the image file path",
3781
- "name": "image",
3782
- "required": true
3783
- }
3784
- },
3785
- "description": "Preload a release on a disk image (or Edison zip archive).\n\nPreload a release (service images/containers) from a balena fleet, and optionally\na balenaOS splash screen, in a previously downloaded '.img' balenaOS image file\nin the local disk (a zip file is only accepted for the Intel Edison device type).\nAfter preloading, the balenaOS image file can be flashed to a device's SD card.\nWhen the device boots, it will not need to download the release, as it was\npreloaded. This is usually combined with release pinning\n(https://www.balena.io/docs/learn/deploy/release-strategy/release-policy/)\nto avoid the device downloading a newer release straight away, if available.\nCheck also the Preloading and Preregistering section of the balena CLI's advanced\nmasterclass document:\nhttps://www.balena.io/docs/learn/more/masterclasses/advanced-cli/#5-preloading-and-preregistering\n\nFleets may be specified by fleet name or slug. Fleet slugs are\nthe recommended option, as they are unique and unambiguous. Slugs can be\nlisted with the `balena fleet list` command. Note that slugs may change if the\nfleet is renamed. Fleet names are not unique and may result in \"Fleet is\nambiguous\" errors at any time (even if it \"used to work in the past\"), for\nexample if the name clashes with a newly created public fleet, or with fleets\nfrom other balena accounts that you may be invited to join under any role.\nFor this reason, fleet names are especially discouraged in scripts (e.g. CI\nenvironments).\n\nNote that the this command requires Docker to be installed, as further detailed\nin the balena CLI's installation instructions:\nhttps://github.com/balena-io/balena-cli/blob/master/INSTALL.md\nThe `--dockerHost` and `--dockerPort` flags allow a remote Docker engine to\nbe used, however the image file must be accessible to the remote Docker engine\non the same path given on the command line. This is because Docker's bind mount\nfeature is used to \"share\" the image with a container that performs the preload.",
3786
- "examples": [
3787
- "$ balena preload balena.img --fleet MyFleet --commit e1f2592fc6ee949e68756d4f4a48e49bff8d72a0",
3788
- "$ balena preload balena.img --fleet myorg/myfleet --splash-image image.png",
3789
- "$ balena preload balena.img"
3790
- ],
3791
- "flags": {
3792
- "fleet": {
3793
- "char": "f",
3794
- "description": "fleet name or slug (preferred)",
3795
- "name": "fleet",
3796
- "hasDynamicHelp": false,
3797
- "multiple": false,
3798
- "type": "option"
3799
- },
3800
- "commit": {
3801
- "char": "c",
3802
- "description": "The commit hash of the release to preload. Use \"current\" to specify the current\nrelease (ignored if no appId is given). The current release is usually also the\nlatest, but can be pinned to a specific release. See:\nhttps://www.balena.io/docs/learn/deploy/release-strategy/release-policy/\nhttps://www.balena.io/docs/learn/more/masterclasses/fleet-management/#63-pin-using-the-api\nhttps://github.com/balena-io-examples/staged-releases",
3803
- "name": "commit",
3804
- "hasDynamicHelp": false,
3805
- "multiple": false,
3806
- "type": "option"
3807
- },
3808
- "splash-image": {
3809
- "char": "s",
3810
- "description": "path to a png image to replace the splash screen",
3811
- "name": "splash-image",
3812
- "hasDynamicHelp": false,
3813
- "multiple": false,
3814
- "type": "option"
3815
- },
3816
- "dont-check-arch": {
3817
- "description": "disable architecture compatibility check between image and fleet",
3818
- "name": "dont-check-arch",
3819
- "allowNo": false,
3820
- "type": "boolean"
3821
- },
3822
- "pin-device-to-release": {
3823
- "char": "p",
3824
- "description": "pin the preloaded device to the preloaded release on provision",
3825
- "name": "pin-device-to-release",
3826
- "allowNo": true,
3827
- "type": "boolean"
3828
- },
3829
- "additional-space": {
3830
- "description": "expand the image by this amount of bytes instead of automatically estimating the required amount",
3831
- "name": "additional-space",
3832
- "hasDynamicHelp": false,
3833
- "multiple": false,
3834
- "type": "option"
3835
- },
3836
- "add-certificate": {
3837
- "description": "Add the given certificate (in PEM format) to /etc/ssl/certs in the preloading container.\nThe file name must end with '.crt' and must not be already contained in the preloader's\n/etc/ssl/certs folder.\nCan be repeated to add multiple certificates.",
3838
- "name": "add-certificate",
3839
- "hasDynamicHelp": false,
3840
- "multiple": true,
3841
- "type": "option"
3842
- },
3843
- "docker": {
3844
- "char": "P",
3845
- "description": "Path to a local docker socket (e.g. /var/run/docker.sock)",
3846
- "name": "docker",
3847
- "hasDynamicHelp": false,
3848
- "multiple": false,
3849
- "type": "option"
3850
- },
3851
- "dockerHost": {
3852
- "char": "h",
3853
- "description": "Docker daemon hostname or IP address (dev machine or balena device) ",
3854
- "name": "dockerHost",
3855
- "hasDynamicHelp": false,
3856
- "multiple": false,
3857
- "type": "option"
3858
- },
3859
- "dockerPort": {
3860
- "description": "Docker daemon TCP port number (hint: 2375 for balena devices)",
3861
- "name": "dockerPort",
3862
- "hasDynamicHelp": false,
3863
- "multiple": false,
3864
- "type": "option"
3865
- },
3866
- "ca": {
3867
- "description": "Docker host TLS certificate authority file",
3868
- "name": "ca",
3869
- "hasDynamicHelp": false,
3870
- "multiple": false,
3871
- "type": "option"
3872
- },
3873
- "cert": {
3874
- "description": "Docker host TLS certificate file",
3875
- "name": "cert",
3876
- "hasDynamicHelp": false,
3877
- "multiple": false,
3878
- "type": "option"
3879
- },
3880
- "key": {
3881
- "description": "Docker host TLS key file",
3882
- "name": "key",
3883
- "hasDynamicHelp": false,
3884
- "multiple": false,
3885
- "type": "option"
3886
- }
3887
- },
3888
- "hasDynamicHelp": false,
3889
- "hiddenAliases": [],
3890
- "id": "preload",
3891
- "pluginAlias": "balena-cli",
3892
- "pluginName": "balena-cli",
3893
- "pluginType": "core",
3894
- "strict": true,
3895
- "enableJsonFlag": false,
3896
- "authenticated": true,
3897
- "primary": true,
3898
- "isESM": false,
3899
- "relativePath": [
3900
- "build",
3901
- "commands",
3902
- "preload",
3903
- "index.js"
3904
- ]
3905
- },
3906
3906
  "release:finalize": {
3907
3907
  "aliases": [],
3908
3908
  "args": {
@@ -4085,6 +4085,30 @@
4085
4085
  "validate.js"
4086
4086
  ]
4087
4087
  },
4088
+ "settings": {
4089
+ "aliases": [],
4090
+ "args": {},
4091
+ "description": "Print current settings.\n\nUse this command to display the current balena CLI settings.",
4092
+ "examples": [
4093
+ "$ balena settings"
4094
+ ],
4095
+ "flags": {},
4096
+ "hasDynamicHelp": false,
4097
+ "hiddenAliases": [],
4098
+ "id": "settings",
4099
+ "pluginAlias": "balena-cli",
4100
+ "pluginName": "balena-cli",
4101
+ "pluginType": "core",
4102
+ "strict": true,
4103
+ "enableJsonFlag": false,
4104
+ "isESM": false,
4105
+ "relativePath": [
4106
+ "build",
4107
+ "commands",
4108
+ "settings",
4109
+ "index.js"
4110
+ ]
4111
+ },
4088
4112
  "release-asset:delete": {
4089
4113
  "aliases": [],
4090
4114
  "args": {
@@ -4300,30 +4324,6 @@
4300
4324
  "upload.js"
4301
4325
  ]
4302
4326
  },
4303
- "settings": {
4304
- "aliases": [],
4305
- "args": {},
4306
- "description": "Print current settings.\n\nUse this command to display the current balena CLI settings.",
4307
- "examples": [
4308
- "$ balena settings"
4309
- ],
4310
- "flags": {},
4311
- "hasDynamicHelp": false,
4312
- "hiddenAliases": [],
4313
- "id": "settings",
4314
- "pluginAlias": "balena-cli",
4315
- "pluginName": "balena-cli",
4316
- "pluginType": "core",
4317
- "strict": true,
4318
- "enableJsonFlag": false,
4319
- "isESM": false,
4320
- "relativePath": [
4321
- "build",
4322
- "commands",
4323
- "settings",
4324
- "index.js"
4325
- ]
4326
- },
4327
4327
  "support": {
4328
4328
  "aliases": [],
4329
4329
  "args": {
@@ -4788,5 +4788,5 @@
4788
4788
  ]
4789
4789
  }
4790
4790
  },
4791
- "version": "24.1.3"
4791
+ "version": "24.1.4"
4792
4792
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "balena-cli",
3
- "version": "24.1.3",
3
+ "version": "24.1.4",
4
4
  "description": "The official balena Command Line Interface",
5
5
  "main": "./build/app.js",
6
6
  "homepage": "https://github.com/balena-io/balena-cli",
@@ -257,6 +257,6 @@
257
257
  }
258
258
  },
259
259
  "versionist": {
260
- "publishedAt": "2026-04-07T18:57:58.785Z"
260
+ "publishedAt": "2026-04-27T16:26:54.615Z"
261
261
  }
262
262
  }
package/src/app.ts CHANGED
@@ -50,12 +50,40 @@ async function checkNodeVersion() {
50
50
  }
51
51
  }
52
52
 
53
+ // Set the ratelimiter to 350 requests/minute, to be kind with the API
54
+ // and only retry 429 requests with a Retry-After < 60 seconds,
55
+ // stalling the CLI for more would make it look broken.
56
+ // See: https://balena.fibery.io/Work/Project/2100
57
+ const DEFAULT_REQUEST_LIMIT_PER_MINUTE = 350;
58
+ const MAX_REQUEST_RETRY_AFTER_MS = 60_000;
59
+
60
+ const REQUESTS_THROTTLED_NOTICE_MS = 10_000; // Show ratelimiting notices only once per 10 seconds
61
+ let lastThrottlingLogTimestamp: number | undefined;
62
+
63
+ function retryRateLimitedRequests(retryAfterMs: number) {
64
+ const shouldRetry = retryAfterMs < MAX_REQUEST_RETRY_AFTER_MS;
65
+ if (
66
+ shouldRetry &&
67
+ (lastThrottlingLogTimestamp == null ||
68
+ lastThrottlingLogTimestamp + REQUESTS_THROTTLED_NOTICE_MS < Date.now())
69
+ ) {
70
+ // Only log this message once per RATELIMITED_REQUEST_ERROR_NOTICE_THROTTLING
71
+ console.info(
72
+ 'We need to slow down your requests temporarily. Please wait a moment, we will process them shortly.',
73
+ );
74
+ lastThrottlingLogTimestamp = Date.now();
75
+ }
76
+ return shouldRetry;
77
+ }
78
+
53
79
  /** Setup balena-sdk options that are shared with imported packages */
54
80
  async function setupBalenaSdkSharedOptions(settings: CliSettings) {
55
81
  const BalenaSdk = await import('balena-sdk');
56
82
  BalenaSdk.setSharedOptions({
57
83
  apiUrl: settings.get<string>('apiUrl'),
58
84
  dataDirectory: settings.get<string>('dataDirectory'),
85
+ requestLimit: DEFAULT_REQUEST_LIMIT_PER_MINUTE,
86
+ retryRateLimitedRequests,
59
87
  });
60
88
  }
61
89
 
package/src/errors.ts CHANGED
@@ -17,7 +17,7 @@ limitations under the License.
17
17
  import type { BalenaError } from 'balena-errors';
18
18
  import * as os from 'os';
19
19
  import { TypedError } from 'typed-error';
20
- import { getCliUx, stripIndent } from './utils/lazy';
20
+ import { getCliUx, stripIndent, getBalenaSdk } from './utils/lazy';
21
21
  import { getHelp } from './utils/messages';
22
22
  import { CliSettings } from './utils/bootstrap';
23
23
 
@@ -121,7 +121,7 @@ function loadDataDirectory(): string {
121
121
  }
122
122
 
123
123
  const messages: {
124
- [key: string]: (error: Error & { path?: string }) => string;
124
+ [key: string]: (error: Error & { path?: string }) => string | undefined;
125
125
  } = {
126
126
  EISDIR: (error) => `File is a directory: ${error.path}`,
127
127
 
@@ -194,6 +194,27 @@ const messages: {
194
194
  Device type ${slug} not recognized. Perhaps misspelled?
195
195
  Check available device types with "balena device-type list"`;
196
196
  },
197
+
198
+ BalenaRequestError: (error) => {
199
+ const balena = getBalenaSdk();
200
+ if (
201
+ error instanceof balena.errors.BalenaRequestError &&
202
+ error.statusCode === 429
203
+ ) {
204
+ const retryAfterStr = error.responseHeaders?.get('Retry-After');
205
+ const retryAfterMs =
206
+ retryAfterStr != null ? parseInt(retryAfterStr, 10) * 1000 : undefined;
207
+ if (typeof retryAfterMs === 'number' && Number.isInteger(retryAfterMs)) {
208
+ const retryAfterDate = new Date(Date.now() + retryAfterMs);
209
+ const retryAfterDateTimeMessage =
210
+ // when the retry-after is more than 24h later, also include the date in the message
211
+ retryAfterMs >= 24 * 60 * 60_000
212
+ ? `${retryAfterDate.toDateString()} ${retryAfterDate.toLocaleTimeString()}`
213
+ : retryAfterDate.toLocaleTimeString();
214
+ return `We need to slow down your requests temporarily. Please retry after ${retryAfterDateTimeMessage}`;
215
+ }
216
+ }
217
+ },
197
218
  };
198
219
 
199
220
  // TODO remove these regexes when we have a way of uniquely indentifying errors.
@@ -221,6 +242,7 @@ const EXPECTED_ERROR_REGEXES = [
221
242
  /^Expected an integer/, // oclif parser (flags.integer)
222
243
  /^Flag .* expects a value/, // oclif parser
223
244
  /^Error parsing config file.*balenarc\.yml/,
245
+ /^We need to slow down your requests temporarily\./,
224
246
  ];
225
247
 
226
248
  // Support unit testing of handleError