@serve.zone/interfaces 25.1.1 → 25.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.
- package/changelog.md +10 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/platform/index.d.ts +3 -1
- package/dist_ts/platform/index.js +4 -2
- package/dist_ts/platform/objectstorageretention.d.ts +63 -0
- package/dist_ts/platform/objectstorageretention.js +255 -0
- package/dist_ts/platform/types.d.ts +3 -0
- package/dist_ts/plugins.runtime.d.ts +2 -0
- package/dist_ts/plugins.runtime.js +4 -0
- package/dist_ts/requests/config.d.ts +3 -0
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.d.ts +394 -0
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.golden.d.ts +35 -0
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.golden.js +315 -0
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.js +1378 -0
- package/dist_ts/runtime.corestore.d.ts +204 -0
- package/dist_ts/runtime.corestore.js +620 -0
- package/dist_ts/runtime.d.ts +2 -0
- package/dist_ts/runtime.js +3 -1
- package/package.json +1 -1
- package/readme.md +37 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/platform/index.ts +3 -0
- package/ts/platform/objectstorageretention.ts +372 -0
- package/ts/platform/types.ts +3 -0
- package/ts/plugins.runtime.ts +4 -0
- package/ts/requests/config.ts +3 -0
- package/ts/runtime.cloudlylegacydeploymentsettlement.golden.ts +421 -0
- package/ts/runtime.cloudlylegacydeploymentsettlement.ts +2884 -0
- package/ts/runtime.corestore.ts +909 -0
- package/ts/runtime.ts +2 -0
package/changelog.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-08-10 - 25.2.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- add corestore credentials, retention, and settlement contracts (runtime-platform)
|
|
8
|
+
- Add /runtime Corestore control credential retrieval and credential publication grant/receipt contracts.
|
|
9
|
+
- Add value-free objectstorage retention intents, evidence receipts, canonical digest helpers, and platform binding validators.
|
|
10
|
+
- Add Cloudly legacy deployment settlement codecs, authenticated HMAC framing, golden vectors, and Node contract tests.
|
|
11
|
+
- Extend cluster config DTOs with optional corestoreCredentialPublicationGrants.
|
|
12
|
+
|
|
3
13
|
## 2026-08-09 - 25.1.1
|
|
4
14
|
|
|
5
15
|
### Fixes
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/interfaces',
|
|
6
|
-
version: '25.
|
|
6
|
+
version: '25.2.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=
|
|
@@ -5,13 +5,15 @@ import * as email from './email.js';
|
|
|
5
5
|
import * as letter from './letter.js';
|
|
6
6
|
import * as logging from './logging.js';
|
|
7
7
|
import * as objectstorage from './objectstorage.js';
|
|
8
|
+
import * as objectstorageretention from './objectstorageretention.js';
|
|
8
9
|
import * as pushnotification from './pushnotification.js';
|
|
9
10
|
import * as sip from './sip.js';
|
|
10
11
|
import * as sms from './sms.js';
|
|
11
12
|
import * as storage from './storage.js';
|
|
12
13
|
import * as storagemigration from './storagemigration.js';
|
|
13
14
|
import * as types from './types.js';
|
|
14
|
-
export { ai, backup, database, email, letter, logging, objectstorage, pushnotification, sip, sms, storage, storagemigration, types, };
|
|
15
|
+
export { ai, backup, database, email, letter, logging, objectstorage, objectstorageretention, pushnotification, sip, sms, storage, storagemigration, types, };
|
|
15
16
|
export * from './storage.js';
|
|
17
|
+
export * from './objectstorageretention.js';
|
|
16
18
|
export * from './storagemigration.js';
|
|
17
19
|
export * from './types.js';
|
|
@@ -5,14 +5,16 @@ import * as email from './email.js';
|
|
|
5
5
|
import * as letter from './letter.js';
|
|
6
6
|
import * as logging from './logging.js';
|
|
7
7
|
import * as objectstorage from './objectstorage.js';
|
|
8
|
+
import * as objectstorageretention from './objectstorageretention.js';
|
|
8
9
|
import * as pushnotification from './pushnotification.js';
|
|
9
10
|
import * as sip from './sip.js';
|
|
10
11
|
import * as sms from './sms.js';
|
|
11
12
|
import * as storage from './storage.js';
|
|
12
13
|
import * as storagemigration from './storagemigration.js';
|
|
13
14
|
import * as types from './types.js';
|
|
14
|
-
export { ai, backup, database, email, letter, logging, objectstorage, pushnotification, sip, sms, storage, storagemigration, types, };
|
|
15
|
+
export { ai, backup, database, email, letter, logging, objectstorage, objectstorageretention, pushnotification, sip, sms, storage, storagemigration, types, };
|
|
15
16
|
export * from './storage.js';
|
|
17
|
+
export * from './objectstorageretention.js';
|
|
16
18
|
export * from './storagemigration.js';
|
|
17
19
|
export * from './types.js';
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9wbGF0Zm9ybS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEtBQUssUUFBUSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssYUFBYSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxzQkFBc0IsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxLQUFLLGdCQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRXBDLE9BQU8sRUFDTCxFQUFFLEVBQ0YsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBQ0wsTUFBTSxFQUNOLE9BQU8sRUFDUCxhQUFhLEVBQ2Isc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUNoQixHQUFHLEVBQ0gsR0FBRyxFQUNILE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsS0FBSyxHQUNOLENBQUM7QUFFRixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxZQUFZLENBQUMifQ==
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export declare const objectStorageRetentionLimits: Readonly<{
|
|
2
|
+
maximumPolicyIdLength: 96;
|
|
3
|
+
maximumRetentionDurationSeconds: number;
|
|
4
|
+
}>;
|
|
5
|
+
export interface IObjectStorageRetentionIntentV1 {
|
|
6
|
+
mode: 'compliance';
|
|
7
|
+
policyId: string;
|
|
8
|
+
retentionDurationSeconds: number;
|
|
9
|
+
}
|
|
10
|
+
export interface IObjectStorageRetentionCapabilityEvidenceV1 {
|
|
11
|
+
version: 1;
|
|
12
|
+
supported: true;
|
|
13
|
+
backend: 'standalone' | 'clustered';
|
|
14
|
+
modes: ['compliance'];
|
|
15
|
+
atomicCreateOnly: true;
|
|
16
|
+
retainedMultipartSupported: false;
|
|
17
|
+
}
|
|
18
|
+
export interface IObjectStorageRetentionAuthorityV1 {
|
|
19
|
+
serviceId: string;
|
|
20
|
+
bindingId: string;
|
|
21
|
+
reconciliationGeneration: number;
|
|
22
|
+
bindingRequestDigest: string;
|
|
23
|
+
}
|
|
24
|
+
export interface IObjectStorageRetentionSentinelEvidenceV1 extends IObjectStorageRetentionIntentV1 {
|
|
25
|
+
version: 1;
|
|
26
|
+
createdAt: number;
|
|
27
|
+
retainUntil: number;
|
|
28
|
+
payloadSha256: string;
|
|
29
|
+
metadataSha256: string;
|
|
30
|
+
etag: string;
|
|
31
|
+
}
|
|
32
|
+
export interface IObjectStorageRetentionReceiptV1 extends IObjectStorageRetentionIntentV1 {
|
|
33
|
+
bucketName: string;
|
|
34
|
+
configuredAt: number;
|
|
35
|
+
sentinelKey: string;
|
|
36
|
+
sentinel: IObjectStorageRetentionSentinelEvidenceV1;
|
|
37
|
+
}
|
|
38
|
+
export interface IObjectStorageRetentionEvidenceV1 {
|
|
39
|
+
intent: IObjectStorageRetentionIntentV1;
|
|
40
|
+
intentSha256: string;
|
|
41
|
+
authority: IObjectStorageRetentionAuthorityV1;
|
|
42
|
+
capability: IObjectStorageRetentionCapabilityEvidenceV1;
|
|
43
|
+
receipt: IObjectStorageRetentionReceiptV1;
|
|
44
|
+
verifiedAt: number;
|
|
45
|
+
}
|
|
46
|
+
/** Value-free desired intent with optional exact provider evidence. */
|
|
47
|
+
export interface IObjectStorageRetentionBindingV1 {
|
|
48
|
+
schemaVersion: 1;
|
|
49
|
+
intent: IObjectStorageRetentionIntentV1;
|
|
50
|
+
evidence?: IObjectStorageRetentionEvidenceV1;
|
|
51
|
+
}
|
|
52
|
+
export interface IObjectStorageRetentionEvidenceExpectationV1 extends IObjectStorageRetentionAuthorityV1 {
|
|
53
|
+
intent: IObjectStorageRetentionIntentV1;
|
|
54
|
+
bucketName: string;
|
|
55
|
+
}
|
|
56
|
+
export declare const validateObjectStorageRetentionIntent: (intentArg: unknown, pathArg?: string) => string[];
|
|
57
|
+
export declare const createObjectStorageRetentionRetainUntil: (createdAtArg: number, retentionDurationSecondsArg: number) => number;
|
|
58
|
+
export declare const createObjectStorageRetentionIntentDigestInput: (intentArg: IObjectStorageRetentionIntentV1) => string;
|
|
59
|
+
export declare const computeObjectStorageRetentionIntentSha256: (intentArg: IObjectStorageRetentionIntentV1) => Promise<string>;
|
|
60
|
+
export declare const objectStorageRetentionIntentsEqual: (leftArg: unknown, rightArg: unknown) => boolean;
|
|
61
|
+
export declare const validateObjectStorageRetentionEvidence: (evidenceArg: unknown, expectedArg: IObjectStorageRetentionEvidenceExpectationV1) => Promise<string[]>;
|
|
62
|
+
export declare const validateObjectStorageRetentionBinding: (bindingArg: unknown, expectedArg: IObjectStorageRetentionEvidenceExpectationV1) => Promise<string[]>;
|
|
63
|
+
export declare const validatePlatformBindingObjectStorageRetention: (bindingArg: unknown, expectedArg: IObjectStorageRetentionEvidenceExpectationV1) => Promise<string[]>;
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { createCanonicalJsonSha256Hex } from '../private/canonicaljson.js';
|
|
2
|
+
export const objectStorageRetentionLimits = Object.freeze({
|
|
3
|
+
maximumPolicyIdLength: 96,
|
|
4
|
+
maximumRetentionDurationSeconds: 100 * 366 * 24 * 60 * 60,
|
|
5
|
+
});
|
|
6
|
+
const policyIdPattern = /^[A-Za-z0-9._-]{1,96}$/;
|
|
7
|
+
const identifierPattern = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
|
|
8
|
+
const sha256Pattern = /^[a-f0-9]{64}$/;
|
|
9
|
+
const etagPattern = /^[a-f0-9]{32}$/;
|
|
10
|
+
const sentinelKeyPattern = /^\.smartstorage-retention\/v1\/sentinel-[a-f0-9]{64}\.json$/;
|
|
11
|
+
const isRecord = (valueArg) => (Boolean(valueArg)
|
|
12
|
+
&& typeof valueArg === 'object'
|
|
13
|
+
&& !Array.isArray(valueArg)
|
|
14
|
+
&& (Object.getPrototypeOf(valueArg) === Object.prototype
|
|
15
|
+
|| Object.getPrototypeOf(valueArg) === null));
|
|
16
|
+
const hasExactKeys = (valueArg, keysArg) => {
|
|
17
|
+
const actualKeys = Object.keys(valueArg).sort();
|
|
18
|
+
const expectedKeys = [...keysArg].sort();
|
|
19
|
+
return actualKeys.length === expectedKeys.length
|
|
20
|
+
&& actualKeys.every((keyArg, indexArg) => keyArg === expectedKeys[indexArg]);
|
|
21
|
+
};
|
|
22
|
+
const isPositiveSafeInteger = (valueArg) => (Number.isSafeInteger(valueArg) && valueArg > 0);
|
|
23
|
+
export const validateObjectStorageRetentionIntent = (intentArg, pathArg = 'objectstorage retention intent') => {
|
|
24
|
+
if (!isRecord(intentArg)
|
|
25
|
+
|| !hasExactKeys(intentArg, ['mode', 'policyId', 'retentionDurationSeconds'])) {
|
|
26
|
+
return [`${pathArg} must use its exact schema`];
|
|
27
|
+
}
|
|
28
|
+
const errors = [];
|
|
29
|
+
if (intentArg.mode !== 'compliance'
|
|
30
|
+
|| typeof intentArg.policyId !== 'string'
|
|
31
|
+
|| !policyIdPattern.test(intentArg.policyId)) {
|
|
32
|
+
errors.push(`${pathArg} must identify a canonical compliance policy`);
|
|
33
|
+
}
|
|
34
|
+
if (!isPositiveSafeInteger(intentArg.retentionDurationSeconds)
|
|
35
|
+
|| intentArg.retentionDurationSeconds
|
|
36
|
+
> objectStorageRetentionLimits.maximumRetentionDurationSeconds) {
|
|
37
|
+
errors.push(`${pathArg} duration must be a positive bounded safe integer`);
|
|
38
|
+
}
|
|
39
|
+
return errors;
|
|
40
|
+
};
|
|
41
|
+
export const createObjectStorageRetentionRetainUntil = (createdAtArg, retentionDurationSecondsArg) => {
|
|
42
|
+
if (!isPositiveSafeInteger(createdAtArg)
|
|
43
|
+
|| !isPositiveSafeInteger(retentionDurationSecondsArg)
|
|
44
|
+
|| retentionDurationSecondsArg > objectStorageRetentionLimits.maximumRetentionDurationSeconds) {
|
|
45
|
+
throw new Error('objectstorage retention arithmetic requires positive bounded safe integers');
|
|
46
|
+
}
|
|
47
|
+
const retainUntil = createdAtArg + retentionDurationSecondsArg * 1000;
|
|
48
|
+
if (!Number.isSafeInteger(retainUntil) || retainUntil <= createdAtArg) {
|
|
49
|
+
throw new Error('objectstorage retention retainUntil exceeds safe integer bounds');
|
|
50
|
+
}
|
|
51
|
+
return retainUntil;
|
|
52
|
+
};
|
|
53
|
+
export const createObjectStorageRetentionIntentDigestInput = (intentArg) => {
|
|
54
|
+
const errors = validateObjectStorageRetentionIntent(intentArg);
|
|
55
|
+
if (errors.length > 0)
|
|
56
|
+
throw new Error(errors[0]);
|
|
57
|
+
return JSON.stringify({
|
|
58
|
+
capability: 'objectstorage',
|
|
59
|
+
retention: {
|
|
60
|
+
mode: intentArg.mode,
|
|
61
|
+
policyId: intentArg.policyId,
|
|
62
|
+
retentionDurationSeconds: intentArg.retentionDurationSeconds,
|
|
63
|
+
},
|
|
64
|
+
version: 1,
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
export const computeObjectStorageRetentionIntentSha256 = async (intentArg) => createCanonicalJsonSha256Hex(createObjectStorageRetentionIntentDigestInput(intentArg), (reasonArg) => { throw new Error(reasonArg); });
|
|
68
|
+
export const objectStorageRetentionIntentsEqual = (leftArg, rightArg) => validateObjectStorageRetentionIntent(leftArg).length === 0
|
|
69
|
+
&& validateObjectStorageRetentionIntent(rightArg).length === 0
|
|
70
|
+
&& leftArg.mode
|
|
71
|
+
=== rightArg.mode
|
|
72
|
+
&& leftArg.policyId
|
|
73
|
+
=== rightArg.policyId
|
|
74
|
+
&& leftArg.retentionDurationSeconds
|
|
75
|
+
=== rightArg.retentionDurationSeconds;
|
|
76
|
+
const retentionIntentFieldsEqual = (leftArg, rightArg) => isRecord(leftArg)
|
|
77
|
+
&& isRecord(rightArg)
|
|
78
|
+
&& leftArg.mode === 'compliance'
|
|
79
|
+
&& rightArg.mode === 'compliance'
|
|
80
|
+
&& typeof leftArg.policyId === 'string'
|
|
81
|
+
&& leftArg.policyId === rightArg.policyId
|
|
82
|
+
&& isPositiveSafeInteger(leftArg.retentionDurationSeconds)
|
|
83
|
+
&& leftArg.retentionDurationSeconds === rightArg.retentionDurationSeconds;
|
|
84
|
+
export const validateObjectStorageRetentionEvidence = async (evidenceArg, expectedArg) => {
|
|
85
|
+
if (!isRecord(evidenceArg)
|
|
86
|
+
|| !hasExactKeys(evidenceArg, [
|
|
87
|
+
'intent',
|
|
88
|
+
'intentSha256',
|
|
89
|
+
'authority',
|
|
90
|
+
'capability',
|
|
91
|
+
'receipt',
|
|
92
|
+
'verifiedAt',
|
|
93
|
+
])) {
|
|
94
|
+
return ['objectstorage retention evidence must use its exact schema'];
|
|
95
|
+
}
|
|
96
|
+
const errors = validateObjectStorageRetentionIntent(evidenceArg.intent);
|
|
97
|
+
const intent = evidenceArg.intent;
|
|
98
|
+
if (!retentionIntentFieldsEqual(intent, expectedArg.intent)) {
|
|
99
|
+
errors.push('objectstorage retention evidence intent must equal the expected intent');
|
|
100
|
+
}
|
|
101
|
+
if (typeof evidenceArg.intentSha256 !== 'string'
|
|
102
|
+
|| !sha256Pattern.test(evidenceArg.intentSha256)
|
|
103
|
+
|| errors.length === 0
|
|
104
|
+
&& evidenceArg.intentSha256 !== await computeObjectStorageRetentionIntentSha256(intent)) {
|
|
105
|
+
errors.push('objectstorage retention intent digest must exactly match the intent');
|
|
106
|
+
}
|
|
107
|
+
const authority = evidenceArg.authority;
|
|
108
|
+
if (!isRecord(authority)
|
|
109
|
+
|| !hasExactKeys(authority, [
|
|
110
|
+
'serviceId',
|
|
111
|
+
'bindingId',
|
|
112
|
+
'reconciliationGeneration',
|
|
113
|
+
'bindingRequestDigest',
|
|
114
|
+
])
|
|
115
|
+
|| typeof authority.serviceId !== 'string'
|
|
116
|
+
|| !identifierPattern.test(authority.serviceId)
|
|
117
|
+
|| authority.serviceId !== expectedArg.serviceId
|
|
118
|
+
|| typeof authority.bindingId !== 'string'
|
|
119
|
+
|| !identifierPattern.test(authority.bindingId)
|
|
120
|
+
|| authority.bindingId !== expectedArg.bindingId
|
|
121
|
+
|| !isPositiveSafeInteger(authority.reconciliationGeneration)
|
|
122
|
+
|| authority.reconciliationGeneration !== expectedArg.reconciliationGeneration
|
|
123
|
+
|| typeof authority.bindingRequestDigest !== 'string'
|
|
124
|
+
|| !sha256Pattern.test(authority.bindingRequestDigest)
|
|
125
|
+
|| authority.bindingRequestDigest !== expectedArg.bindingRequestDigest) {
|
|
126
|
+
errors.push('objectstorage retention evidence authority must match the trusted binding fence');
|
|
127
|
+
}
|
|
128
|
+
const capability = evidenceArg.capability;
|
|
129
|
+
if (!isRecord(capability)
|
|
130
|
+
|| !hasExactKeys(capability, [
|
|
131
|
+
'version',
|
|
132
|
+
'supported',
|
|
133
|
+
'backend',
|
|
134
|
+
'modes',
|
|
135
|
+
'atomicCreateOnly',
|
|
136
|
+
'retainedMultipartSupported',
|
|
137
|
+
])
|
|
138
|
+
|| capability.version !== 1
|
|
139
|
+
|| capability.supported !== true
|
|
140
|
+
|| (capability.backend !== 'standalone' && capability.backend !== 'clustered')
|
|
141
|
+
|| !Array.isArray(capability.modes)
|
|
142
|
+
|| capability.modes.length !== 1
|
|
143
|
+
|| capability.modes[0] !== 'compliance'
|
|
144
|
+
|| capability.atomicCreateOnly !== true
|
|
145
|
+
|| capability.retainedMultipartSupported !== false) {
|
|
146
|
+
errors.push('objectstorage retention capability evidence must be exact');
|
|
147
|
+
}
|
|
148
|
+
const receipt = evidenceArg.receipt;
|
|
149
|
+
if (!isRecord(receipt)
|
|
150
|
+
|| !hasExactKeys(receipt, [
|
|
151
|
+
'mode',
|
|
152
|
+
'policyId',
|
|
153
|
+
'retentionDurationSeconds',
|
|
154
|
+
'bucketName',
|
|
155
|
+
'configuredAt',
|
|
156
|
+
'sentinelKey',
|
|
157
|
+
'sentinel',
|
|
158
|
+
])) {
|
|
159
|
+
errors.push('objectstorage retention receipt must use its exact schema');
|
|
160
|
+
return errors;
|
|
161
|
+
}
|
|
162
|
+
if (!retentionIntentFieldsEqual(receipt, intent)) {
|
|
163
|
+
errors.push('objectstorage retention receipt intent must equal its evidence intent');
|
|
164
|
+
}
|
|
165
|
+
if (typeof receipt.bucketName !== 'string'
|
|
166
|
+
|| receipt.bucketName.length === 0
|
|
167
|
+
|| receipt.bucketName.length > 200
|
|
168
|
+
|| receipt.bucketName !== expectedArg.bucketName) {
|
|
169
|
+
errors.push('objectstorage retention receipt bucket must exactly match');
|
|
170
|
+
}
|
|
171
|
+
if (!isPositiveSafeInteger(receipt.configuredAt)
|
|
172
|
+
|| typeof receipt.sentinelKey !== 'string'
|
|
173
|
+
|| !sentinelKeyPattern.test(receipt.sentinelKey)) {
|
|
174
|
+
errors.push('objectstorage retention receipt configuration evidence must be canonical');
|
|
175
|
+
}
|
|
176
|
+
const sentinel = receipt.sentinel;
|
|
177
|
+
if (!isRecord(sentinel)
|
|
178
|
+
|| !hasExactKeys(sentinel, [
|
|
179
|
+
'version',
|
|
180
|
+
'mode',
|
|
181
|
+
'policyId',
|
|
182
|
+
'retentionDurationSeconds',
|
|
183
|
+
'createdAt',
|
|
184
|
+
'retainUntil',
|
|
185
|
+
'payloadSha256',
|
|
186
|
+
'metadataSha256',
|
|
187
|
+
'etag',
|
|
188
|
+
])) {
|
|
189
|
+
errors.push('objectstorage retention sentinel evidence must use its exact schema');
|
|
190
|
+
return errors;
|
|
191
|
+
}
|
|
192
|
+
if (sentinel.version !== 1 || !retentionIntentFieldsEqual(sentinel, intent)) {
|
|
193
|
+
errors.push('objectstorage retention sentinel intent must equal its evidence intent');
|
|
194
|
+
}
|
|
195
|
+
if (!isPositiveSafeInteger(sentinel.createdAt)
|
|
196
|
+
|| !isPositiveSafeInteger(sentinel.retainUntil)
|
|
197
|
+
|| !isPositiveSafeInteger(receipt.configuredAt)
|
|
198
|
+
|| sentinel.createdAt < receipt.configuredAt) {
|
|
199
|
+
errors.push('objectstorage retention timestamps must be positive and ordered');
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
try {
|
|
203
|
+
if (sentinel.retainUntil !== createObjectStorageRetentionRetainUntil(sentinel.createdAt, intent.retentionDurationSeconds)) {
|
|
204
|
+
errors.push('objectstorage retention retainUntil must equal createdAt plus duration');
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
errors.push('objectstorage retention retainUntil arithmetic must be safe');
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (typeof sentinel.payloadSha256 !== 'string' || !sha256Pattern.test(sentinel.payloadSha256)
|
|
212
|
+
|| typeof sentinel.metadataSha256 !== 'string' || !sha256Pattern.test(sentinel.metadataSha256)
|
|
213
|
+
|| typeof sentinel.etag !== 'string' || !etagPattern.test(sentinel.etag)) {
|
|
214
|
+
errors.push('objectstorage retention sentinel digests and ETag must be canonical');
|
|
215
|
+
}
|
|
216
|
+
if (!isPositiveSafeInteger(evidenceArg.verifiedAt)
|
|
217
|
+
|| !isPositiveSafeInteger(sentinel.createdAt)
|
|
218
|
+
|| evidenceArg.verifiedAt < sentinel.createdAt) {
|
|
219
|
+
errors.push('objectstorage retention verification timestamp must follow sentinel creation');
|
|
220
|
+
}
|
|
221
|
+
return errors;
|
|
222
|
+
};
|
|
223
|
+
export const validateObjectStorageRetentionBinding = async (bindingArg, expectedArg) => {
|
|
224
|
+
if (!isRecord(bindingArg)
|
|
225
|
+
|| !Object.hasOwn(bindingArg, 'schemaVersion')
|
|
226
|
+
|| !Object.hasOwn(bindingArg, 'intent')
|
|
227
|
+
|| Object.keys(bindingArg).some((keyArg) => !['schemaVersion', 'intent', 'evidence'].includes(keyArg))) {
|
|
228
|
+
return ['objectstorage retention binding must use its exact schema'];
|
|
229
|
+
}
|
|
230
|
+
const errors = bindingArg.schemaVersion === 1
|
|
231
|
+
? validateObjectStorageRetentionIntent(bindingArg.intent)
|
|
232
|
+
: ['objectstorage retention binding schemaVersion must be 1'];
|
|
233
|
+
if (!retentionIntentFieldsEqual(bindingArg.intent, expectedArg.intent)) {
|
|
234
|
+
errors.push('objectstorage retention binding intent must equal the trusted expected intent');
|
|
235
|
+
}
|
|
236
|
+
if (bindingArg.evidence !== undefined) {
|
|
237
|
+
errors.push(...await validateObjectStorageRetentionEvidence(bindingArg.evidence, expectedArg));
|
|
238
|
+
}
|
|
239
|
+
return errors;
|
|
240
|
+
};
|
|
241
|
+
export const validatePlatformBindingObjectStorageRetention = async (bindingArg, expectedArg) => {
|
|
242
|
+
if (!isRecord(bindingArg)) {
|
|
243
|
+
return ['platform objectstorage retention binding must be an object'];
|
|
244
|
+
}
|
|
245
|
+
if (bindingArg.capability !== 'objectstorage'
|
|
246
|
+
|| bindingArg.id !== expectedArg.bindingId
|
|
247
|
+
|| bindingArg.serviceId !== expectedArg.serviceId) {
|
|
248
|
+
return ['platform objectstorage retention must match an objectstorage binding authority'];
|
|
249
|
+
}
|
|
250
|
+
if (bindingArg.objectstorageRetention === undefined) {
|
|
251
|
+
return ['platform objectstorage retention binding must contain retention intent'];
|
|
252
|
+
}
|
|
253
|
+
return validateObjectStorageRetentionBinding(bindingArg.objectstorageRetention, expectedArg);
|
|
254
|
+
};
|
|
255
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0c3RvcmFnZXJldGVudGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3BsYXRmb3JtL29iamVjdHN0b3JhZ2VyZXRlbnRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFM0UsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN4RCxxQkFBcUIsRUFBRSxFQUFFO0lBQ3pCLCtCQUErQixFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0NBQzFELENBQUMsQ0FBQztBQWdFSCxNQUFNLGVBQWUsR0FBRyx3QkFBd0IsQ0FBQztBQUNqRCxNQUFNLGlCQUFpQixHQUFHLHFDQUFxQyxDQUFDO0FBQ2hFLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDO0FBQ3ZDLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDO0FBQ3JDLE1BQU0sa0JBQWtCLEdBQUcsNkRBQTZELENBQUM7QUFFekYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxRQUFpQixFQUF1QyxFQUFFLENBQUMsQ0FDM0UsT0FBTyxDQUFDLFFBQVEsQ0FBQztPQUNkLE9BQU8sUUFBUSxLQUFLLFFBQVE7T0FDNUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztPQUN4QixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVM7V0FDbkQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FDL0MsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLENBQ25CLFFBQWlDLEVBQ2pDLE9BQTBCLEVBQ2pCLEVBQUU7SUFDWCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFD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
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { TSecretManagementScope } from '../data/secret.js';
|
|
2
|
+
import type { IObjectStorageRetentionBindingV1 } from './objectstorageretention.js';
|
|
2
3
|
export type TPlatformCapability = 'email' | 'sms' | 'pushnotification' | 'letter' | 'ai' | 'database' | 'objectstorage' | 'logging' | 'backup' | 'sip';
|
|
3
4
|
export type TPlatformAccessMode = 'rpc' | 'binding' | 'sidecar' | 'internal';
|
|
4
5
|
export type TPlatformBindingStatus = 'requested' | 'provisioning' | 'ready' | 'degraded' | 'failed' | 'disabled';
|
|
@@ -39,6 +40,8 @@ export interface IPlatformBinding {
|
|
|
39
40
|
endpoints?: IPlatformServiceEndpoint[];
|
|
40
41
|
/** Value-free reconciliation scope for service-owned credentials. */
|
|
41
42
|
credentialManagementScope?: Extract<TSecretManagementScope, `platform:${string}`>;
|
|
43
|
+
/** Capability-specific value-free immutable-retention intent and evidence. */
|
|
44
|
+
objectstorageRetention?: IObjectStorageRetentionBindingV1;
|
|
42
45
|
createdAt?: number;
|
|
43
46
|
updatedAt?: number;
|
|
44
47
|
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// node native scope for the Node-only /runtime export
|
|
2
|
+
import * as crypto from 'node:crypto';
|
|
3
|
+
export { crypto };
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcGx1Z2lucy5ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNEQUFzRDtBQUN0RCxPQUFPLEtBQUssTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUV0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMifQ==
|
|
@@ -4,6 +4,7 @@ import * as serverInterfaces from '../data/server.js';
|
|
|
4
4
|
import * as userInterfaces from '../data/user.js';
|
|
5
5
|
import type { IService } from '../data/service.js';
|
|
6
6
|
import type { IPlatformBinding, IPlatformProviderConfig } from '../platform/types.js';
|
|
7
|
+
import type { ICorestoreCredentialPublicationGrantV1 } from '../runtime.corestore.js';
|
|
7
8
|
export interface IRequest_Any_Cloudly_GetServerConfig extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_GetServerConfig> {
|
|
8
9
|
method: 'getServerConfig';
|
|
9
10
|
request: {
|
|
@@ -24,6 +25,7 @@ export interface IRequest_Any_Cloudly_GetClusterConfig extends plugins.typedrequ
|
|
|
24
25
|
services: IService[];
|
|
25
26
|
platformProviderConfigs?: IPlatformProviderConfig[];
|
|
26
27
|
platformBindings?: IPlatformBinding[];
|
|
28
|
+
corestoreCredentialPublicationGrants?: ICorestoreCredentialPublicationGrantV1[];
|
|
27
29
|
};
|
|
28
30
|
}
|
|
29
31
|
export interface IRequest_Cloudly_Coreflow_PushClusterConfig extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Cloudly_Coreflow_PushClusterConfig> {
|
|
@@ -33,6 +35,7 @@ export interface IRequest_Cloudly_Coreflow_PushClusterConfig extends plugins.typ
|
|
|
33
35
|
services: IService[];
|
|
34
36
|
platformProviderConfigs?: IPlatformProviderConfig[];
|
|
35
37
|
platformBindings?: IPlatformBinding[];
|
|
38
|
+
corestoreCredentialPublicationGrants?: ICorestoreCredentialPublicationGrantV1[];
|
|
36
39
|
};
|
|
37
40
|
response: {};
|
|
38
41
|
}
|