@espressif/rainmaker-admin-sdk 1.1.0 → 1.2.0

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 (52) hide show
  1. package/CHANGELOG.md +125 -1
  2. package/dist/cjs/entries/ESPRMAdminNode.cjs +1 -0
  3. package/dist/cjs/entries/ESPRMAdminNodeRegistration.cjs +3 -0
  4. package/dist/cjs/index.cjs +4 -0
  5. package/dist/cjs/methods/ESPRMAdminNode/CancelCommandRequests.cjs +27 -0
  6. package/dist/cjs/methods/ESPRMAdminNodeRegistration/GetNodeCertificateUploadUrl.cjs +25 -0
  7. package/dist/cjs/methods/ESPRMAdminNodeRegistration/GetNodeRegistrationRequest.cjs +24 -0
  8. package/dist/cjs/methods/ESPRMAdminNodeRegistration/ListNodeRegistrationRequests.cjs +21 -0
  9. package/dist/cjs/services/ESPRMAPIManager.cjs +10 -2
  10. package/dist/cjs/utils/constants.cjs +3 -0
  11. package/dist/cjs/utils/error/errorMessages.cjs +2 -0
  12. package/dist/esm/entries/ESPRMAdminNode.js +1 -0
  13. package/dist/esm/entries/ESPRMAdminNodeRegistration.js +3 -0
  14. package/dist/esm/index.js +4 -0
  15. package/dist/esm/methods/ESPRMAdminNode/CancelCommandRequests.js +25 -0
  16. package/dist/esm/methods/ESPRMAdminNodeRegistration/GetNodeCertificateUploadUrl.js +23 -0
  17. package/dist/esm/methods/ESPRMAdminNodeRegistration/GetNodeRegistrationRequest.js +22 -0
  18. package/dist/esm/methods/ESPRMAdminNodeRegistration/ListNodeRegistrationRequests.js +19 -0
  19. package/dist/esm/services/ESPRMAPIManager.js +10 -2
  20. package/dist/esm/utils/constants.js +3 -0
  21. package/dist/esm/utils/error/errorMessages.js +2 -0
  22. package/dist/types/methods/ESPRMAdminNode/CancelCommandRequests.d.ts +22 -0
  23. package/dist/types/methods/ESPRMAdminNode/index.d.ts +1 -0
  24. package/dist/types/methods/ESPRMAdminNodeRegistration/GetMQTTHost.d.ts +3 -2
  25. package/dist/types/methods/ESPRMAdminNodeRegistration/GetNodeCertificateUploadUrl.d.ts +18 -0
  26. package/dist/types/methods/ESPRMAdminNodeRegistration/GetNodeRegistrationRequest.d.ts +17 -0
  27. package/dist/types/methods/ESPRMAdminNodeRegistration/ListNodeRegistrationRequests.d.ts +19 -0
  28. package/dist/types/methods/ESPRMAdminNodeRegistration/RegisterNodeCertificates.d.ts +6 -6
  29. package/dist/types/methods/ESPRMAdminNodeRegistration/index.d.ts +3 -0
  30. package/dist/types/types/command_response.d.ts +56 -7
  31. package/dist/types/types/input.d.ts +1 -1
  32. package/dist/types/types/node_registration.d.ts +164 -12
  33. package/dist/types/types/output.d.ts +1 -1
  34. package/dist/types/types/time_series.d.ts +11 -5
  35. package/dist/types/utils/constants.d.ts +3 -0
  36. package/dist/types/utils/error/errorMessages.d.ts +2 -0
  37. package/dist/types-cjs/methods/ESPRMAdminNode/CancelCommandRequests.d.cts +22 -0
  38. package/dist/types-cjs/methods/ESPRMAdminNode/index.d.cts +1 -0
  39. package/dist/types-cjs/methods/ESPRMAdminNodeRegistration/GetMQTTHost.d.cts +3 -2
  40. package/dist/types-cjs/methods/ESPRMAdminNodeRegistration/GetNodeCertificateUploadUrl.d.cts +18 -0
  41. package/dist/types-cjs/methods/ESPRMAdminNodeRegistration/GetNodeRegistrationRequest.d.cts +17 -0
  42. package/dist/types-cjs/methods/ESPRMAdminNodeRegistration/ListNodeRegistrationRequests.d.cts +19 -0
  43. package/dist/types-cjs/methods/ESPRMAdminNodeRegistration/RegisterNodeCertificates.d.cts +6 -6
  44. package/dist/types-cjs/methods/ESPRMAdminNodeRegistration/index.d.cts +3 -0
  45. package/dist/types-cjs/types/command_response.d.cts +56 -7
  46. package/dist/types-cjs/types/input.d.cts +1 -1
  47. package/dist/types-cjs/types/node_registration.d.cts +164 -12
  48. package/dist/types-cjs/types/output.d.cts +1 -1
  49. package/dist/types-cjs/types/time_series.d.cts +11 -5
  50. package/dist/types-cjs/utils/constants.d.cts +3 -0
  51. package/dist/types-cjs/utils/error/errorMessages.d.cts +2 -0
  52. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -3,7 +3,131 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) and follows the [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) format.
5
5
 
