@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 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.0',
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serve.zone/interfaces",
3
- "version": "31.6.0",
3
+ "version": "31.7.0",
4
4
  "private": false,
5
5
  "description": "Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.",
6
6
  "exports": {
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
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/interfaces',
6
- version: '31.6.0',
6
+ version: '31.7.0',
7
7
  description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
8
8
  }
@@ -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