@serve.zone/interfaces 32.27.0 → 32.28.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 +16 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/data/runtimelocalstorageclaim.d.ts +76 -0
- package/dist_ts/data/runtimelocalstorageclaim.js +99 -8
- package/dist_ts/requests/runtimesession.d.ts +12 -0
- package/package.json +1 -1
- package/readme.md +23 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/runtimelocalstorageclaim.ts +173 -8
- package/ts/requests/runtimesession.ts +16 -0
package/changelog.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-09-26 - 32.28.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- Let an administrator read the runtime local storage claims Cloudly issued.
|
|
8
|
+
- `requests.runtimesession.IReq_Any_Cloudly_GetRuntimeLocalStorageClaims`
|
|
9
|
+
(`getRuntimeLocalStorageClaims`): `{ identity, clusterId, nodeId?, cursor?, limit? }` →
|
|
10
|
+
`{ claims, nextCursor? }`, paged at most `runtimeLocalStorageClaimContract.maximumSummaryPageSize`
|
|
11
|
+
(200) summaries in ascending `claimId` order.
|
|
12
|
+
- `IRuntimeLocalStorageClaimSummary { claimId, generation, clusterId, nodeId, serviceId, volumeId,
|
|
13
|
+
mountPath, sourceKind, initialization, lifecycle, state }`, with `state` `null` until the node
|
|
14
|
+
acknowledged the generation; no digest, controller epoch or credential reference.
|
|
15
|
+
- `summarizeRuntimeLocalStorageClaim()`, `snapshotRuntimeLocalStorageClaimSummary()`,
|
|
16
|
+
`snapshotGetRuntimeLocalStorageClaimsRequest()`, `snapshotGetRuntimeLocalStorageClaimsResponse()`
|
|
17
|
+
and `bindGetRuntimeLocalStorageClaimsResponse()`.
|
|
18
|
+
|
|
3
19
|
## 2026-09-26 - 32.27.0
|
|
4
20
|
|
|
5
21
|
### Features
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/interfaces',
|
|
6
|
-
version: '32.
|
|
6
|
+
version: '32.28.0',
|
|
7
7
|
description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsV0FBVyxFQUFFLHVGQUF1RjtDQUNyRyxDQUFBIn0=
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { TSha256Digest } from './immutableimage.js';
|
|
2
2
|
import type { IRuntimeAssignment, IRuntimeAuthorityReference, IRuntimeController } from './runtimeassignment.js';
|
|
3
3
|
import type { IRuntimeSessionBinding } from './runtimesession.js';
|
|
4
|
+
import type { IIdentityCredential } from './user.js';
|
|
4
5
|
/** A node-local directory the node derives from the claim's identity under a root only the node knows. */
|
|
5
6
|
export type TRuntimeLocalStorageDirectorySource = {
|
|
6
7
|
kind: 'directory';
|
|
@@ -136,6 +137,57 @@ export interface IApplyRuntimeLocalStorageClaimResponse {
|
|
|
136
137
|
state: TRuntimeLocalStorageClaimState;
|
|
137
138
|
claim: IRuntimeAuthorityReference;
|
|
138
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* What an administrator reads about one local storage claim a controller issued: where the volume
|
|
142
|
+
* is, whose it is, how it starts and what its node last answered.
|
|
143
|
+
*
|
|
144
|
+
* It is a projection of the controller's current generation, never the claim itself: it carries no
|
|
145
|
+
* digest, no controller epoch and no source beyond its kind, so an SMB claim's credential reference
|
|
146
|
+
* is not in it. `claimId` is the claim's `id`, the name the node keys the volume by, including the
|
|
147
|
+
* `import/<claimId>` directory an operator places an `import` volume's bytes in; a reader takes it
|
|
148
|
+
* from here and never derives it.
|
|
149
|
+
*
|
|
150
|
+
* `state` is what the node answered about exactly `generation`, or `null` while the node has not
|
|
151
|
+
* acknowledged that generation. It follows the rule `bindApplyRuntimeLocalStorageClaimResponse`
|
|
152
|
+
* holds an answer to: a bound claim is `ready`, `import-required` (an `import` claim only) or
|
|
153
|
+
* `uncertain`; a purge is `purged` or `uncertain`.
|
|
154
|
+
*/
|
|
155
|
+
export interface IRuntimeLocalStorageClaimSummary {
|
|
156
|
+
claimId: string;
|
|
157
|
+
generation: number;
|
|
158
|
+
clusterId: string;
|
|
159
|
+
nodeId: string;
|
|
160
|
+
serviceId: string;
|
|
161
|
+
volumeId: string;
|
|
162
|
+
mountPath: string;
|
|
163
|
+
sourceKind: TRuntimeLocalStorageSource['kind'];
|
|
164
|
+
initialization: IRuntimeLocalStorageClaim['initialization'];
|
|
165
|
+
lifecycle: TRuntimeLocalStorageLifecycle;
|
|
166
|
+
state: TRuntimeLocalStorageClaimState | null;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* An administrator's read of the local storage claims of one cluster, optionally of one node.
|
|
170
|
+
*
|
|
171
|
+
* Paged: `cursor` is the opaque `nextCursor` of the previous page, and `limit` asks for at most that
|
|
172
|
+
* many summaries, which the controller may lower but never exceed; both absent read the first page
|
|
173
|
+
* at the controller's own size.
|
|
174
|
+
*/
|
|
175
|
+
export interface IGetRuntimeLocalStorageClaimsRequest {
|
|
176
|
+
/** The controller verifies this credential and derives every actor claim itself. */
|
|
177
|
+
identity: IIdentityCredential;
|
|
178
|
+
clusterId: string;
|
|
179
|
+
nodeId?: string;
|
|
180
|
+
cursor?: string;
|
|
181
|
+
limit?: number;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* One page of summaries in strictly ascending `claimId` order. `nextCursor` is omitted on the final
|
|
185
|
+
* page; a page that carries it carries at least one summary.
|
|
186
|
+
*/
|
|
187
|
+
export interface IGetRuntimeLocalStorageClaimsResponse {
|
|
188
|
+
claims: IRuntimeLocalStorageClaimSummary[];
|
|
189
|
+
nextCursor?: string;
|
|
190
|
+
}
|
|
139
191
|
export declare const runtimeLocalStorageClaimContract: Readonly<{
|
|
140
192
|
readonly digestDomain: "serve.zone/runtime-local-storage-claim";
|
|
141
193
|
readonly error: "Runtime local storage claim contract rejected.";
|
|
@@ -153,6 +205,11 @@ export declare const runtimeLocalStorageClaimContract: Readonly<{
|
|
|
153
205
|
readonly maximumSegmentLength: 255;
|
|
154
206
|
/** The longest SMB share name. */
|
|
155
207
|
readonly maximumShareLength: 80;
|
|
208
|
+
/**
|
|
209
|
+
* The most claim summaries one `getRuntimeLocalStorageClaims` page carries. A page of summaries
|
|
210
|
+
* with every field at its bound stays inside the network contract's one-mebibyte capture.
|
|
211
|
+
*/
|
|
212
|
+
readonly maximumSummaryPageSize: 200;
|
|
156
213
|
}>;
|
|
157
214
|
/** Detached exact-schema snapshot. The digest is a separate check. */
|
|
158
215
|
export declare const snapshotRuntimeLocalStorageClaim: (valueArg: unknown) => IRuntimeLocalStorageClaim;
|
|
@@ -185,3 +242,22 @@ export declare const bindApplyRuntimeLocalStorageClaimRequest: (valueArg: unknow
|
|
|
185
242
|
* newer generation the node holds, so its state is not judged against the sent claim.
|
|
186
243
|
*/
|
|
187
244
|
export declare const bindApplyRuntimeLocalStorageClaimResponse: (valueArg: unknown, requestArg: unknown) => IApplyRuntimeLocalStorageClaimResponse;
|
|
245
|
+
/** Detached exact-schema snapshot of one summary, its state judged against its lifecycle. */
|
|
246
|
+
export declare const snapshotRuntimeLocalStorageClaimSummary: (valueArg: unknown) => IRuntimeLocalStorageClaimSummary;
|
|
247
|
+
/**
|
|
248
|
+
* The one projection of a claim and its node's last answer into a summary. `stateArg` is what the
|
|
249
|
+
* node answered about exactly this generation, or `null` while it has not acknowledged it.
|
|
250
|
+
*/
|
|
251
|
+
export declare const summarizeRuntimeLocalStorageClaim: (claimArg: unknown, stateArg: TRuntimeLocalStorageClaimState | null) => IRuntimeLocalStorageClaimSummary;
|
|
252
|
+
/**
|
|
253
|
+
* Detached exact-schema snapshot of a read request. It checks the identity's shape only: the
|
|
254
|
+
* controller authenticates it.
|
|
255
|
+
*/
|
|
256
|
+
export declare const snapshotGetRuntimeLocalStorageClaimsRequest: (valueArg: unknown) => IGetRuntimeLocalStorageClaimsRequest;
|
|
257
|
+
/** Detached exact-schema snapshot of one page: bounded, strictly ascending and never empty with a cursor. */
|
|
258
|
+
export declare const snapshotGetRuntimeLocalStorageClaimsResponse: (valueArg: unknown) => IGetRuntimeLocalStorageClaimsResponse;
|
|
259
|
+
/**
|
|
260
|
+
* Matches a page to the read that asked for it: every summary names the requested cluster and, when
|
|
261
|
+
* the request named one, the requested node, and the page holds no more than the requested `limit`.
|
|
262
|
+
*/
|
|
263
|
+
export declare const bindGetRuntimeLocalStorageClaimsResponse: (valueArg: unknown, requestArg: unknown) => IGetRuntimeLocalStorageClaimsResponse;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { snapshotRuntimeAssignment, validateRuntimeAssignment } from './runtimeassignment.js';
|
|
2
2
|
import { snapshotRuntimeSessionBinding } from './runtimesession.js';
|
|
3
|
-
import { captureNetwork, networkController, networkDigest, networkEqual, networkHash, networkId, networkNodeId, networkRecord, networkReference, networkReferenceOf, networkRevision, requireNetwork, } from '../private/networkcontract.js';
|
|
3
|
+
import { captureNetwork, networkController, networkCounter, networkDigest, networkEqual, networkHash, networkId, networkList, networkNodeId, networkRecord, networkReference, networkReferenceOf, networkRevision, networkSorted, requireNetwork, } from '../private/networkcontract.js';
|
|
4
4
|
import { parseCanonicalIpAddress } from '../private/ipaddress.js';
|
|
5
5
|
import { isRuntimeIdentityNumber } from '../private/runtimepolicy.js';
|
|
6
6
|
import { createStorageContractReaders } from '../private/storagecontract.js';
|
|
@@ -21,6 +21,11 @@ export const runtimeLocalStorageClaimContract = Object.freeze({
|
|
|
21
21
|
maximumSegmentLength: 255,
|
|
22
22
|
/** The longest SMB share name. */
|
|
23
23
|
maximumShareLength: 80,
|
|
24
|
+
/**
|
|
25
|
+
* The most claim summaries one `getRuntimeLocalStorageClaims` page carries. A page of summaries
|
|
26
|
+
* with every field at its bound stays inside the network contract's one-mebibyte capture.
|
|
27
|
+
*/
|
|
28
|
+
maximumSummaryPageSize: 200,
|
|
24
29
|
});
|
|
25
30
|
const fail = () => { throw new Error(runtimeLocalStorageClaimContract.error); };
|
|
26
31
|
const safe = (operationArg) => { try {
|
|
@@ -79,6 +84,11 @@ const shareOf = (valueArg) => {
|
|
|
79
84
|
&& isPathSegment(valueArg) && !shareForbiddenPattern.test(valueArg));
|
|
80
85
|
return valueArg;
|
|
81
86
|
};
|
|
87
|
+
/** The states a node may answer about one generation, whatever the answer's status. */
|
|
88
|
+
const isClaimStateOf = (claimArg, stateArg) => claimArg.lifecycle === 'purge'
|
|
89
|
+
? stateArg === 'purged' || stateArg === 'uncertain'
|
|
90
|
+
: stateArg === 'ready' || stateArg === 'uncertain'
|
|
91
|
+
|| (stateArg === 'import-required' && claimArg.initialization === 'import');
|
|
82
92
|
const literalOf = (valueArg, allowedArg) => {
|
|
83
93
|
requireNetwork(allowedArg.includes(valueArg));
|
|
84
94
|
return valueArg;
|
|
@@ -243,12 +253,93 @@ export const bindApplyRuntimeLocalStorageClaimResponse = (valueArg, requestArg)
|
|
|
243
253
|
const response = snapshotApplyRuntimeLocalStorageClaimResponse(valueArg);
|
|
244
254
|
const { claim } = snapshotApplyRuntimeLocalStorageClaimRequest(requestArg);
|
|
245
255
|
requireNetwork(networkEqual(response.claim, getRuntimeLocalStorageClaimReference(claim)));
|
|
246
|
-
if (response.status !== 'historical')
|
|
247
|
-
requireNetwork(claim.
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
256
|
+
if (response.status !== 'historical')
|
|
257
|
+
requireNetwork(isClaimStateOf(claim, response.state));
|
|
258
|
+
return response;
|
|
259
|
+
});
|
|
260
|
+
const sourceKinds = ['directory', 'nfs', 'smb'];
|
|
261
|
+
const initializations = ['empty', 'import'];
|
|
262
|
+
const lifecycles = ['bound', 'purge'];
|
|
263
|
+
/** Detached exact-schema snapshot of one summary, its state judged against its lifecycle. */
|
|
264
|
+
export const snapshotRuntimeLocalStorageClaimSummary = (valueArg) => safe(() => {
|
|
265
|
+
const value = networkRecord(captureNetwork(valueArg), ['claimId', 'generation', 'clusterId', 'nodeId',
|
|
266
|
+
'serviceId', 'volumeId', 'mountPath', 'sourceKind', 'initialization', 'lifecycle', 'state']);
|
|
267
|
+
const summary = {
|
|
268
|
+
claimId: networkId(value.claimId),
|
|
269
|
+
generation: networkCounter(value.generation),
|
|
270
|
+
clusterId: networkId(value.clusterId),
|
|
271
|
+
nodeId: networkNodeId(value.nodeId),
|
|
272
|
+
serviceId: networkId(value.serviceId),
|
|
273
|
+
volumeId: networkId(value.volumeId),
|
|
274
|
+
mountPath: readMountPath(value.mountPath, 'mountPath'),
|
|
275
|
+
sourceKind: literalOf(value.sourceKind, sourceKinds),
|
|
276
|
+
initialization: literalOf(value.initialization, initializations),
|
|
277
|
+
lifecycle: literalOf(value.lifecycle, lifecycles),
|
|
278
|
+
state: value.state === null ? null : literalOf(value.state, claimStates),
|
|
279
|
+
};
|
|
280
|
+
// A purge always follows a bound generation, and an SMB volume always starts empty.
|
|
281
|
+
requireNetwork((summary.lifecycle === 'bound' || summary.generation > 1)
|
|
282
|
+
&& (summary.sourceKind !== 'smb' || summary.initialization === 'empty')
|
|
283
|
+
&& (summary.state === null || isClaimStateOf(summary, summary.state)));
|
|
284
|
+
return summary;
|
|
285
|
+
});
|
|
286
|
+
/**
|
|
287
|
+
* The one projection of a claim and its node's last answer into a summary. `stateArg` is what the
|
|
288
|
+
* node answered about exactly this generation, or `null` while it has not acknowledged it.
|
|
289
|
+
*/
|
|
290
|
+
export const summarizeRuntimeLocalStorageClaim = (claimArg, stateArg) => {
|
|
291
|
+
const claim = snapshotRuntimeLocalStorageClaim(claimArg);
|
|
292
|
+
return snapshotRuntimeLocalStorageClaimSummary({
|
|
293
|
+
claimId: claim.id,
|
|
294
|
+
generation: claim.generation,
|
|
295
|
+
clusterId: claim.clusterId,
|
|
296
|
+
nodeId: claim.nodeId,
|
|
297
|
+
serviceId: claim.serviceId,
|
|
298
|
+
volumeId: claim.volumeId,
|
|
299
|
+
mountPath: claim.mount.mountPath,
|
|
300
|
+
sourceKind: claim.source.kind,
|
|
301
|
+
initialization: claim.initialization,
|
|
302
|
+
lifecycle: claim.lifecycle,
|
|
303
|
+
state: stateArg,
|
|
304
|
+
});
|
|
305
|
+
};
|
|
306
|
+
/**
|
|
307
|
+
* Detached exact-schema snapshot of a read request. It checks the identity's shape only: the
|
|
308
|
+
* controller authenticates it.
|
|
309
|
+
*/
|
|
310
|
+
export const snapshotGetRuntimeLocalStorageClaimsRequest = (valueArg) => safe(() => {
|
|
311
|
+
const value = networkRecord(captureNetwork(valueArg), ['identity', 'clusterId'], ['nodeId', 'cursor', 'limit']);
|
|
312
|
+
const identity = networkRecord(value.identity, ['jwt']);
|
|
313
|
+
requireNetwork(typeof identity.jwt === 'string' && identity.jwt.length > 0);
|
|
314
|
+
return {
|
|
315
|
+
identity: { jwt: identity.jwt },
|
|
316
|
+
clusterId: networkId(value.clusterId),
|
|
317
|
+
...(Object.hasOwn(value, 'nodeId') ? { nodeId: networkNodeId(value.nodeId) } : {}),
|
|
318
|
+
...(Object.hasOwn(value, 'cursor') ? { cursor: networkId(value.cursor) } : {}),
|
|
319
|
+
...(Object.hasOwn(value, 'limit')
|
|
320
|
+
? { limit: networkCounter(value.limit, runtimeLocalStorageClaimContract.maximumSummaryPageSize) } : {}),
|
|
321
|
+
};
|
|
322
|
+
});
|
|
323
|
+
/** Detached exact-schema snapshot of one page: bounded, strictly ascending and never empty with a cursor. */
|
|
324
|
+
export const snapshotGetRuntimeLocalStorageClaimsResponse = (valueArg) => safe(() => {
|
|
325
|
+
const value = networkRecord(captureNetwork(valueArg), ['claims'], ['nextCursor']);
|
|
326
|
+
const claims = networkList(value.claims, runtimeLocalStorageClaimContract.maximumSummaryPageSize, snapshotRuntimeLocalStorageClaimSummary);
|
|
327
|
+
networkSorted(claims, (claimArg) => claimArg.claimId);
|
|
328
|
+
if (!Object.hasOwn(value, 'nextCursor'))
|
|
329
|
+
return { claims };
|
|
330
|
+
requireNetwork(claims.length > 0);
|
|
331
|
+
return { claims, nextCursor: networkId(value.nextCursor) };
|
|
332
|
+
});
|
|
333
|
+
/**
|
|
334
|
+
* Matches a page to the read that asked for it: every summary names the requested cluster and, when
|
|
335
|
+
* the request named one, the requested node, and the page holds no more than the requested `limit`.
|
|
336
|
+
*/
|
|
337
|
+
export const bindGetRuntimeLocalStorageClaimsResponse = (valueArg, requestArg) => safe(() => {
|
|
338
|
+
const response = snapshotGetRuntimeLocalStorageClaimsResponse(valueArg);
|
|
339
|
+
const request = snapshotGetRuntimeLocalStorageClaimsRequest(requestArg);
|
|
340
|
+
requireNetwork(response.claims.length <= (request.limit ?? runtimeLocalStorageClaimContract.maximumSummaryPageSize)
|
|
341
|
+
&& response.claims.every((claimArg) => claimArg.clusterId === request.clusterId
|
|
342
|
+
&& (request.nodeId === undefined || claimArg.nodeId === request.nodeId)));
|
|
252
343
|
return response;
|
|
253
344
|
});
|
|
254
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWxvY2Fsc3RvcmFnZWNsYWltLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9ydW50aW1lbG9jYWxzdG9yYWdlY2xhaW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQzdGLGFBQWEsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGNBQWMsR0FDcEcsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQXlKN0UsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1RCxZQUFZLEVBQUUsd0NBQXdDO0lBQ3RELEtBQUssRUFBRSxnREFBZ0Q7SUFDdkQsVUFBVSxFQUFFLGVBQWU7SUFDM0IsYUFBYSxFQUFFLFFBQVE7SUFDdkIsbUZBQW1GO0lBQ25GLGlCQUFpQixFQUFFLE1BQU07SUFDekIsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO0lBQ3ZDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDO0lBQ3JDLHFFQUFxRTtJQUNyRSxtQkFBbUIsRUFBRSxHQUFHO0lBQ3hCLDRGQUE0RjtJQUM1RixpQkFBaUIsRUFBRSxJ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
|
|
345
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWxvY2Fsc3RvcmFnZWNsYWltLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9ydW50aW1lbG9jYWxzdG9yYWdlY2xhaW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFcEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUM3RyxXQUFXLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUMvRyxjQUFjLEdBQ2YsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQStNN0UsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1RCxZQUFZLEVBQUUsd0NBQXdDO0lBQ3RELEtBQUssRUFBRSxnREFBZ0Q7SUFDdkQsVUFBVSxFQUFFLGVBQWU7SUFDM0IsYUFBYSxFQUFFLFFBQVE7SUFDdkIsbUZBQW1GO0lBQ25GLGlCQUFpQixFQUFFLE1BQU07SUFDekIsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO0lBQ3ZDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDO0lBQ3JDLHFFQUFxRTtJQUNyRSxtQkFBbUIsRUFBRSxHQUFHO0lB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
|
|
@@ -137,6 +137,18 @@ export interface IReq_Controller_Pallet_ApplyRuntimeLocalStorageClaim extends pl
|
|
|
137
137
|
request: localStorage.IApplyRuntimeLocalStorageClaimRequest;
|
|
138
138
|
response: localStorage.IApplyRuntimeLocalStorageClaimResponse;
|
|
139
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* An administrator reads the local storage claims Cloudly issued in one cluster, optionally on one
|
|
142
|
+
* node, one page at a time: each claim's id, volume, mount path, initialization, lifecycle and what
|
|
143
|
+
* its node last answered. `snapshotGetRuntimeLocalStorageClaimsRequest` and
|
|
144
|
+
* `bindGetRuntimeLocalStorageClaimsResponse` judge both sides; a summary never carries the claim's
|
|
145
|
+
* source beyond its kind, so no credential reference leaves Cloudly through it.
|
|
146
|
+
*/
|
|
147
|
+
export interface IReq_Any_Cloudly_GetRuntimeLocalStorageClaims extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Any_Cloudly_GetRuntimeLocalStorageClaims> {
|
|
148
|
+
method: 'getRuntimeLocalStorageClaims';
|
|
149
|
+
request: localStorage.IGetRuntimeLocalStorageClaimsRequest;
|
|
150
|
+
response: localStorage.IGetRuntimeLocalStorageClaimsResponse;
|
|
151
|
+
}
|
|
140
152
|
/** Current-peer report, including exact historical outbox recovery after reconnect. */
|
|
141
153
|
export interface IReq_Pallet_Controller_ReportRuntimeAssignmentObservation extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Pallet_Controller_ReportRuntimeAssignmentObservation> {
|
|
142
154
|
method: 'reportRuntimeAssignmentObservation';
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -2066,6 +2066,29 @@ answer to the sent claim and, for `accepted` and `replay`, to a state the claim
|
|
|
2066
2066
|
claim is `ready`, `import-required` (an `import` claim only) or `uncertain`, a purge is `purged` or
|
|
2067
2067
|
`uncertain`. A `historical` answer describes the newer generation the node holds.
|
|
2068
2068
|
|
|
2069
|
+
`requests.runtimesession.IReq_Any_Cloudly_GetRuntimeLocalStorageClaims`
|
|
2070
|
+
(`getRuntimeLocalStorageClaims`) lets an administrator read the claims Cloudly issued in one
|
|
2071
|
+
cluster, optionally on one node: `{ identity, clusterId, nodeId?, cursor?, limit? }` →
|
|
2072
|
+
`{ claims, nextCursor? }`. Each entry is an `IRuntimeLocalStorageClaimSummary { claimId,
|
|
2073
|
+
generation, clusterId, nodeId, serviceId, volumeId, mountPath, sourceKind, initialization,
|
|
2074
|
+
lifecycle, state }` of the current generation. `claimId` is the claim's `id`, the name the node
|
|
2075
|
+
keys the volume by and the `import/<claimId>` directory an operator places an `import` volume's
|
|
2076
|
+
bytes in; a reader takes it from here and never derives it, because how a controller composes its
|
|
2077
|
+
claim ids is the controller's own business. `state` is what the node answered about exactly that
|
|
2078
|
+
generation, or `null` until the node acknowledged it, and it obeys the same rule as an apply answer.
|
|
2079
|
+
A summary names the source by kind alone and carries no digest, controller epoch or SMB credential
|
|
2080
|
+
reference.
|
|
2081
|
+
|
|
2082
|
+
The read is paged: `cursor` is the opaque `nextCursor` of the previous page, `limit` is at most
|
|
2083
|
+
`runtimeLocalStorageClaimContract.maximumSummaryPageSize` (200), the page is in strictly ascending
|
|
2084
|
+
`claimId` order, and `nextCursor` is omitted on the final page and never stated on an empty one.
|
|
2085
|
+
`summarizeRuntimeLocalStorageClaim(claim, state)` is the one projection of a claim into a summary,
|
|
2086
|
+
`snapshotRuntimeLocalStorageClaimSummary` and `snapshotGetRuntimeLocalStorageClaimsRequest` /
|
|
2087
|
+
`snapshotGetRuntimeLocalStorageClaimsResponse` check exact schemas, and
|
|
2088
|
+
`bindGetRuntimeLocalStorageClaimsResponse(response, request)` binds a page to the read that asked
|
|
2089
|
+
for it: every summary names the requested cluster and node, and the page holds no more than the
|
|
2090
|
+
requested `limit`.
|
|
2091
|
+
|
|
2069
2092
|
`platform.storagemigration` defines the provider-neutral cutover contract for a
|
|
2070
2093
|
named object-storage binding. Corestore atomically owns and fences the source
|
|
2071
2094
|
binding after validating a distinct, unfenced active-object snapshot. Onebox
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -3,8 +3,10 @@ import type { IRuntimeAssignment, IRuntimeAuthorityReference, IRuntimeController
|
|
|
3
3
|
import { snapshotRuntimeAssignment, validateRuntimeAssignment } from './runtimeassignment.js';
|
|
4
4
|
import type { IRuntimeSessionBinding } from './runtimesession.js';
|
|
5
5
|
import { snapshotRuntimeSessionBinding } from './runtimesession.js';
|
|
6
|
-
import {
|
|
7
|
-
|
|
6
|
+
import type { IIdentityCredential } from './user.js';
|
|
7
|
+
import { captureNetwork, networkController, networkCounter, networkDigest, networkEqual, networkHash, networkId,
|
|
8
|
+
networkList, networkNodeId, networkRecord, networkReference, networkReferenceOf, networkRevision, networkSorted,
|
|
9
|
+
requireNetwork,
|
|
8
10
|
} from '../private/networkcontract.js';
|
|
9
11
|
import { parseCanonicalIpAddress } from '../private/ipaddress.js';
|
|
10
12
|
import { isRuntimeIdentityNumber } from '../private/runtimepolicy.js';
|
|
@@ -161,6 +163,60 @@ export interface IApplyRuntimeLocalStorageClaimResponse {
|
|
|
161
163
|
claim: IRuntimeAuthorityReference;
|
|
162
164
|
}
|
|
163
165
|
|
|
166
|
+
/**
|
|
167
|
+
* What an administrator reads about one local storage claim a controller issued: where the volume
|
|
168
|
+
* is, whose it is, how it starts and what its node last answered.
|
|
169
|
+
*
|
|
170
|
+
* It is a projection of the controller's current generation, never the claim itself: it carries no
|
|
171
|
+
* digest, no controller epoch and no source beyond its kind, so an SMB claim's credential reference
|
|
172
|
+
* is not in it. `claimId` is the claim's `id`, the name the node keys the volume by, including the
|
|
173
|
+
* `import/<claimId>` directory an operator places an `import` volume's bytes in; a reader takes it
|
|
174
|
+
* from here and never derives it.
|
|
175
|
+
*
|
|
176
|
+
* `state` is what the node answered about exactly `generation`, or `null` while the node has not
|
|
177
|
+
* acknowledged that generation. It follows the rule `bindApplyRuntimeLocalStorageClaimResponse`
|
|
178
|
+
* holds an answer to: a bound claim is `ready`, `import-required` (an `import` claim only) or
|
|
179
|
+
* `uncertain`; a purge is `purged` or `uncertain`.
|
|
180
|
+
*/
|
|
181
|
+
export interface IRuntimeLocalStorageClaimSummary {
|
|
182
|
+
claimId: string;
|
|
183
|
+
generation: number;
|
|
184
|
+
clusterId: string;
|
|
185
|
+
nodeId: string;
|
|
186
|
+
serviceId: string;
|
|
187
|
+
volumeId: string;
|
|
188
|
+
mountPath: string;
|
|
189
|
+
sourceKind: TRuntimeLocalStorageSource['kind'];
|
|
190
|
+
initialization: IRuntimeLocalStorageClaim['initialization'];
|
|
191
|
+
lifecycle: TRuntimeLocalStorageLifecycle;
|
|
192
|
+
state: TRuntimeLocalStorageClaimState | null;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* An administrator's read of the local storage claims of one cluster, optionally of one node.
|
|
197
|
+
*
|
|
198
|
+
* Paged: `cursor` is the opaque `nextCursor` of the previous page, and `limit` asks for at most that
|
|
199
|
+
* many summaries, which the controller may lower but never exceed; both absent read the first page
|
|
200
|
+
* at the controller's own size.
|
|
201
|
+
*/
|
|
202
|
+
export interface IGetRuntimeLocalStorageClaimsRequest {
|
|
203
|
+
/** The controller verifies this credential and derives every actor claim itself. */
|
|
204
|
+
identity: IIdentityCredential;
|
|
205
|
+
clusterId: string;
|
|
206
|
+
nodeId?: string;
|
|
207
|
+
cursor?: string;
|
|
208
|
+
limit?: number;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* One page of summaries in strictly ascending `claimId` order. `nextCursor` is omitted on the final
|
|
213
|
+
* page; a page that carries it carries at least one summary.
|
|
214
|
+
*/
|
|
215
|
+
export interface IGetRuntimeLocalStorageClaimsResponse {
|
|
216
|
+
claims: IRuntimeLocalStorageClaimSummary[];
|
|
217
|
+
nextCursor?: string;
|
|
218
|
+
}
|
|
219
|
+
|
|
164
220
|
export const runtimeLocalStorageClaimContract = Object.freeze({
|
|
165
221
|
digestDomain: 'serve.zone/runtime-local-storage-claim',
|
|
166
222
|
error: 'Runtime local storage claim contract rejected.',
|
|
@@ -178,6 +234,11 @@ export const runtimeLocalStorageClaimContract = Object.freeze({
|
|
|
178
234
|
maximumSegmentLength: 255,
|
|
179
235
|
/** The longest SMB share name. */
|
|
180
236
|
maximumShareLength: 80,
|
|
237
|
+
/**
|
|
238
|
+
* The most claim summaries one `getRuntimeLocalStorageClaims` page carries. A page of summaries
|
|
239
|
+
* with every field at its bound stays inside the network contract's one-mebibyte capture.
|
|
240
|
+
*/
|
|
241
|
+
maximumSummaryPageSize: 200,
|
|
181
242
|
} as const);
|
|
182
243
|
|
|
183
244
|
const fail = (): never => { throw new Error(runtimeLocalStorageClaimContract.error); };
|
|
@@ -241,6 +302,14 @@ const shareOf = (valueArg: unknown): string => {
|
|
|
241
302
|
return valueArg;
|
|
242
303
|
};
|
|
243
304
|
|
|
305
|
+
/** The states a node may answer about one generation, whatever the answer's status. */
|
|
306
|
+
const isClaimStateOf = (
|
|
307
|
+
claimArg: Pick<IRuntimeLocalStorageClaim, 'lifecycle' | 'initialization'>, stateArg: TRuntimeLocalStorageClaimState,
|
|
308
|
+
): boolean => claimArg.lifecycle === 'purge'
|
|
309
|
+
? stateArg === 'purged' || stateArg === 'uncertain'
|
|
310
|
+
: stateArg === 'ready' || stateArg === 'uncertain'
|
|
311
|
+
|| (stateArg === 'import-required' && claimArg.initialization === 'import');
|
|
312
|
+
|
|
244
313
|
const literalOf = <TLiteral extends string>(valueArg: unknown, allowedArg: readonly TLiteral[]): TLiteral => {
|
|
245
314
|
requireNetwork((allowedArg as readonly unknown[]).includes(valueArg));
|
|
246
315
|
return valueArg as TLiteral;
|
|
@@ -424,11 +493,107 @@ export const bindApplyRuntimeLocalStorageClaimResponse = (
|
|
|
424
493
|
const response = snapshotApplyRuntimeLocalStorageClaimResponse(valueArg);
|
|
425
494
|
const { claim } = snapshotApplyRuntimeLocalStorageClaimRequest(requestArg);
|
|
426
495
|
requireNetwork(networkEqual(response.claim, getRuntimeLocalStorageClaimReference(claim)));
|
|
427
|
-
if (response.status !== 'historical')
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
496
|
+
if (response.status !== 'historical') requireNetwork(isClaimStateOf(claim, response.state));
|
|
497
|
+
return response;
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
const sourceKinds = ['directory', 'nfs', 'smb'] as const;
|
|
501
|
+
const initializations = ['empty', 'import'] as const;
|
|
502
|
+
const lifecycles = ['bound', 'purge'] as const;
|
|
503
|
+
|
|
504
|
+
/** Detached exact-schema snapshot of one summary, its state judged against its lifecycle. */
|
|
505
|
+
export const snapshotRuntimeLocalStorageClaimSummary = (
|
|
506
|
+
valueArg: unknown,
|
|
507
|
+
): IRuntimeLocalStorageClaimSummary => safe(() => {
|
|
508
|
+
const value = networkRecord(captureNetwork(valueArg), ['claimId', 'generation', 'clusterId', 'nodeId',
|
|
509
|
+
'serviceId', 'volumeId', 'mountPath', 'sourceKind', 'initialization', 'lifecycle', 'state']);
|
|
510
|
+
const summary: IRuntimeLocalStorageClaimSummary = {
|
|
511
|
+
claimId: networkId(value.claimId),
|
|
512
|
+
generation: networkCounter(value.generation),
|
|
513
|
+
clusterId: networkId(value.clusterId),
|
|
514
|
+
nodeId: networkNodeId(value.nodeId),
|
|
515
|
+
serviceId: networkId(value.serviceId),
|
|
516
|
+
volumeId: networkId(value.volumeId),
|
|
517
|
+
mountPath: readMountPath(value.mountPath, 'mountPath'),
|
|
518
|
+
sourceKind: literalOf(value.sourceKind, sourceKinds),
|
|
519
|
+
initialization: literalOf(value.initialization, initializations),
|
|
520
|
+
lifecycle: literalOf(value.lifecycle, lifecycles),
|
|
521
|
+
state: value.state === null ? null : literalOf(value.state, claimStates),
|
|
522
|
+
};
|
|
523
|
+
// A purge always follows a bound generation, and an SMB volume always starts empty.
|
|
524
|
+
requireNetwork((summary.lifecycle === 'bound' || summary.generation > 1)
|
|
525
|
+
&& (summary.sourceKind !== 'smb' || summary.initialization === 'empty')
|
|
526
|
+
&& (summary.state === null || isClaimStateOf(summary, summary.state)));
|
|
527
|
+
return summary;
|
|
528
|
+
});
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* The one projection of a claim and its node's last answer into a summary. `stateArg` is what the
|
|
532
|
+
* node answered about exactly this generation, or `null` while it has not acknowledged it.
|
|
533
|
+
*/
|
|
534
|
+
export const summarizeRuntimeLocalStorageClaim = (
|
|
535
|
+
claimArg: unknown, stateArg: TRuntimeLocalStorageClaimState | null,
|
|
536
|
+
): IRuntimeLocalStorageClaimSummary => {
|
|
537
|
+
const claim = snapshotRuntimeLocalStorageClaim(claimArg);
|
|
538
|
+
return snapshotRuntimeLocalStorageClaimSummary({
|
|
539
|
+
claimId: claim.id,
|
|
540
|
+
generation: claim.generation,
|
|
541
|
+
clusterId: claim.clusterId,
|
|
542
|
+
nodeId: claim.nodeId,
|
|
543
|
+
serviceId: claim.serviceId,
|
|
544
|
+
volumeId: claim.volumeId,
|
|
545
|
+
mountPath: claim.mount.mountPath,
|
|
546
|
+
sourceKind: claim.source.kind,
|
|
547
|
+
initialization: claim.initialization,
|
|
548
|
+
lifecycle: claim.lifecycle,
|
|
549
|
+
state: stateArg,
|
|
550
|
+
});
|
|
551
|
+
};
|
|
552
|
+
|
|
553
|
+
/**
|
|
554
|
+
* Detached exact-schema snapshot of a read request. It checks the identity's shape only: the
|
|
555
|
+
* controller authenticates it.
|
|
556
|
+
*/
|
|
557
|
+
export const snapshotGetRuntimeLocalStorageClaimsRequest = (
|
|
558
|
+
valueArg: unknown,
|
|
559
|
+
): IGetRuntimeLocalStorageClaimsRequest => safe(() => {
|
|
560
|
+
const value = networkRecord(captureNetwork(valueArg), ['identity', 'clusterId'], ['nodeId', 'cursor', 'limit']);
|
|
561
|
+
const identity = networkRecord(value.identity, ['jwt']);
|
|
562
|
+
requireNetwork(typeof identity.jwt === 'string' && identity.jwt.length > 0);
|
|
563
|
+
return {
|
|
564
|
+
identity: { jwt: identity.jwt as string },
|
|
565
|
+
clusterId: networkId(value.clusterId),
|
|
566
|
+
...(Object.hasOwn(value, 'nodeId') ? { nodeId: networkNodeId(value.nodeId) } : {}),
|
|
567
|
+
...(Object.hasOwn(value, 'cursor') ? { cursor: networkId(value.cursor) } : {}),
|
|
568
|
+
...(Object.hasOwn(value, 'limit')
|
|
569
|
+
? { limit: networkCounter(value.limit, runtimeLocalStorageClaimContract.maximumSummaryPageSize) } : {}),
|
|
570
|
+
};
|
|
571
|
+
});
|
|
572
|
+
|
|
573
|
+
/** Detached exact-schema snapshot of one page: bounded, strictly ascending and never empty with a cursor. */
|
|
574
|
+
export const snapshotGetRuntimeLocalStorageClaimsResponse = (
|
|
575
|
+
valueArg: unknown,
|
|
576
|
+
): IGetRuntimeLocalStorageClaimsResponse => safe(() => {
|
|
577
|
+
const value = networkRecord(captureNetwork(valueArg), ['claims'], ['nextCursor']);
|
|
578
|
+
const claims = networkList(value.claims, runtimeLocalStorageClaimContract.maximumSummaryPageSize,
|
|
579
|
+
snapshotRuntimeLocalStorageClaimSummary);
|
|
580
|
+
networkSorted(claims, (claimArg) => claimArg.claimId);
|
|
581
|
+
if (!Object.hasOwn(value, 'nextCursor')) return { claims };
|
|
582
|
+
requireNetwork(claims.length > 0);
|
|
583
|
+
return { claims, nextCursor: networkId(value.nextCursor) };
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
/**
|
|
587
|
+
* Matches a page to the read that asked for it: every summary names the requested cluster and, when
|
|
588
|
+
* the request named one, the requested node, and the page holds no more than the requested `limit`.
|
|
589
|
+
*/
|
|
590
|
+
export const bindGetRuntimeLocalStorageClaimsResponse = (
|
|
591
|
+
valueArg: unknown, requestArg: unknown,
|
|
592
|
+
): IGetRuntimeLocalStorageClaimsResponse => safe(() => {
|
|
593
|
+
const response = snapshotGetRuntimeLocalStorageClaimsResponse(valueArg);
|
|
594
|
+
const request = snapshotGetRuntimeLocalStorageClaimsRequest(requestArg);
|
|
595
|
+
requireNetwork(response.claims.length <= (request.limit ?? runtimeLocalStorageClaimContract.maximumSummaryPageSize)
|
|
596
|
+
&& response.claims.every((claimArg) => claimArg.clusterId === request.clusterId
|
|
597
|
+
&& (request.nodeId === undefined || claimArg.nodeId === request.nodeId)));
|
|
433
598
|
return response;
|
|
434
599
|
});
|
|
@@ -179,6 +179,22 @@ export interface IReq_Controller_Pallet_ApplyRuntimeLocalStorageClaim extends pl
|
|
|
179
179
|
response: localStorage.IApplyRuntimeLocalStorageClaimResponse;
|
|
180
180
|
}
|
|
181
181
|
|
|
182
|
+
/**
|
|
183
|
+
* An administrator reads the local storage claims Cloudly issued in one cluster, optionally on one
|
|
184
|
+
* node, one page at a time: each claim's id, volume, mount path, initialization, lifecycle and what
|
|
185
|
+
* its node last answered. `snapshotGetRuntimeLocalStorageClaimsRequest` and
|
|
186
|
+
* `bindGetRuntimeLocalStorageClaimsResponse` judge both sides; a summary never carries the claim's
|
|
187
|
+
* source beyond its kind, so no credential reference leaves Cloudly through it.
|
|
188
|
+
*/
|
|
189
|
+
export interface IReq_Any_Cloudly_GetRuntimeLocalStorageClaims extends plugins.typedrequestInterfaces.implementsTR<
|
|
190
|
+
plugins.typedrequestInterfaces.ITypedRequest,
|
|
191
|
+
IReq_Any_Cloudly_GetRuntimeLocalStorageClaims
|
|
192
|
+
> {
|
|
193
|
+
method: 'getRuntimeLocalStorageClaims';
|
|
194
|
+
request: localStorage.IGetRuntimeLocalStorageClaimsRequest;
|
|
195
|
+
response: localStorage.IGetRuntimeLocalStorageClaimsResponse;
|
|
196
|
+
}
|
|
197
|
+
|
|
182
198
|
/** Current-peer report, including exact historical outbox recovery after reconnect. */
|
|
183
199
|
export interface IReq_Pallet_Controller_ReportRuntimeAssignmentObservation extends plugins.typedrequestInterfaces.implementsTR<
|
|
184
200
|
plugins.typedrequestInterfaces.ITypedRequest,
|