@serve.zone/interfaces 31.6.0 → 31.7.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.
- package/changelog.md +15 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/requests/node.d.ts +31 -0
- package/package.json +1 -1
- package/readme.md +13 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/requests/node.ts +35 -0
package/changelog.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-09-17 - 31.7.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- Add `setClusterNodeCorestoreEndpoint { identity; nodeId; endpoint }`, the admin path for the
|
|
8
|
+
per-node Corestore endpoint the relay dials. `IClusterNode.data.corestore { endpoint }` has been
|
|
9
|
+
the contract since 31.6.0, with no request that sets it: an administrator had no way to state
|
|
10
|
+
where a node's Corestore answers, so a relay serving that cluster had nowhere to dial. Cloudly
|
|
11
|
+
answers with the node as it now stands, validates the endpoint with `validateClusterNodeCorestore`
|
|
12
|
+
before writing, fences the node inside the writing transaction so a concurrent deletion conflicts,
|
|
13
|
+
and pushes the cluster configuration afterwards so connected relays learn the change without
|
|
14
|
+
reconnecting; `endpoint: null` clears it and states the same fact as never having set one. One
|
|
15
|
+
field with one validator, deliberately not a node-wide update whose per-field authority nobody
|
|
16
|
+
defined.
|
|
17
|
+
|
|
3
18
|
## 2026-09-17 - 31.6.0
|
|
4
19
|
|
|
5
20
|
### Features
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/interfaces',
|
|
6
|
-
version: '31.
|
|
6
|
+
version: '31.7.0',
|
|
7
7
|
description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLHVGQUF1RjtDQUNyRyxDQUFBIn0=
|
|
@@ -150,6 +150,37 @@ export interface IReq_Any_Cloudly_DeleteNodeById extends plugins.typedrequestInt
|
|
|
150
150
|
ok: boolean;
|
|
151
151
|
};
|
|
152
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* An administrator states where one node's Corestore control API answers.
|
|
155
|
+
*
|
|
156
|
+
* Corestore is node-local, so one relay serving a whole cluster must be told per node where to
|
|
157
|
+
* dial; the cluster-local alias every component used while Docker Swarm resolved it is exactly
|
|
158
|
+
* what stops resolving. The endpoint is control-plane state Cloudly owns and the relay reads,
|
|
159
|
+
* so an administrator sets it here rather than a relay discovering it.
|
|
160
|
+
*
|
|
161
|
+
* Cloudly validates the endpoint with `validateClusterNodeCorestore` before it writes, takes the
|
|
162
|
+
* node's own real-write fence inside the writing transaction so a concurrent deletion conflicts
|
|
163
|
+
* instead of leaving an endpoint behind for a node that is gone, and pushes the cluster
|
|
164
|
+
* configuration afterwards so every connected relay learns the change without reconnecting.
|
|
165
|
+
*
|
|
166
|
+
* `endpoint: null` clears it, which is the same fact as never having set one: the node runs no
|
|
167
|
+
* Corestore the relay may reach, and an inventory for it answers
|
|
168
|
+
* `errorCode: 'CORESTORE_ENDPOINT_UNKNOWN'` rather than guessing a hostname. The endpoint says
|
|
169
|
+
* where, never with what — no credential travels in this request or in the node document.
|
|
170
|
+
*/
|
|
171
|
+
export interface IReq_Any_Cloudly_SetClusterNodeCorestoreEndpoint extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Any_Cloudly_SetClusterNodeCorestoreEndpoint> {
|
|
172
|
+
method: 'setClusterNodeCorestoreEndpoint';
|
|
173
|
+
request: {
|
|
174
|
+
identity: IIdentity;
|
|
175
|
+
nodeId: string;
|
|
176
|
+
/** A canonical `http:` or `https:` origin, or `null` to state that this node has none. */
|
|
177
|
+
endpoint: string | null;
|
|
178
|
+
};
|
|
179
|
+
response: {
|
|
180
|
+
/** The node as it now stands, so a caller needs no second read to see what it set. */
|
|
181
|
+
node: IClusterNode;
|
|
182
|
+
};
|
|
183
|
+
}
|
|
153
184
|
export interface IRequest_Spark_Cloudly_SendHeartbeat extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Spark_Cloudly_SendHeartbeat> {
|
|
154
185
|
method: 'sparkNodeHeartbeat';
|
|
155
186
|
request: {
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -1118,6 +1118,8 @@ answers with the block Cloudly published, and `disableClusterRelayV1` removes it
|
|
|
1118
1118
|
an explicit `relay: null`. The caller names only the cluster: Cloudly derives the origin itself
|
|
1119
1119
|
from that cluster and its own public hostname, and refuses the request when no DNS zone it
|
|
1120
1120
|
manages matches the derived name, so a relay name that nothing can publish is never written.
|
|
1121
|
+
Both requests push the cluster configuration to the connected relay afterwards, so a relay learns
|
|
1122
|
+
the change without reconnecting.
|
|
1121
1123
|
|
|
1122
1124
|
Once its socket is authenticated with `registerCloudlyClientSessionV1`, the relay sends
|
|
1123
1125
|
`registerClusterRelayV1` carrying `IClusterRelayRegistrationV1`: the relay build, the cluster node
|
|
@@ -1828,6 +1830,17 @@ is admitted so putting TLS in front of Corestore needs no contract change. Absen
|
|
|
1828
1830
|
runs no Corestore the relay may reach, which an inventory reports as
|
|
1829
1831
|
`errorCode: 'CORESTORE_ENDPOINT_UNKNOWN'` rather than guessing a hostname.
|
|
1830
1832
|
|
|
1833
|
+
An administrator sets it with `setClusterNodeCorestoreEndpoint { identity; nodeId; endpoint }`,
|
|
1834
|
+
answered by Cloudly with the node as it now stands. Cloudly validates the endpoint with
|
|
1835
|
+
`validateClusterNodeCorestore` before it writes, takes the node's own real-write fence inside the
|
|
1836
|
+
writing transaction so a concurrent deletion conflicts instead of leaving an endpoint behind for a
|
|
1837
|
+
node that is gone, and pushes the cluster configuration afterwards so every connected relay learns
|
|
1838
|
+
the change without reconnecting — the same push that
|
|
1839
|
+
[the cluster relay block](#cluster-relay-block) uses when an operator enables or disables a relay.
|
|
1840
|
+
`endpoint: null` clears it, which states the same fact as never having set one. There is no
|
|
1841
|
+
node-wide update request: one field with one validator cannot drift into a generic node mutation
|
|
1842
|
+
whose per-field authority nobody defined.
|
|
1843
|
+
|
|
1831
1844
|
The endpoint says where, never with what. The bearer control token that authorizes every call is
|
|
1832
1845
|
obtained from Cloudly through `getCorestoreControlCredentialMaterial`, sealed to the X25519
|
|
1833
1846
|
recipient the relay enrolled with `beginSecretRecipientEnrollment` and
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/requests/node.ts
CHANGED
|
@@ -203,6 +203,41 @@ export interface IReq_Any_Cloudly_DeleteNodeById extends plugins.typedrequestInt
|
|
|
203
203
|
};
|
|
204
204
|
}
|
|
205
205
|
|
|
206
|
+
/**
|
|
207
|
+
* An administrator states where one node's Corestore control API answers.
|
|
208
|
+
*
|
|
209
|
+
* Corestore is node-local, so one relay serving a whole cluster must be told per node where to
|
|
210
|
+
* dial; the cluster-local alias every component used while Docker Swarm resolved it is exactly
|
|
211
|
+
* what stops resolving. The endpoint is control-plane state Cloudly owns and the relay reads,
|
|
212
|
+
* so an administrator sets it here rather than a relay discovering it.
|
|
213
|
+
*
|
|
214
|
+
* Cloudly validates the endpoint with `validateClusterNodeCorestore` before it writes, takes the
|
|
215
|
+
* node's own real-write fence inside the writing transaction so a concurrent deletion conflicts
|
|
216
|
+
* instead of leaving an endpoint behind for a node that is gone, and pushes the cluster
|
|
217
|
+
* configuration afterwards so every connected relay learns the change without reconnecting.
|
|
218
|
+
*
|
|
219
|
+
* `endpoint: null` clears it, which is the same fact as never having set one: the node runs no
|
|
220
|
+
* Corestore the relay may reach, and an inventory for it answers
|
|
221
|
+
* `errorCode: 'CORESTORE_ENDPOINT_UNKNOWN'` rather than guessing a hostname. The endpoint says
|
|
222
|
+
* where, never with what — no credential travels in this request or in the node document.
|
|
223
|
+
*/
|
|
224
|
+
export interface IReq_Any_Cloudly_SetClusterNodeCorestoreEndpoint extends plugins.typedrequestInterfaces.implementsTR<
|
|
225
|
+
plugins.typedrequestInterfaces.ITypedRequest,
|
|
226
|
+
IReq_Any_Cloudly_SetClusterNodeCorestoreEndpoint
|
|
227
|
+
> {
|
|
228
|
+
method: 'setClusterNodeCorestoreEndpoint';
|
|
229
|
+
request: {
|
|
230
|
+
identity: IIdentity;
|
|
231
|
+
nodeId: string;
|
|
232
|
+
/** A canonical `http:` or `https:` origin, or `null` to state that this node has none. */
|
|
233
|
+
endpoint: string | null;
|
|
234
|
+
};
|
|
235
|
+
response: {
|
|
236
|
+
/** The node as it now stands, so a caller needs no second read to see what it set. */
|
|
237
|
+
node: IClusterNode;
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
|
|
206
241
|
export interface IRequest_Spark_Cloudly_SendHeartbeat extends plugins.typedrequestInterfaces.implementsTR<
|
|
207
242
|
plugins.typedrequestInterfaces.ITypedRequest,
|
|
208
243
|
IRequest_Spark_Cloudly_SendHeartbeat
|