6
- ## [Unreleased]
6
+ ## [1.2.0] - 2026-09-25
7
+
8
+ Minor release that adds typed access to node certificate registration, so
9
+ admin apps can register nodes from a CSV, list registration jobs and inspect
10
+ a single job without hand-rolled HTTP calls. It also completes the node
11
+ endpoint response type.
12
+
13
+ The registration request and status types are corrected to match what the
14
+ backend accepts and returns. The old request shape (`node_ids` / `certs`)
15
+ was never accepted by `admin/node_certificates/register`, so no working
16
+ caller can break at runtime, but code that built that shape will no longer
17
+ type-check.
18
+
19
+ ### Added
20
+
21
+ - **CSV node certificate registration** (`ESPRMAdminNodeRegistration`)
22
+ - `getNodeCertificateUploadUrl({ file_name })` wraps
23
+ `GET admin/node_certificates/register?file_name=`. It returns a
24
+ pre-signed S3 PUT URL (valid for 1 hour) and the `request_id` to pass to
25
+ `registerNodeCertificates`. It throws `MISSING_FILE_NAME` when
26
+ `file_name` is empty.
27
+ - New types: `GetNodeCertificateUploadUrlParams`,
28
+ `NodeCertificateUploadUrlResponse` and
29
+ `RegisterNodeCertificatesResponse`.
30
+ - **Node registration requests** (`ESPRMAdminNodeRegistration`)
31
+ - `listNodeRegistrationRequests(params?)` wraps
32
+ `GET admin/node_registrations/requests`. It accepts an optional `status`
33
+ filter plus `num_records` / `start_id` pagination and returns the
34
+ requests newest first, with `next_id` while more pages exist. The
35
+ backend caps `num_records` at 25.
36
+ - `getNodeRegistrationRequest(requestId)` wraps
37
+ `GET admin/node_registrations/requests/{request_id}` and returns the full
38
+ request detail: registration parameters, failure context and a
39
+ pre-signed CSV download URL that is valid for 1 hour. It throws
40
+ `MISSING_REQUEST_ID` when `requestId` is empty.
41
+ - New types: `NodeRegistrationRequestStatus`,
42
+ `ListNodeRegistrationRequestsParams`, `NodeRegistrationRequest`,
43
+ `ListNodeRegistrationRequestsResponse` and
44
+ `NodeRegistrationRequestDetail`.
45
+ - **Command request cancellation** (`ESPRMAdminNode`)
46
+ - `cancelCommandRequests(params)` wraps `DELETE admin/nodes/cmd`. Pass
47
+ `request_id` to cancel one request, or `node_id` (optionally with
48
+ `cmd_id`) to cancel every pending request for a node. Only `requested`
49
+ and `in_progress` requests can be cancelled. It throws
50
+ `MISSING_CANCEL_COMMAND_SCOPE` when neither `request_id` nor `node_id`
51
+ is given, and `CMD_ID_REQUIRES_NODE_ID` when `cmd_id` is sent without
52
+ `node_id`.
53
+ - New types: `CancelCommandRequestsParams`,
54
+ `CancelCommandRequestsResponse`, `CommandRequestStatus` and
55
+ `CommandRequestDataError`.
56
+ - **Errors**
57
+ - Added the `MISSING_CANCEL_COMMAND_SCOPE` and `CMD_ID_REQUIRES_NODE_ID`
58
+ API-call validation codes.
59
+
60
+ ### Changed
61
+
62
+ - **Command requests** (`ESPRMAdminNode`)
63
+ - `CommandRequestInfo.status` and `GetCommandRequestsParams.status` are
64
+ now typed as `CommandRequestStatus` (`requested`, `in_progress`,
65
+ `success`, `failure`, `timed_out`, `overridden`, `cancelled`). Code that
66
+ passed an arbitrary string will no longer type-check; the backend never
67
+ returned any other value.
68
+ - `CommandRequestInfo` now declares the fields the backend already
69
+ returned: `user_name`, `is_base64`, `request_data_error`,
70
+ `response_data_error`, `indefinite_timeout` and `for_user`. Timestamp
71
+ fields are documented as epoch seconds.
72
+ - `GetCommandRequestsParams.start_time` / `end_time` are documented as
73
+ epoch seconds that must be sent together; the backend only honours a
74
+ time range when the `cmd_resp_history` deployment setting is enabled.
75
+ - **CSV node certificate registration** (`ESPRMAdminNodeRegistration`)
76
+ - `RegisterNodeCertificatesRequest` now describes the real request body:
77
+ `file_name`, `file_md5`, `request_id` and `refresh_token` are required
78
+ (the backend rejects the call without them), and `type`, `model`,
79
+ `subtype`, `group_name`, `parent_group_id`, `parent_group_name`, `tags`,
80
+ `force`, `update_nodes`, `node_policies` and `tenant_id` are optional.
81
+ The previous `node_ids` / `certs` shape and its index signature are
82
+ removed.
83
+ - `registerNodeCertificates` now resolves to
84
+ `RegisterNodeCertificatesResponse`, which includes the `request_id`.
85
+ - `NodeCertificateRegistrationStatusResponse` now declares the fields the
86
+ backend returns (`completed_count`, `total_count`, `description`,
87
+ `failed_registration`, `group_name`, `group_id`) and types `status` as
88
+ `NodeRegistrationRequestStatus`. The undocumented `request_id` field and
89
+ the index signature are removed; the backend never returned them.
90
+ - **Node endpoints**
91
+ - `GetMQTTHostResponse` now declares `mqtt_cred_host` (the AWS IoT
92
+ credential provider endpoint) and `https_host`, which
93
+ `admin/mqtt_host` already returned. Callers that read them through the
94
+ index signature keep working.
95
+
96
+ ### Notes
97
+
98
+ - CSV registration is a three-step flow: call
99
+ `getNodeCertificateUploadUrl()`, `PUT` the CSV to the returned URL
100
+ **without** an `Authorization` header, then call
101
+ `registerNodeCertificates()` with the same `request_id` and the file's hex
102
+ MD5. Track progress with `getNodeCertificateRegistrationStatus()` or
103
+ `getNodeRegistrationRequest()`.
104
+ - `getNodeCertificateRegistrationStatus()` checks the batch job and reports
105
+ `failure` when the job died while the request was still `requested`;
106
+ `getNodeRegistrationRequest()` returns the stored status as-is.
107
+
108
+ ## [1.1.1] - 2026-09-23
109
+
110
+ Patch release for the simple time series data endpoint. The time range
111
+ becomes optional, as the backend always allowed, and optional query
112
+ parameters that are left undefined are no longer sent as the literal text
113
+ `undefined`. No breaking changes; every existing call keeps working as before.
114
+
115
+ ### Changed
116
+
117
+ - **Simple time series data**
118
+ - `start_time` and `end_time` on `GetSimpleTimeSeriesDataParams` are now
119
+ optional, matching the backend: omitting them queries from the oldest
120
+ record up to now. Existing callers that pass both are unaffected.
121
+
122
+ ### Fixed
123
+
124
+ - **Query parameter serialisation**
125
+ - `ESPRMAPIManager.request()` no longer sends optional query parameters
126
+ that are `undefined` or `null`. Previously `URLSearchParams` turned them
127
+ into the literal text `undefined` / `null`, which the backend rejected
128
+ (for example `start_time=undefined` on `/admin/nodes/simple_tsdata`).
129
+ Numbers and booleans are stringified explicitly, and a params object
130
+ with no remaining entries produces no `?` at all.
7
131
 
8
132
  ## [1.1.0] - 2026-09-18
9
133
 
@@ -12,6 +12,7 @@ require('../methods/ESPRMAdminNode/RemoveNodeTags.cjs');
12
12
  require('../methods/ESPRMAdminNode/GetNodeTags.cjs');
13
13
  require('../methods/ESPRMAdminNode/GetCommandRequests.cjs');
14
14
  require('../methods/ESPRMAdminNode/AddCommandRequest.cjs');
15
+ require('../methods/ESPRMAdminNode/CancelCommandRequests.cjs');
15
16
  require('../methods/ESPRMAdminNode/GetTimeSeriesData.cjs');
16
17
  require('../methods/ESPRMAdminNode/GetSimpleTimeSeriesData.cjs');
17
18
  var ESPRMAdminNode = require('../ESPRMAdminNode.cjs');
@@ -10,8 +10,11 @@ require('../methods/ESPRMAdminNodeRegistration/GetNodeIds.cjs');
10
10
  require('../methods/ESPRMAdminNodeRegistration/GetNodeCertificates.cjs');
11
11
  require('../methods/ESPRMAdminNodeRegistration/GetNodeCertificateRegistrationStatus.cjs');
12
12
  require('../methods/ESPRMAdminNodeRegistration/RegisterNodeCertificates.cjs');
13
+ require('../methods/ESPRMAdminNodeRegistration/GetNodeCertificateUploadUrl.cjs');
13
14
  require('../methods/ESPRMAdminNodeRegistration/GetMQTTHost.cjs');
14
15
  require('../methods/ESPRMAdminNodeRegistration/GetCustomMQTTHost.cjs');
16
+ require('../methods/ESPRMAdminNodeRegistration/ListNodeRegistrationRequests.cjs');
17
+ require('../methods/ESPRMAdminNodeRegistration/GetNodeRegistrationRequest.cjs');
15
18
  var ESPRMAdminNodeRegistration = require('../ESPRMAdminNodeRegistration.cjs');
16
19
 
17
20
 
@@ -80,6 +80,7 @@ require('./methods/ESPRMAdminNode/RemoveNodeTags.cjs');
80
80
  require('./methods/ESPRMAdminNode/GetNodeTags.cjs');
81
81
  require('./methods/ESPRMAdminNode/GetCommandRequests.cjs');
82
82
  require('./methods/ESPRMAdminNode/AddCommandRequest.cjs');
83
+ require('./methods/ESPRMAdminNode/CancelCommandRequests.cjs');
83
84
  require('./methods/ESPRMAdminNode/GetTimeSeriesData.cjs');
84
85
  require('./methods/ESPRMAdminNode/GetSimpleTimeSeriesData.cjs');
85
86
  require('./methods/ESPRMAdminOTAImage/UploadImage.cjs');
@@ -160,8 +161,11 @@ require('./methods/ESPRMAdminNodeRegistration/GetNodeIds.cjs');
160
161
  require('./methods/ESPRMAdminNodeRegistration/GetNodeCertificates.cjs');
161
162
  require('./methods/ESPRMAdminNodeRegistration/GetNodeCertificateRegistrationStatus.cjs');
162
163
  require('./methods/ESPRMAdminNodeRegistration/RegisterNodeCertificates.cjs');
164
+ require('./methods/ESPRMAdminNodeRegistration/GetNodeCertificateUploadUrl.cjs');
163
165
  require('./methods/ESPRMAdminNodeRegistration/GetMQTTHost.cjs');
164
166
  require('./methods/ESPRMAdminNodeRegistration/GetCustomMQTTHost.cjs');
167
+ require('./methods/ESPRMAdminNodeRegistration/ListNodeRegistrationRequests.cjs');
168
+ require('./methods/ESPRMAdminNodeRegistration/GetNodeRegistrationRequest.cjs');
165
169
  require('./methods/ESPRMAdminSuperAdmin/ChangeSuperAdmin.cjs');
166
170
  require('./methods/ESPRMAdminSenderEmail/ChangeSenderEmail.cjs');
167
171
  require('./methods/ESPRMAdminCommonCustomData/SetCommonCustomData.cjs');
@@ -0,0 +1,27 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ 'use strict';
7
+
8
+ var ESPRMAdminNode = require('../../ESPRMAdminNode.cjs');
9
+ var ESPRMAPIManager = require('../../services/ESPRMAPIManager.cjs');
10
+ var constants = require('../../utils/constants.cjs');
11
+ var ESPAPICallValidationError = require('../../utils/error/ESPAPICallValidationError.cjs');
12
+
13
+ ESPRMAdminNode.ESPRMAdminNode.prototype.cancelCommandRequests = async function (params) {
14
+ if (!params?.request_id && !params?.node_id) {
15
+ throw new ESPAPICallValidationError.ESPAPICallValidationError(constants.APICallValidationErrorCodes.MISSING_CANCEL_COMMAND_SCOPE);
16
+ }
17
+ if (params.cmd_id !== undefined && !params.node_id) {
18
+ throw new ESPAPICallValidationError.ESPAPICallValidationError(constants.APICallValidationErrorCodes.CMD_ID_REQUIRES_NODE_ID);
19
+ }
20
+ const requestConfig = {
21
+ url: constants.APIEndpoints.ADMIN_CMD,
22
+ method: constants.HTTPMethods.DELETE,
23
+ params,
24
+ };
25
+ const response = await ESPRMAPIManager.ESPRMAPIManager.authorizeRequest(requestConfig);
26
+ return response;
27
+ };
@@ -0,0 +1,25 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ 'use strict';
7
+
8
+ var ESPRMAdminNodeRegistration = require('../../ESPRMAdminNodeRegistration.cjs');
9
+ var ESPRMAPIManager = require('../../services/ESPRMAPIManager.cjs');
10
+ var constants = require('../../utils/constants.cjs');
11
+ var ESPAPICallValidationError = require('../../utils/error/ESPAPICallValidationError.cjs');
12
+
13
+ ESPRMAdminNodeRegistration.ESPRMAdminNodeRegistration.prototype.getNodeCertificateUploadUrl =
14
+ async function (params) {
15
+ if (!params.file_name) {
16
+ throw new ESPAPICallValidationError.ESPAPICallValidationError(constants.APICallValidationErrorCodes.MISSING_FILE_NAME);
17
+ }
18
+ const requestConfig = {
19
+ url: constants.APIEndpoints.ADMIN_NODE_CERTIFICATES_REGISTER,
20
+ method: constants.HTTPMethods.GET,
21
+ params: { file_name: params.file_name },
22
+ };
23
+ const response = await ESPRMAPIManager.ESPRMAPIManager.authorizeRequest(requestConfig);
24
+ return response;
25
+ };
@@ -0,0 +1,24 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ 'use strict';
7
+
8
+ var ESPRMAdminNodeRegistration = require('../../ESPRMAdminNodeRegistration.cjs');
9
+ var ESPRMAPIManager = require('../../services/ESPRMAPIManager.cjs');
10
+ var constants = require('../../utils/constants.cjs');
11
+ var ESPAPICallValidationError = require('../../utils/error/ESPAPICallValidationError.cjs');
12
+
13
+ ESPRMAdminNodeRegistration.ESPRMAdminNodeRegistration.prototype.getNodeRegistrationRequest =
14
+ async function (requestId) {
15
+ if (!requestId) {
16
+ throw new ESPAPICallValidationError.ESPAPICallValidationError(constants.APICallValidationErrorCodes.MISSING_REQUEST_ID);
17
+ }
18
+ const requestConfig = {
19
+ url: `${constants.APIEndpoints.ADMIN_NODE_REGISTRATION_REQUESTS}/${encodeURIComponent(requestId)}`,
20
+ method: constants.HTTPMethods.GET,
21
+ };
22
+ const response = await ESPRMAPIManager.ESPRMAPIManager.authorizeRequest(requestConfig);
23
+ return response;
24
+ };
@@ -0,0 +1,21 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ 'use strict';
7
+
8
+ var ESPRMAdminNodeRegistration = require('../../ESPRMAdminNodeRegistration.cjs');
9
+ var ESPRMAPIManager = require('../../services/ESPRMAPIManager.cjs');
10
+ var constants = require('../../utils/constants.cjs');
11
+
12
+ ESPRMAdminNodeRegistration.ESPRMAdminNodeRegistration.prototype.listNodeRegistrationRequests =
13
+ async function (params) {
14
+ const requestConfig = {
15
+ url: constants.APIEndpoints.ADMIN_NODE_REGISTRATION_REQUESTS,
16
+ method: constants.HTTPMethods.GET,
17
+ ...(params && { params }),
18
+ };
19
+ const response = await ESPRMAPIManager.ESPRMAPIManager.authorizeRequest(requestConfig);
20
+ return response;
21
+ };
@@ -77,8 +77,16 @@ class ESPRMAPIManager {
77
77
  const base = requestConfig.baseURL ?? instance.#baseUrl;
78
78
  let requestUrl = `${base}/${requestConfig.url}`;
79
79
  if (requestConfig.params) {
80
- const queryParams = new URLSearchParams(requestConfig.params).toString();
81
- requestUrl += `?${queryParams}`;
80
+ // `URLSearchParams` stringifies every own key, so an optional param
81
+ // left as `undefined` would reach the backend as the literal text
82
+ // "undefined" and fail validation. Drop absent values and let
83
+ // numbers / booleans stringify explicitly.
84
+ const queryEntries = Object.entries(requestConfig.params)
85
+ .filter(([, value]) => value !== undefined && value !== null)
86
+ .map(([key, value]) => [key, String(value)]);
87
+ if (queryEntries.length > 0) {
88
+ requestUrl += `?${new URLSearchParams(queryEntries).toString()}`;
89
+ }
82
90
  }
83
91
  const fetchOptions = {
84
92
  method: requestConfig.method,
@@ -70,6 +70,7 @@ const APIEndpoints = {
70
70
  ADMIN_NODE_IDS: "admin/node_ids",
71
71
  ADMIN_NODE_CERTIFICATES: "admin/node_certificates",
72
72
  ADMIN_NODE_CERTIFICATES_REGISTER: "admin/node_certificates/register",
73
+ ADMIN_NODE_REGISTRATION_REQUESTS: "admin/node_registrations/requests",
73
74
  ADMIN_API_STATS: "admin/api_stats",
74
75
  ADMIN_MQTT_STATS: "admin/mqtt_stats",
75
76
  ADMIN_CHANGE_SUPER_ADMIN: "admin/change_super_admin",
@@ -150,6 +151,8 @@ const APICallValidationErrorCodes = {
150
151
  MISSING_PLATFORM_NAME: "MISSING_PLATFORM_NAME",
151
152
  MISSING_PLATFORM_APPLICATION_ARN: "MISSING_PLATFORM_APPLICATION_ARN",
152
153
  MISSING_BATCH_ID: "MISSING_BATCH_ID",
154
+ MISSING_CANCEL_COMMAND_SCOPE: "MISSING_CANCEL_COMMAND_SCOPE",
155
+ CMD_ID_REQUIRES_NODE_ID: "CMD_ID_REQUIRES_NODE_ID",
153
156
  };
154
157
  const TokenErrorCodes = {
155
158
  MISSING_ACCESS_TOKEN: "MISSING_ACCESS_TOKEN",
@@ -54,6 +54,8 @@ const apiCallValidationErrorMessages = {
54
54
  MISSING_PLATFORM_NAME: "ESPAPICallValidationError: Platform name is required.",
55
55
  MISSING_PLATFORM_APPLICATION_ARN: "ESPAPICallValidationError: Platform application ARN is required.",
56
56
  MISSING_BATCH_ID: "ESPAPICallValidationError: Batch ID is required.",
57
+ MISSING_CANCEL_COMMAND_SCOPE: "ESPAPICallValidationError: Request ID or node ID is required.",
58
+ CMD_ID_REQUIRES_NODE_ID: "ESPAPICallValidationError: Command ID can only be used together with a node ID.",
57
59
  };
58
60
  const tokenErrorMessages = {
59
61
  MISSING_ACCESS_TOKEN: "ESPTokenError: Access token is missing. User needs to authenticate.",
@@ -10,6 +10,7 @@ import '../methods/ESPRMAdminNode/RemoveNodeTags.js';
10
10
  import '../methods/ESPRMAdminNode/GetNodeTags.js';
11
11
  import '../methods/ESPRMAdminNode/GetCommandRequests.js';
12
12
  import '../methods/ESPRMAdminNode/AddCommandRequest.js';
13
+ import '../methods/ESPRMAdminNode/CancelCommandRequests.js';
13
14
  import '../methods/ESPRMAdminNode/GetTimeSeriesData.js';
14
15
  import '../methods/ESPRMAdminNode/GetSimpleTimeSeriesData.js';
15
16
  export { ESPRMAdminNode } from '../ESPRMAdminNode.js';
@@ -8,6 +8,9 @@ import '../methods/ESPRMAdminNodeRegistration/GetNodeIds.js';
8
8
  import '../methods/ESPRMAdminNodeRegistration/GetNodeCertificates.js';
9
9
  import '../methods/ESPRMAdminNodeRegistration/GetNodeCertificateRegistrationStatus.js';
10
10
  import '../methods/ESPRMAdminNodeRegistration/RegisterNodeCertificates.js';
11
+ import '../methods/ESPRMAdminNodeRegistration/GetNodeCertificateUploadUrl.js';
11
12
  import '../methods/ESPRMAdminNodeRegistration/GetMQTTHost.js';
12
13
  import '../methods/ESPRMAdminNodeRegistration/GetCustomMQTTHost.js';
14
+ import '../methods/ESPRMAdminNodeRegistration/ListNodeRegistrationRequests.js';
15
+ import '../methods/ESPRMAdminNodeRegistration/GetNodeRegistrationRequest.js';
13
16
  export { ESPRMAdminNodeRegistration } from '../ESPRMAdminNodeRegistration.js';
package/dist/esm/index.js CHANGED
@@ -78,6 +78,7 @@ import './methods/ESPRMAdminNode/RemoveNodeTags.js';
78
78
  import './methods/ESPRMAdminNode/GetNodeTags.js';
79
79
  import './methods/ESPRMAdminNode/GetCommandRequests.js';
80
80
  import './methods/ESPRMAdminNode/AddCommandRequest.js';
81
+ import './methods/ESPRMAdminNode/CancelCommandRequests.js';
81
82
  import './methods/ESPRMAdminNode/GetTimeSeriesData.js';
82
83
  import './methods/ESPRMAdminNode/GetSimpleTimeSeriesData.js';
83
84
  import './methods/ESPRMAdminOTAImage/UploadImage.js';
@@ -158,8 +159,11 @@ import './methods/ESPRMAdminNodeRegistration/GetNodeIds.js';
158
159
  import './methods/ESPRMAdminNodeRegistration/GetNodeCertificates.js';
159
160
  import './methods/ESPRMAdminNodeRegistration/GetNodeCertificateRegistrationStatus.js';
160
161
  import './methods/ESPRMAdminNodeRegistration/RegisterNodeCertificates.js';
162
+ import './methods/ESPRMAdminNodeRegistration/GetNodeCertificateUploadUrl.js';
161
163
  import './methods/ESPRMAdminNodeRegistration/GetMQTTHost.js';
162
164
  import './methods/ESPRMAdminNodeRegistration/GetCustomMQTTHost.js';
165
+ import './methods/ESPRMAdminNodeRegistration/ListNodeRegistrationRequests.js';
166
+ import './methods/ESPRMAdminNodeRegistration/GetNodeRegistrationRequest.js';
163
167
  import './methods/ESPRMAdminSuperAdmin/ChangeSuperAdmin.js';
164
168
  import './methods/ESPRMAdminSenderEmail/ChangeSenderEmail.js';
165
169
  import './methods/ESPRMAdminCommonCustomData/SetCommonCustomData.js';
@@ -0,0 +1,25 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { ESPRMAdminNode } from '../../ESPRMAdminNode.js';
7
+ import { ESPRMAPIManager } from '../../services/ESPRMAPIManager.js';
8
+ import { APICallValidationErrorCodes, HTTPMethods, APIEndpoints } from '../../utils/constants.js';
9
+ import { ESPAPICallValidationError } from '../../utils/error/ESPAPICallValidationError.js';
10
+
11
+ ESPRMAdminNode.prototype.cancelCommandRequests = async function (params) {
12
+ if (!params?.request_id && !params?.node_id) {
13
+ throw new ESPAPICallValidationError(APICallValidationErrorCodes.MISSING_CANCEL_COMMAND_SCOPE);
14
+ }
15
+ if (params.cmd_id !== undefined && !params.node_id) {
16
+ throw new ESPAPICallValidationError(APICallValidationErrorCodes.CMD_ID_REQUIRES_NODE_ID);
17
+ }
18
+ const requestConfig = {
19
+ url: APIEndpoints.ADMIN_CMD,
20
+ method: HTTPMethods.DELETE,
21
+ params,
22
+ };
23
+ const response = await ESPRMAPIManager.authorizeRequest(requestConfig);
24
+ return response;
25
+ };
@@ -0,0 +1,23 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { ESPRMAdminNodeRegistration } from '../../ESPRMAdminNodeRegistration.js';
7
+ import { ESPRMAPIManager } from '../../services/ESPRMAPIManager.js';
8
+ import { APICallValidationErrorCodes, HTTPMethods, APIEndpoints } from '../../utils/constants.js';
9
+ import { ESPAPICallValidationError } from '../../utils/error/ESPAPICallValidationError.js';
10
+
11
+ ESPRMAdminNodeRegistration.prototype.getNodeCertificateUploadUrl =
12
+ async function (params) {
13
+ if (!params.file_name) {
14
+ throw new ESPAPICallValidationError(APICallValidationErrorCodes.MISSING_FILE_NAME);
15
+ }
16
+ const requestConfig = {
17
+ url: APIEndpoints.ADMIN_NODE_CERTIFICATES_REGISTER,
18
+ method: HTTPMethods.GET,
19
+ params: { file_name: params.file_name },
20
+ };
21
+ const response = await ESPRMAPIManager.authorizeRequest(requestConfig);
22
+ return response;
23
+ };
@@ -0,0 +1,22 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { ESPRMAdminNodeRegistration } from '../../ESPRMAdminNodeRegistration.js';
7
+ import { ESPRMAPIManager } from '../../services/ESPRMAPIManager.js';
8
+ import { APICallValidationErrorCodes, HTTPMethods, APIEndpoints } from '../../utils/constants.js';
9
+ import { ESPAPICallValidationError } from '../../utils/error/ESPAPICallValidationError.js';
10
+
11
+ ESPRMAdminNodeRegistration.prototype.getNodeRegistrationRequest =
12
+ async function (requestId) {
13
+ if (!requestId) {
14
+ throw new ESPAPICallValidationError(APICallValidationErrorCodes.MISSING_REQUEST_ID);
15
+ }
16
+ const requestConfig = {
17
+ url: `${APIEndpoints.ADMIN_NODE_REGISTRATION_REQUESTS}/${encodeURIComponent(requestId)}`,
18
+ method: HTTPMethods.GET,
19
+ };
20
+ const response = await ESPRMAPIManager.authorizeRequest(requestConfig);
21
+ return response;
22
+ };
@@ -0,0 +1,19 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { ESPRMAdminNodeRegistration } from '../../ESPRMAdminNodeRegistration.js';
7
+ import { ESPRMAPIManager } from '../../services/ESPRMAPIManager.js';
8
+ import { HTTPMethods, APIEndpoints } from '../../utils/constants.js';
9
+
10
+ ESPRMAdminNodeRegistration.prototype.listNodeRegistrationRequests =
11
+ async function (params) {
12
+ const requestConfig = {
13
+ url: APIEndpoints.ADMIN_NODE_REGISTRATION_REQUESTS,
14
+ method: HTTPMethods.GET,
15
+ ...(params && { params }),
16
+ };
17
+ const response = await ESPRMAPIManager.authorizeRequest(requestConfig);
18
+ return response;
19
+ };
@@ -75,8 +75,16 @@ class ESPRMAPIManager {
75
75
  const base = requestConfig.baseURL ?? instance.#baseUrl;
76
76
  let requestUrl = `${base}/${requestConfig.url}`;
77
77
  if (requestConfig.params) {
78
- const queryParams = new URLSearchParams(requestConfig.params).toString();
79
- requestUrl += `?${queryParams}`;
78
+ // `URLSearchParams` stringifies every own key, so an optional param
79
+ // left as `undefined` would reach the backend as the literal text
80
+ // "undefined" and fail validation. Drop absent values and let
81
+ // numbers / booleans stringify explicitly.
82
+ const queryEntries = Object.entries(requestConfig.params)
83
+ .filter(([, value]) => value !== undefined && value !== null)
84
+ .map(([key, value]) => [key, String(value)]);
85
+ if (queryEntries.length > 0) {
86
+ requestUrl += `?${new URLSearchParams(queryEntries).toString()}`;
87
+ }
80
88
  }
81
89
  const fetchOptions = {
82
90
  method: requestConfig.method,
@@ -68,6 +68,7 @@ const APIEndpoints = {
68
68
  ADMIN_NODE_IDS: "admin/node_ids",
69
69
  ADMIN_NODE_CERTIFICATES: "admin/node_certificates",
70
70
  ADMIN_NODE_CERTIFICATES_REGISTER: "admin/node_certificates/register",
71
+ ADMIN_NODE_REGISTRATION_REQUESTS: "admin/node_registrations/requests",
71
72
  ADMIN_API_STATS: "admin/api_stats",
72
73
  ADMIN_MQTT_STATS: "admin/mqtt_stats",
73
74
  ADMIN_CHANGE_SUPER_ADMIN: "admin/change_super_admin",
@@ -148,6 +149,8 @@ const APICallValidationErrorCodes = {
148
149
  MISSING_PLATFORM_NAME: "MISSING_PLATFORM_NAME",
149
150
  MISSING_PLATFORM_APPLICATION_ARN: "MISSING_PLATFORM_APPLICATION_ARN",
150
151
  MISSING_BATCH_ID: "MISSING_BATCH_ID",
152
+ MISSING_CANCEL_COMMAND_SCOPE: "MISSING_CANCEL_COMMAND_SCOPE",
153
+ CMD_ID_REQUIRES_NODE_ID: "CMD_ID_REQUIRES_NODE_ID",
151
154
  };
152
155
  const TokenErrorCodes = {
153
156
  MISSING_ACCESS_TOKEN: "MISSING_ACCESS_TOKEN",
@@ -52,6 +52,8 @@ const apiCallValidationErrorMessages = {
52
52
  MISSING_PLATFORM_NAME: "ESPAPICallValidationError: Platform name is required.",
53
53
  MISSING_PLATFORM_APPLICATION_ARN: "ESPAPICallValidationError: Platform application ARN is required.",
54
54
  MISSING_BATCH_ID: "ESPAPICallValidationError: Batch ID is required.",
55
+ MISSING_CANCEL_COMMAND_SCOPE: "ESPAPICallValidationError: Request ID or node ID is required.",
56
+ CMD_ID_REQUIRES_NODE_ID: "ESPAPICallValidationError: Command ID can only be used together with a node ID.",
55
57
  };
56
58
  const tokenErrorMessages = {
57
59
  MISSING_ACCESS_TOKEN: "ESPTokenError: Access token is missing. User needs to authenticate.",
@@ -0,0 +1,22 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { CancelCommandRequestsParams, CancelCommandRequestsResponse } from "../../types/command_response.js";
7
+ declare module "../../ESPRMAdminNode.js" {
8
+ interface ESPRMAdminNode {
9
+ /**
10
+ * Cancels pending (`requested` or `in_progress`) command requests created by any user.
11
+ *
12
+ * - `request_id`: cancels that request. The backend rejects the call (131020)
13
+ * when the request is no longer pending.
14
+ * - `node_id`: cancels every pending request for the node, optionally narrowed
15
+ * by `cmd_id`. Returns `total_cancelled: 0` when nothing matches.
16
+ *
17
+ * @param params - The cancel scope.
18
+ * @returns The number of requests that were cancelled.
19
+ */
20
+ cancelCommandRequests(params: CancelCommandRequestsParams): Promise<CancelCommandRequestsResponse>;
21
+ }
22
+ }
@@ -10,5 +10,6 @@ import "./RemoveNodeTags.js";
10
10
  import "./GetNodeTags.js";
11
11
  import "./GetCommandRequests.js";
12
12
  import "./AddCommandRequest.js";
13
+ import "./CancelCommandRequests.js";
13
14
  import "./GetTimeSeriesData.js";
14
15
  import "./GetSimpleTimeSeriesData.js";
@@ -7,9 +7,10 @@ import { GetMQTTHostResponse } from "../../types/node_registration.js";
7
7
  declare module "../../ESPRMAdminNodeRegistration.js" {
8
8
  interface ESPRMAdminNodeRegistration {
9
9
  /**
10
- * Retrieves the default MQTT host endpoint for the deployment.
10
+ * Retrieves the deployment's default node endpoints: the MQTT host, the
11
+ * IoT credential provider host and, when configured, the HTTPS host.
11
12
  *
12
- * @returns The MQTT host information.
13
+ * @returns The node endpoint information.
13
14
  */
14
15
  getMQTTHost(): Promise<GetMQTTHostResponse>;
15
16
  }
@@ -0,0 +1,18 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { GetNodeCertificateUploadUrlParams, NodeCertificateUploadUrlResponse } from "../../types/node_registration.js";
7
+ declare module "../../ESPRMAdminNodeRegistration.js" {
8
+ interface ESPRMAdminNodeRegistration {
9
+ /**
10
+ * Fetches a pre-signed URL to upload a node certificates CSV, along with
11
+ * the request ID to pass to `registerNodeCertificates`.
12
+ *
13
+ * @param params - Must include the name of the CSV file.
14
+ * @returns The pre-signed upload URL and the registration request ID.
15
+ */
16
+ getNodeCertificateUploadUrl(params: GetNodeCertificateUploadUrlParams): Promise<NodeCertificateUploadUrlResponse>;
17
+ }
18
+ }
@@ -0,0 +1,17 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { NodeRegistrationRequestDetail } from "../../types/node_registration.js";
7
+ declare module "../../ESPRMAdminNodeRegistration.js" {
8
+ interface ESPRMAdminNodeRegistration {
9
+ /**
10
+ * Retrieves the full detail of a node certificate registration request.
11
+ *
12
+ * @param requestId - The ID of the registration request.
13
+ * @returns The registration request detail.
14
+ */
15
+ getNodeRegistrationRequest(requestId: string): Promise<NodeRegistrationRequestDetail>;
16
+ }
17
+ }
@@ -0,0 +1,19 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { ListNodeRegistrationRequestsParams } from "../../types/node_registration.js";
7
+ import { ListNodeRegistrationRequestsResponse } from "../../types/node_registration.js";
8
+ declare module "../../ESPRMAdminNodeRegistration.js" {
9
+ interface ESPRMAdminNodeRegistration {
10
+ /**
11
+ * Lists the node certificate registration requests of the signed-in
12
+ * admin, newest first.
13
+ *
14
+ * @param params - Optional status filter and pagination.
15
+ * @returns A page of registration requests.
16
+ */
17
+ listNodeRegistrationRequests(params?: ListNodeRegistrationRequestsParams): Promise<ListNodeRegistrationRequestsResponse>;
18
+ }
19
+ }
@@ -3,16 +3,16 @@
3
3
  *
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { RegisterNodeCertificatesRequest } from "../../types/node_registration.js";
7
- import { ESPAPISuccessResponse } from "../../types/api.js";
6
+ import { RegisterNodeCertificatesRequest, RegisterNodeCertificatesResponse } from "../../types/node_registration.js";
8
7
  declare module "../../ESPRMAdminNodeRegistration.js" {
9
8
  interface ESPRMAdminNodeRegistration {
10
9
  /**
11
- * Registers node certificates for device authentication.
10
+ * Triggers registration of the node certificates in a CSV that was
11
+ * uploaded to the URL from `getNodeCertificateUploadUrl`.
12
12
  *
13
- * @param params - The certificate data to register.
14
- * @returns A success response upon registration.
13
+ * @param params - The uploaded file details and registration options.
14
+ * @returns The ID of the registration request.
15
15
  */
16
- registerNodeCertificates(params: RegisterNodeCertificatesRequest): Promise<ESPAPISuccessResponse>;
16
+ registerNodeCertificates(params: RegisterNodeCertificatesRequest): Promise<RegisterNodeCertificatesResponse>;
17
17
  }
18
18
  }