@serve.zone/interfaces 21.1.0 → 23.0.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 +23 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/appstore/types.d.ts +31 -16
- package/dist_ts/appstore/types.js +208 -11
- package/dist_ts/data/coremail.d.ts +83 -9
- package/dist_ts/data/coremail.js +67 -1
- package/dist_ts/data/coremail.runtime.d.ts +27 -1
- package/dist_ts/data/coremail.runtime.js +800 -36
- package/dist_ts/data/deploymentoperation.js +6 -20
- package/dist_ts/data/deploymentpreflight.d.ts +2 -6
- package/dist_ts/data/deploymentpreflight.js +1 -1
- package/dist_ts/data/hostedapp.d.ts +40 -14
- package/dist_ts/data/hostedapp.js +90 -1
- package/dist_ts/data/immutableimage.d.ts +30 -1
- package/dist_ts/data/immutableimage.js +103 -1
- package/dist_ts/data/index.d.ts +0 -2
- package/dist_ts/data/index.js +1 -3
- package/dist_ts/data/secret.d.ts +186 -13
- package/dist_ts/data/secret.js +543 -45
- package/dist_ts/data/service.d.ts +0 -39
- package/dist_ts/data/service.js +1 -77
- package/dist_ts/data/settings.d.ts +62 -43
- package/dist_ts/data/settings.js +34 -2
- package/dist_ts/platform/storage.d.ts +13 -14
- package/dist_ts/platform/storage.js +1 -1
- package/dist_ts/platform/storagemigration.d.ts +8 -8
- package/dist_ts/platform/storagemigration.golden.d.ts +2 -2
- package/dist_ts/platform/storagemigration.golden.js +19 -88
- package/dist_ts/platform/storagemigration.js +46 -58
- package/dist_ts/platform/types.d.ts +5 -19
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/dist_ts/requests/coremail.d.ts +12 -5
- package/dist_ts/requests/hostedapp.d.ts +12 -9
- package/dist_ts/requests/hostedapp.js +38 -1
- package/dist_ts/requests/index.d.ts +1 -3
- package/dist_ts/requests/index.js +2 -4
- package/dist_ts/requests/platform.d.ts +0 -1
- package/dist_ts/requests/secret.d.ts +23 -17
- package/dist_ts/requests/secret.js +161 -2
- package/dist_ts/requests/service.d.ts +0 -13
- package/dist_ts/requests/settings.d.ts +3 -3
- package/dist_ts/runtime.d.ts +78 -26
- package/dist_ts/runtime.js +219 -19
- package/package.json +2 -1
- package/readme.md +163 -38
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/appstore/types.ts +251 -25
- package/ts/data/coremail.runtime.ts +1212 -38
- package/ts/data/coremail.ts +120 -8
- package/ts/data/deploymentoperation.ts +7 -31
- package/ts/data/deploymentpreflight.ts +2 -5
- package/ts/data/hostedapp.ts +144 -18
- package/ts/data/immutableimage.ts +150 -1
- package/ts/data/index.ts +0 -2
- package/ts/data/secret.ts +775 -53
- package/ts/data/service.ts +0 -118
- package/ts/data/settings.ts +70 -80
- package/ts/platform/storage.ts +15 -16
- package/ts/platform/storagemigration.golden.ts +18 -95
- package/ts/platform/storagemigration.ts +57 -87
- package/ts/platform/types.ts +6 -19
- package/ts/plugins.ts +2 -0
- package/ts/requests/coremail.ts +13 -4
- package/ts/requests/hostedapp.ts +50 -9
- package/ts/requests/index.ts +0 -4
- package/ts/requests/platform.ts +0 -1
- package/ts/requests/secret.ts +204 -9
- package/ts/requests/service.ts +0 -16
- package/ts/requests/settings.ts +3 -3
- package/ts/runtime.ts +314 -41
- package/dist_ts/data/secretbundle.d.ts +0 -57
- package/dist_ts/data/secretbundle.js +0 -2
- package/dist_ts/data/secretgroup.d.ts +0 -52
- package/dist_ts/data/secretgroup.js +0 -2
- package/dist_ts/requests/secretbundle.d.ts +0 -75
- package/dist_ts/requests/secretbundle.js +0 -4
- package/dist_ts/requests/secretgroup.d.ts +0 -52
- package/dist_ts/requests/secretgroup.js +0 -4
- package/ts/data/secretbundle.ts +0 -65
- package/ts/data/secretgroup.ts +0 -58
- package/ts/requests/secretbundle.ts +0 -103
- package/ts/requests/secretgroup.ts +0 -74
package/changelog.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-07-30 - 23.0.0
|
|
4
|
+
|
|
5
|
+
### Breaking Changes
|
|
6
|
+
|
|
7
|
+
- replace grouped/plaintext secret delivery with the sealed v23 contract (secrets)
|
|
8
|
+
- Remove SecretGroup and SecretBundle data/request exports, bundled service and preflight fields, flattening RPCs, compatibility validators, and aggregate runtime-file design.
|
|
9
|
+
- Require context-bound X25519 ingress envelopes, schema-v2 immutable manifests, request-and-scope-bound sealed runtime verification, active-recipient issuance, and two-step Coreflow recipient enrollment.
|
|
10
|
+
- Add stable Docker resource names, WorkloadInit map/wrapper contracts, immutable per-platform container invocation evidence, and required Coreflow capabilities.
|
|
11
|
+
- Split App Store public and secret inputs, remove serialized platform/settings/storage credentials, and require JWT-derived hosted-app machine identity with value-free revision-fenced bootstrap actions.
|
|
12
|
+
- Bump storage migration normalization and golden vectors to schema 2 with service-owned credential management scopes.
|
|
13
|
+
- This pre-cutover release does not complete or claim clean-v2 backup verification, historical erasure, or destructive cleanup; those remain separately gated.
|
|
14
|
+
|
|
15
|
+
## 2026-07-30 - 22.0.0
|
|
16
|
+
|
|
17
|
+
### Breaking Changes
|
|
18
|
+
|
|
19
|
+
- define the complete CoreMail v22 authority and lifecycle contract (coremail)
|
|
20
|
+
- Add draining bindings, composite credential-session reporting, rotating cursor-key references, authenticated workload transfer origins, and schema-v2 canonical desired state.
|
|
21
|
+
- Replace caller-constructed inbound delivery pagination with opaque cursors bounded by item and serialized-byte budgets, and require finite authoritative per-binding quotas.
|
|
22
|
+
- Define fixed 30-day terminal retention, non-expiring pending inbound delivery, strict terminal status fields, and canonical one-time HTTP transfer grants.
|
|
23
|
+
- Export strict runtime normalizers for messages, envelopes, transfers, submissions, gateway status, inbound delivery pages, and reconciliation status.
|
|
24
|
+
- Publish exact active/draining workload operation authority and require canonical 256-bit, fixed-lifetime transfer capabilities.
|
|
25
|
+
|
|
3
26
|
## 2026-07-29 - 21.1.0
|
|
4
27
|
|
|
5
28
|
### Features
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/interfaces',
|
|
6
|
-
version: '
|
|
6
|
+
version: '23.0.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=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type TSecretDelivery, type TSecretGeneratedEncoding, type TSecretIngressRecipient, type TSecretValueInput } from '../data/secret.js';
|
|
2
2
|
import { type IHostedAppRoleDefinition } from '../data/hostedapp.js';
|
|
3
3
|
import type { IServiceDomainRoute, IServicePublicPortMapping, IServiceTargetPort } from '../data/serviceports.js';
|
|
4
4
|
import type { IStorageCapacityRequest, IStorageClassRequirement, TFilesystemStorageAccessMode, TObjectStorageAccessMode, TObjectStorageDelivery, TStorageReclaimPolicy, TStorageResourceKind, TStorageSnapshotMode } from '../platform/storage.js';
|
|
@@ -18,10 +18,10 @@ export type TAppStoreSourceType = 'inline' | 'repoManifest' | 'dockerImage';
|
|
|
18
18
|
export type TAppStoreTrackingMode = 'tag' | 'digest';
|
|
19
19
|
export type TAppStoreUpgradeStrategy = 'semver' | 'branch' | 'dockerDigest';
|
|
20
20
|
export declare const appStoreStorageFeatureIds: {
|
|
21
|
-
readonly
|
|
21
|
+
readonly bindingsV2: "storage.bindings.v2";
|
|
22
22
|
readonly filesystemV1: "storage.filesystem.v1";
|
|
23
|
-
readonly
|
|
24
|
-
readonly
|
|
23
|
+
readonly objectStorageV2: "storage.object-storage.v2";
|
|
24
|
+
readonly objectStorageFileV2: "storage.object-storage.file.v2";
|
|
25
25
|
};
|
|
26
26
|
export type TAppStoreStorageFeatureId = typeof appStoreStorageFeatureIds[keyof typeof appStoreStorageFeatureIds];
|
|
27
27
|
export type TAppStoreStoragePurpose = 'runtime' | 'database' | 'registry' | 'backup';
|
|
@@ -95,20 +95,28 @@ export interface IAppStoreResolvedSource {
|
|
|
95
95
|
imageDigest?: string;
|
|
96
96
|
resolvedAt: string;
|
|
97
97
|
}
|
|
98
|
-
|
|
98
|
+
interface IAppStoreEnvironmentDeclarationBase {
|
|
99
99
|
key: string;
|
|
100
|
-
value?: string;
|
|
101
100
|
description: string;
|
|
102
101
|
required?: boolean;
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
102
|
+
}
|
|
103
|
+
export interface IAppStorePublicEnvironmentDeclaration extends IAppStoreEnvironmentDeclarationBase {
|
|
104
|
+
secret?: false;
|
|
105
|
+
/** Public nonsecret default. */
|
|
106
|
+
value?: string;
|
|
107
|
+
delivery?: never;
|
|
108
|
+
generate?: never;
|
|
109
|
+
}
|
|
110
|
+
export interface IAppStoreSecretEnvironmentDeclaration extends IAppStoreEnvironmentDeclarationBase {
|
|
111
|
+
secret: true;
|
|
112
|
+
value?: never;
|
|
113
|
+
delivery: TSecretDelivery;
|
|
106
114
|
generate?: {
|
|
107
|
-
|
|
108
|
-
/** Number of random bytes before hexadecimal encoding. */
|
|
115
|
+
encoding: TSecretGeneratedEncoding;
|
|
109
116
|
bytes: number;
|
|
110
117
|
};
|
|
111
118
|
}
|
|
119
|
+
export type TAppStoreEnvironmentDeclaration = IAppStorePublicEnvironmentDeclaration | IAppStoreSecretEnvironmentDeclaration;
|
|
112
120
|
export interface IAppStoreVolume {
|
|
113
121
|
/** Stable Docker volume name. If omitted, the runtime derives one from service name and mount path. */
|
|
114
122
|
name?: string;
|
|
@@ -193,13 +201,11 @@ export interface IAppStoreVersionConfig {
|
|
|
193
201
|
port?: number;
|
|
194
202
|
/** Exact OCI/Docker argument vector appended after the image entrypoint. */
|
|
195
203
|
containerArgs?: string[];
|
|
196
|
-
/** Secret-bundle keys delivered only through Docker's read-only secret tmpfs. */
|
|
197
|
-
secretFiles?: IServiceSecretFile[];
|
|
198
204
|
targetPorts?: IServiceTargetPort[];
|
|
199
205
|
domains?: IServiceDomainRoute[];
|
|
200
206
|
/** Edge/coretraffic public TCP/UDP exposure, distinct from Docker publishedPorts. */
|
|
201
207
|
publicPortMappings?: IServicePublicPortMapping[];
|
|
202
|
-
envVars?:
|
|
208
|
+
envVars?: TAppStoreEnvironmentDeclaration[];
|
|
203
209
|
/**
|
|
204
210
|
* @deprecated Legacy volume syntax. New templates use storageClasses and
|
|
205
211
|
* storageRequests. Resolver normalization must reject legacy physical driver
|
|
@@ -269,16 +275,24 @@ export interface IServezoneAppStoreManifest {
|
|
|
269
275
|
};
|
|
270
276
|
}
|
|
271
277
|
export interface IAppStoreInstallRequest {
|
|
278
|
+
mutationId: string;
|
|
272
279
|
appId: string;
|
|
273
|
-
version
|
|
280
|
+
version: string;
|
|
281
|
+
serviceId: string;
|
|
274
282
|
serviceName: string;
|
|
275
283
|
domain?: string;
|
|
276
284
|
/** Legacy install-time override for the web target port. */
|
|
277
285
|
port?: number;
|
|
278
286
|
publishedPorts?: IAppStorePublishedPort[];
|
|
279
287
|
publicPortMappings?: IServicePublicPortMapping[];
|
|
280
|
-
|
|
288
|
+
publicEnvironment: Record<string, string>;
|
|
289
|
+
secretInputs: Array<{
|
|
290
|
+
key: string;
|
|
291
|
+
valueInput: TSecretValueInput;
|
|
292
|
+
}>;
|
|
281
293
|
}
|
|
294
|
+
export declare const validateAppStoreEnvironmentDeclarations: (declarationsArg: unknown) => string[];
|
|
295
|
+
export declare const validateAppStoreInstallRequest: (requestArg: unknown, configArg: IAppStoreVersionConfig, activeIngressRecipientArg: TSecretIngressRecipient) => Promise<string[]>;
|
|
282
296
|
export interface IUpgradeableAppStoreService {
|
|
283
297
|
serviceId?: string;
|
|
284
298
|
serviceName: string;
|
|
@@ -287,3 +301,4 @@ export interface IUpgradeableAppStoreService {
|
|
|
287
301
|
latestVersion: string;
|
|
288
302
|
hasMigration: boolean;
|
|
289
303
|
}
|
|
304
|
+
export {};
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { createAppStoreInstallSecretEnvelopeContext, validateSecretDelivery, validateSecretValueInput, validateSecretValueInputForRecipient, } from '../data/secret.js';
|
|
1
2
|
import { validateHostedAppRoleDefinitions, } from '../data/hostedapp.js';
|
|
2
3
|
export const appStoreStorageFeatureIds = {
|
|
3
|
-
|
|
4
|
+
bindingsV2: 'storage.bindings.v2',
|
|
4
5
|
filesystemV1: 'storage.filesystem.v1',
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
objectStorageV2: 'storage.object-storage.v2',
|
|
7
|
+
objectStorageFileV2: 'storage.object-storage.file.v2',
|
|
7
8
|
};
|
|
8
9
|
const appStoreEnvKeyRegex = /^[A-Z_][A-Z0-9_]*$/;
|
|
9
10
|
export const validateAppStorePlatformOidcCapability = (capabilityArg) => {
|
|
@@ -52,7 +53,10 @@ export const validateAppStoreVersionPlatformOidc = (configArg) => {
|
|
|
52
53
|
return ['appstore config must be an object'];
|
|
53
54
|
}
|
|
54
55
|
const config = configArg;
|
|
55
|
-
const errors =
|
|
56
|
+
const errors = [
|
|
57
|
+
...validateAppStorePlatformOidcCapability(config.platformOidc),
|
|
58
|
+
...validateAppStoreEnvironmentDeclarations(config.envVars),
|
|
59
|
+
];
|
|
56
60
|
if (!config.platformOidc || typeof config.platformOidc !== 'object'
|
|
57
61
|
|| Array.isArray(config.platformOidc))
|
|
58
62
|
return errors;
|
|
@@ -67,16 +71,209 @@ export const validateAppStoreVersionPlatformOidc = (configArg) => {
|
|
|
67
71
|
? envArg.key
|
|
68
72
|
: undefined)).filter((valueArg) => typeof valueArg === 'string')
|
|
69
73
|
: [];
|
|
70
|
-
const
|
|
71
|
-
? config.secretFiles.map((fileArg) => (fileArg && typeof fileArg === 'object' && !Array.isArray(fileArg)
|
|
72
|
-
? fileArg.sourceKey
|
|
73
|
-
: undefined)).filter((valueArg) => typeof valueArg === 'string')
|
|
74
|
-
: [];
|
|
75
|
-
for (const key of [...ordinaryEnvKeys, ...secretFileKeys]) {
|
|
74
|
+
for (const key of ordinaryEnvKeys) {
|
|
76
75
|
if (oidcKeys.has(key)) {
|
|
77
76
|
errors.push(`platformOidc environment key '${key}' collides with app runtime input`);
|
|
78
77
|
}
|
|
79
78
|
}
|
|
80
79
|
return errors;
|
|
81
80
|
};
|
|
82
|
-
|
|
81
|
+
const appStoreMutationIdRegex = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
|
|
82
|
+
export const validateAppStoreEnvironmentDeclarations = (declarationsArg) => {
|
|
83
|
+
if (declarationsArg === undefined)
|
|
84
|
+
return [];
|
|
85
|
+
if (!Array.isArray(declarationsArg) || declarationsArg.length > 256) {
|
|
86
|
+
return ['envVars must be a bounded array'];
|
|
87
|
+
}
|
|
88
|
+
const errors = [];
|
|
89
|
+
const keys = [];
|
|
90
|
+
declarationsArg.forEach((declarationArg, indexArg) => {
|
|
91
|
+
if (!declarationArg || typeof declarationArg !== 'object' || Array.isArray(declarationArg)) {
|
|
92
|
+
errors.push(`envVars[${indexArg}] must be an object`);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const declaration = declarationArg;
|
|
96
|
+
const allowedKeys = declaration.secret === true
|
|
97
|
+
? new Set(['key', 'description', 'required', 'secret', 'delivery', 'generate'])
|
|
98
|
+
: new Set(['key', 'description', 'required', 'secret', 'value']);
|
|
99
|
+
if (Object.keys(declaration).some((keyArg) => !allowedKeys.has(keyArg))) {
|
|
100
|
+
errors.push(`envVars[${indexArg}] contains fields outside its exact channel schema`);
|
|
101
|
+
}
|
|
102
|
+
if (typeof declaration.key !== 'string' || !appStoreEnvKeyRegex.test(declaration.key)) {
|
|
103
|
+
errors.push(`envVars[${indexArg}].key must be canonical`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
keys.push(declaration.key);
|
|
107
|
+
}
|
|
108
|
+
if (typeof declaration.description !== 'string' || declaration.description.length > 1000) {
|
|
109
|
+
errors.push(`envVars[${indexArg}].description must be bounded`);
|
|
110
|
+
}
|
|
111
|
+
if (declaration.required !== undefined && typeof declaration.required !== 'boolean') {
|
|
112
|
+
errors.push(`envVars[${indexArg}].required must be boolean`);
|
|
113
|
+
}
|
|
114
|
+
if (declaration.secret === true) {
|
|
115
|
+
if ('value' in declaration)
|
|
116
|
+
errors.push(`envVars[${indexArg}] secret declaration forbids value`);
|
|
117
|
+
if (!('delivery' in declaration)) {
|
|
118
|
+
errors.push(`envVars[${indexArg}] secret declaration requires delivery`);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
errors.push(...validateSecretDelivery(declaration.delivery)
|
|
122
|
+
.map((errorArg) => `envVars[${indexArg}].${errorArg}`));
|
|
123
|
+
}
|
|
124
|
+
if (declaration.generate !== undefined) {
|
|
125
|
+
errors.push(...validateSecretValueInput({
|
|
126
|
+
mode: 'generated',
|
|
127
|
+
...declaration.generate,
|
|
128
|
+
}).map((errorArg) => `envVars[${indexArg}].generate ${errorArg}`));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
if (declaration.secret !== undefined && declaration.secret !== false) {
|
|
133
|
+
errors.push(`envVars[${indexArg}].secret must be true or false`);
|
|
134
|
+
}
|
|
135
|
+
if ('delivery' in declaration)
|
|
136
|
+
errors.push(`envVars[${indexArg}] public declaration forbids delivery`);
|
|
137
|
+
if ('generate' in declaration)
|
|
138
|
+
errors.push(`envVars[${indexArg}] public declaration forbids generate`);
|
|
139
|
+
if (declaration.value !== undefined && typeof declaration.value !== 'string') {
|
|
140
|
+
errors.push(`envVars[${indexArg}].value must be a public string default`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
if (new Set(keys).size !== keys.length)
|
|
145
|
+
errors.push('envVars keys must be unique');
|
|
146
|
+
return errors;
|
|
147
|
+
};
|
|
148
|
+
export const validateAppStoreInstallRequest = async (requestArg, configArg, activeIngressRecipientArg) => {
|
|
149
|
+
if (!requestArg || typeof requestArg !== 'object' || Array.isArray(requestArg)) {
|
|
150
|
+
return ['install request must be an object'];
|
|
151
|
+
}
|
|
152
|
+
const request = requestArg;
|
|
153
|
+
const rawDeclarations = configArg && typeof configArg === 'object'
|
|
154
|
+
? configArg.envVars
|
|
155
|
+
: undefined;
|
|
156
|
+
const errors = validateAppStoreEnvironmentDeclarations(rawDeclarations);
|
|
157
|
+
const allowedRequestKeys = new Set([
|
|
158
|
+
'mutationId',
|
|
159
|
+
'appId',
|
|
160
|
+
'version',
|
|
161
|
+
'serviceId',
|
|
162
|
+
'serviceName',
|
|
163
|
+
'domain',
|
|
164
|
+
'port',
|
|
165
|
+
'publishedPorts',
|
|
166
|
+
'publicPortMappings',
|
|
167
|
+
'publicEnvironment',
|
|
168
|
+
'secretInputs',
|
|
169
|
+
]);
|
|
170
|
+
if (Object.keys(request).some((keyArg) => !allowedRequestKeys.has(keyArg))) {
|
|
171
|
+
errors.push('install request contains fields outside its schema');
|
|
172
|
+
}
|
|
173
|
+
if (typeof request.mutationId !== 'string'
|
|
174
|
+
|| !appStoreMutationIdRegex.test(request.mutationId)) {
|
|
175
|
+
errors.push('install mutationId must be canonical');
|
|
176
|
+
}
|
|
177
|
+
for (const field of ['appId', 'version', 'serviceId', 'serviceName']) {
|
|
178
|
+
if (typeof request[field] !== 'string' || !request[field].trim()) {
|
|
179
|
+
errors.push(`install ${field} must be non-empty`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const publicEnvironment = request.publicEnvironment;
|
|
183
|
+
if (!publicEnvironment || typeof publicEnvironment !== 'object'
|
|
184
|
+
|| Array.isArray(publicEnvironment)
|
|
185
|
+
|| Object.entries(publicEnvironment).some(([keyArg, valueArg]) => (!appStoreEnvKeyRegex.test(keyArg) || typeof valueArg !== 'string'))) {
|
|
186
|
+
errors.push('install publicEnvironment must be a canonical string map');
|
|
187
|
+
}
|
|
188
|
+
const secretInputs = Array.isArray(request.secretInputs) ? request.secretInputs : [];
|
|
189
|
+
if (!Array.isArray(request.secretInputs) || secretInputs.length > 256) {
|
|
190
|
+
errors.push('install secretInputs must be a bounded array');
|
|
191
|
+
}
|
|
192
|
+
const inputKeys = [];
|
|
193
|
+
const inputsByKey = new Map();
|
|
194
|
+
const declarations = Array.isArray(rawDeclarations) && rawDeclarations.length <= 256
|
|
195
|
+
? rawDeclarations.filter((entryArg) => (validateAppStoreEnvironmentDeclarations([entryArg]).length === 0))
|
|
196
|
+
: [];
|
|
197
|
+
const publicDeclarations = new Map(declarations
|
|
198
|
+
.filter((entryArg) => entryArg.secret !== true)
|
|
199
|
+
.map((entryArg) => [entryArg.key, entryArg]));
|
|
200
|
+
const secretDeclarations = new Map(declarations
|
|
201
|
+
.filter((entryArg) => entryArg.secret === true)
|
|
202
|
+
.map((entryArg) => [entryArg.key, entryArg]));
|
|
203
|
+
for (const [indexArg, inputArg] of secretInputs.entries()) {
|
|
204
|
+
if (!inputArg || typeof inputArg !== 'object' || Array.isArray(inputArg)) {
|
|
205
|
+
errors.push(`install secretInputs[${indexArg}] must be an object`);
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
const input = inputArg;
|
|
209
|
+
if (JSON.stringify(Object.keys(input).sort()) !== JSON.stringify(['key', 'valueInput'])) {
|
|
210
|
+
errors.push(`install secretInputs[${indexArg}] must use its exact schema`);
|
|
211
|
+
}
|
|
212
|
+
if (typeof input.key !== 'string' || !appStoreEnvKeyRegex.test(input.key)) {
|
|
213
|
+
errors.push(`install secretInputs[${indexArg}].key must be canonical`);
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
inputKeys.push(input.key);
|
|
217
|
+
inputsByKey.set(input.key, input);
|
|
218
|
+
const declaration = secretDeclarations.get(input.key);
|
|
219
|
+
const canBuildContext = declaration
|
|
220
|
+
&& typeof request.mutationId === 'string'
|
|
221
|
+
&& appStoreMutationIdRegex.test(request.mutationId)
|
|
222
|
+
&& typeof request.appId === 'string'
|
|
223
|
+
&& Boolean(request.appId.trim())
|
|
224
|
+
&& typeof request.version === 'string'
|
|
225
|
+
&& Boolean(request.version.trim())
|
|
226
|
+
&& typeof request.serviceId === 'string'
|
|
227
|
+
&& Boolean(request.serviceId.trim());
|
|
228
|
+
const expectedContext = canBuildContext
|
|
229
|
+
? createAppStoreInstallSecretEnvelopeContext({
|
|
230
|
+
mutationId: request.mutationId,
|
|
231
|
+
appId: request.appId,
|
|
232
|
+
appVersion: request.version,
|
|
233
|
+
serviceId: request.serviceId,
|
|
234
|
+
key: input.key,
|
|
235
|
+
delivery: declaration.delivery,
|
|
236
|
+
generation: declaration.generate,
|
|
237
|
+
})
|
|
238
|
+
: new Uint8Array();
|
|
239
|
+
errors.push(...(await validateSecretValueInputForRecipient(input.valueInput, activeIngressRecipientArg, expectedContext))
|
|
240
|
+
.map((errorArg) => `install secretInputs[${indexArg}].${errorArg}`));
|
|
241
|
+
}
|
|
242
|
+
if (new Set(inputKeys).size !== inputKeys.length) {
|
|
243
|
+
errors.push('install secretInputs keys must be unique');
|
|
244
|
+
}
|
|
245
|
+
for (const key of Object.keys((publicEnvironment || {}))) {
|
|
246
|
+
if (!publicDeclarations.has(key))
|
|
247
|
+
errors.push(`install public key '${key}' is not declared public`);
|
|
248
|
+
if (inputsByKey.has(key))
|
|
249
|
+
errors.push(`install key '${key}' appears in both channels`);
|
|
250
|
+
}
|
|
251
|
+
for (const [key, input] of inputsByKey) {
|
|
252
|
+
const declaration = secretDeclarations.get(key);
|
|
253
|
+
if (!declaration) {
|
|
254
|
+
errors.push(`install secret key '${key}' is not declared secret`);
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
const valueInput = input.valueInput;
|
|
258
|
+
if (valueInput?.mode === 'generated'
|
|
259
|
+
&& (!declaration.generate
|
|
260
|
+
|| declaration.generate.encoding !== valueInput.encoding
|
|
261
|
+
|| declaration.generate.bytes !== valueInput.bytes)) {
|
|
262
|
+
errors.push(`install secret key '${key}' generation does not match its declaration`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
for (const declaration of publicDeclarations.values()) {
|
|
266
|
+
if (declaration.required
|
|
267
|
+
&& declaration.value === undefined
|
|
268
|
+
&& !Object.hasOwn((publicEnvironment || {}), declaration.key)) {
|
|
269
|
+
errors.push(`install required public key '${declaration.key}' is missing`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
for (const declaration of secretDeclarations.values()) {
|
|
273
|
+
if (declaration.required && !declaration.generate && !inputsByKey.has(declaration.key)) {
|
|
274
|
+
errors.push(`install required secret key '${declaration.key}' is missing`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return errors;
|
|
278
|
+
};
|
|
279
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9hcHBzdG9yZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsMENBQTBDLEVBQzFDLHNCQUFzQixFQUN0Qix3QkFBd0IsRUFDeEIsb0NBQW9DLEdBS3JDLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLGdDQUFnQyxHQUVqQyxNQUFNLHNCQUFzQixDQUFDO0FBaUM5QixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRztJQUN2QyxVQUFVLEVBQUUscUJBQXFCO0lBQ2pDLFlBQVksRUFBRSx1QkFBdUI7SUFDckMsZUFBZSxFQUFFLDJCQUEyQjtJQUM1QyxtQkFBbUIsRUFBRSxnQ0FBZ0M7Q0FDN0MsQ0FBQztBQThLWCxNQUFNLG1CQUFtQixHQUFHLG9CQUFvQixDQUFDO0FBRWpELE1BQU0sQ0FBQyxNQUFNLHNDQUFzQyxHQUFHLENBQ3BELGFBQXNCLEVBQ1osRUFBRTtJQUNaLElBQUksYUFBYSxLQUFLLFNBQVM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMzQyxJQUFJLENBQUMsYUFBYSxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDeEYsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELE1BQU0sVUFBVSxHQUFHLGFBQXdDLENBQUM7SUFDNUQsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLElBQUksT0FBTyxVQUFVLENBQUMsWUFBWSxLQUFLLFFBQVE7V0FDMUMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7V0FDeEMsVUFBVSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1dBQ3hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztXQUN4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
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
export type TCoreMailSha256 = `sha256:${string}`;
|
|
10
10
|
export type TCoreMailCapability = 'outbound' | 'inbound';
|
|
11
|
-
export type TCoreMailBindingState = 'active' | 'disabled';
|
|
11
|
+
export type TCoreMailBindingState = 'active' | 'draining' | 'disabled';
|
|
12
12
|
export type TCoreMailCredentialState = 'current' | 'retiring';
|
|
13
13
|
export type TCoreMailCredentialVerifierFormat = 'argon2id-v1';
|
|
14
14
|
export type TCoreMailPartKind = 'text' | 'html' | 'attachment';
|
|
@@ -18,7 +18,8 @@ export type TCoreMailInboundDeliveryState = 'pending' | 'fetching' | 'fetched' |
|
|
|
18
18
|
export type TCoreMailInboundAckOutcome = 'processed' | 'discarded';
|
|
19
19
|
export type TCoreMailRecipientAction = 'accept' | 'reject' | 'defer';
|
|
20
20
|
export type TCoreMailReconciliationState = 'applying' | 'ready' | 'failed';
|
|
21
|
-
export type
|
|
21
|
+
export type TCoreMailWorkloadOperation = 'coreMailPrepareOutboundSubmission' | 'coreMailPrepareOutboundPartUpload' | 'coreMailCompleteOutboundPartUpload' | 'coreMailFinalizeOutboundSubmission' | 'coreMailGetOutboundSubmission' | 'coreMailListInboundDeliveries' | 'coreMailPrepareInboundFetch' | 'coreMailCompleteInboundFetch' | 'coreMailAcknowledgeInboundDelivery';
|
|
22
|
+
export type TCoreMailErrorCode = 'AUTHENTICATION_FAILED' | 'AUTHENTICATION_EXPIRED' | 'AUTHORITY_REVOKED' | 'CAPABILITY_DENIED' | 'NOT_FOUND' | 'INVALID_REQUEST' | 'INVALID_MAILBOX' | 'INVALID_SENDER' | 'INVALID_RECIPIENT' | 'INVALID_HEADER' | 'PAYLOAD_LIMIT_EXCEEDED' | 'QUOTA_EXCEEDED' | 'IDEMPOTENCY_CONFLICT' | 'STATE_CONFLICT' | 'TRANSFER_GRANT_EXPIRED' | 'TRANSFER_GRANT_REPLAYED' | 'TRANSFER_LENGTH_MISMATCH' | 'TRANSFER_DIGEST_MISMATCH' | 'TRANSFER_ENCODING_UNSUPPORTED' | 'OBJECT_INTEGRITY_CONFLICT' | 'DELIVERY_NOT_FETCHED' | 'DELIVERY_DEFERRED' | 'DELIVERY_FAILED' | 'DELIVERY_DEAD_LETTERED' | 'GATEWAY_UNAVAILABLE' | 'RECONCILIATION_FENCE_MISMATCH';
|
|
22
23
|
export interface ICoreMailErrorData {
|
|
23
24
|
code: TCoreMailErrorCode;
|
|
24
25
|
retryable: boolean;
|
|
@@ -69,6 +70,7 @@ export interface ICoreMailTransferGrant {
|
|
|
69
70
|
sha256: TCoreMailSha256;
|
|
70
71
|
lengthBytes: number;
|
|
71
72
|
contentType: string;
|
|
73
|
+
issuedAt: number;
|
|
72
74
|
expiresAt: number;
|
|
73
75
|
}
|
|
74
76
|
export interface ICoreMailUploadGrant extends ICoreMailTransferGrant {
|
|
@@ -92,8 +94,10 @@ export interface ICoreMailSubmission {
|
|
|
92
94
|
transportMessageId?: string;
|
|
93
95
|
attempts: number;
|
|
94
96
|
nextAttemptAt?: number;
|
|
97
|
+
error?: ICoreMailErrorData;
|
|
95
98
|
acceptedAt?: number;
|
|
96
99
|
deliveredAt?: number;
|
|
100
|
+
terminalAt?: number;
|
|
97
101
|
createdAt: number;
|
|
98
102
|
updatedAt: number;
|
|
99
103
|
}
|
|
@@ -111,6 +115,12 @@ export interface ICoreMailInboundDelivery {
|
|
|
111
115
|
subject?: string;
|
|
112
116
|
receivedAt: number;
|
|
113
117
|
updatedAt: number;
|
|
118
|
+
acknowledgedAt?: number;
|
|
119
|
+
acknowledgedOutcome?: TCoreMailInboundAckOutcome;
|
|
120
|
+
}
|
|
121
|
+
export interface ICoreMailInboundDeliveryPage {
|
|
122
|
+
deliveries: ICoreMailInboundDelivery[];
|
|
123
|
+
nextCursor?: string;
|
|
114
124
|
}
|
|
115
125
|
export interface ICoreMailBindingCredentialVerifier {
|
|
116
126
|
credentialId: string;
|
|
@@ -123,7 +133,7 @@ export interface ICoreMailBindingCredentialVerifier {
|
|
|
123
133
|
acceptUntil?: number;
|
|
124
134
|
}
|
|
125
135
|
export interface ICoreMailBindingDesiredState {
|
|
126
|
-
schemaVersion:
|
|
136
|
+
schemaVersion: 2;
|
|
127
137
|
bindingId: string;
|
|
128
138
|
serviceId: string;
|
|
129
139
|
tenantId: string;
|
|
@@ -134,14 +144,16 @@ export interface ICoreMailBindingDesiredState {
|
|
|
134
144
|
allowedSenders: string[];
|
|
135
145
|
inboundRecipients: string[];
|
|
136
146
|
defaultSender?: string;
|
|
137
|
-
limits
|
|
138
|
-
messagesPerMinute
|
|
139
|
-
messagesPerDay
|
|
140
|
-
maxPendingInbound
|
|
147
|
+
limits: {
|
|
148
|
+
messagesPerMinute: number;
|
|
149
|
+
messagesPerDay: number;
|
|
150
|
+
maxPendingInbound: number;
|
|
141
151
|
};
|
|
142
152
|
}
|
|
143
153
|
export interface ICoreMailGatewayDesiredState {
|
|
144
154
|
endpointUrl: string;
|
|
155
|
+
/** Canonical CoreMail HTTPS origin authorized for path-only transfer grants. */
|
|
156
|
+
coreMailTransferOrigin: string;
|
|
145
157
|
credentialId: string;
|
|
146
158
|
credentialVersion: number;
|
|
147
159
|
/** Key in CoreMail's resolved runtime secret material, never a plaintext value. */
|
|
@@ -167,11 +179,20 @@ export interface ICoreMailGatewayPeerDesiredState {
|
|
|
167
179
|
transferOrigin: string;
|
|
168
180
|
credentials: ICoreMailBindingCredentialVerifier[];
|
|
169
181
|
}
|
|
182
|
+
export interface ICoreMailRuntimeKeyReference {
|
|
183
|
+
keyId: string;
|
|
184
|
+
version: number;
|
|
185
|
+
state: TCoreMailCredentialState;
|
|
186
|
+
/** Key in CoreMail's resolved runtime secret material, never a plaintext value. */
|
|
187
|
+
secretKey: string;
|
|
188
|
+
acceptUntil?: number;
|
|
189
|
+
}
|
|
170
190
|
export interface ICoreMailDesiredState {
|
|
171
|
-
schemaVersion:
|
|
191
|
+
schemaVersion: 2;
|
|
172
192
|
configEpoch: number;
|
|
173
193
|
bindings: ICoreMailBindingDesiredState[];
|
|
174
194
|
gateway: ICoreMailGatewayDesiredState;
|
|
195
|
+
cursorKeys: ICoreMailRuntimeKeyReference[];
|
|
175
196
|
}
|
|
176
197
|
export interface ICoreMailReplicaIdentity {
|
|
177
198
|
taskId: string;
|
|
@@ -184,7 +205,9 @@ export interface ICoreMailBindingReconciliationStatus {
|
|
|
184
205
|
bindingId: string;
|
|
185
206
|
revision: number;
|
|
186
207
|
state: TCoreMailBindingState;
|
|
187
|
-
|
|
208
|
+
pendingInboundCount: number;
|
|
209
|
+
activeSessionsByCredential: Array<{
|
|
210
|
+
credentialId: string;
|
|
188
211
|
version: number;
|
|
189
212
|
count: number;
|
|
190
213
|
}>;
|
|
@@ -219,7 +242,10 @@ export interface ICoreMailGatewayOutboundStatus {
|
|
|
219
242
|
state: Extract<TCoreMailSubmissionState, 'accepted' | 'queued' | 'delivering' | 'delivered' | 'deferred' | 'failed' | 'deadLettered'>;
|
|
220
243
|
attempts: number;
|
|
221
244
|
nextAttemptAt?: number;
|
|
245
|
+
error?: ICoreMailErrorData;
|
|
222
246
|
smtpCode?: number;
|
|
247
|
+
deliveredAt?: number;
|
|
248
|
+
terminalAt?: number;
|
|
223
249
|
updatedAt: number;
|
|
224
250
|
}
|
|
225
251
|
export declare const coreMailLimits: Readonly<{
|
|
@@ -232,11 +258,59 @@ export declare const coreMailLimits: Readonly<{
|
|
|
232
258
|
readonly aggregateAttachmentBytes: number;
|
|
233
259
|
readonly mimeFramingBytes: number;
|
|
234
260
|
readonly serializedMimeBytes: number;
|
|
261
|
+
readonly recipientCount: 100;
|
|
262
|
+
readonly inboundPageSize: 100;
|
|
263
|
+
readonly inboundPageBytes: number;
|
|
264
|
+
readonly cursorBytes: 1024;
|
|
265
|
+
readonly cursorMinimumDecodedBytes: 32;
|
|
266
|
+
readonly routingHandleTtlMs: number;
|
|
235
267
|
readonly transferGrantTtlMs: number;
|
|
236
268
|
readonly transferHeaderTimeoutMs: number;
|
|
237
269
|
readonly transferIdleTimeoutMs: number;
|
|
238
270
|
readonly transferOverallTimeoutMs: number;
|
|
239
271
|
}>;
|
|
272
|
+
export declare const coreMailTransferTokenPolicy: Readonly<{
|
|
273
|
+
format: "base64url-256";
|
|
274
|
+
decodedBytes: 32;
|
|
275
|
+
encodedCharacters: 43;
|
|
276
|
+
}>;
|
|
277
|
+
export declare const coreMailWorkloadOperationPolicy: Readonly<{
|
|
278
|
+
active: Readonly<{
|
|
279
|
+
outbound: readonly ("coreMailPrepareOutboundSubmission" | "coreMailPrepareOutboundPartUpload" | "coreMailCompleteOutboundPartUpload" | "coreMailFinalizeOutboundSubmission" | "coreMailGetOutboundSubmission")[];
|
|
280
|
+
inbound: readonly ("coreMailListInboundDeliveries" | "coreMailPrepareInboundFetch" | "coreMailCompleteInboundFetch" | "coreMailAcknowledgeInboundDelivery")[];
|
|
281
|
+
}>;
|
|
282
|
+
draining: Readonly<{
|
|
283
|
+
outbound: readonly "coreMailGetOutboundSubmission"[];
|
|
284
|
+
inbound: readonly ("coreMailListInboundDeliveries" | "coreMailPrepareInboundFetch" | "coreMailCompleteInboundFetch" | "coreMailAcknowledgeInboundDelivery")[];
|
|
285
|
+
}>;
|
|
286
|
+
disabled: Readonly<{
|
|
287
|
+
outbound: readonly never[];
|
|
288
|
+
inbound: readonly never[];
|
|
289
|
+
}>;
|
|
290
|
+
}>;
|
|
291
|
+
export declare const coreMailRetentionPolicy: Readonly<{
|
|
292
|
+
terminalOutboundMs: number;
|
|
293
|
+
acknowledgedInboundMs: number;
|
|
294
|
+
idempotencyReceiptMs: number;
|
|
295
|
+
expiredCapabilityMs: number;
|
|
296
|
+
pendingInboundAgePurge: false;
|
|
297
|
+
}>;
|
|
298
|
+
export declare const coreMailQuotaPolicy: Readonly<{
|
|
299
|
+
windows: "fixed-utc-minute-and-day";
|
|
300
|
+
outboundUnit: "first-durable-idempotency-insert";
|
|
301
|
+
outboundReplayConsumesUnit: false;
|
|
302
|
+
pendingInboundStates: readonly ["pending", "fetching", "fetched"];
|
|
303
|
+
inboundAcknowledgementReleasesUnit: true;
|
|
304
|
+
}>;
|
|
305
|
+
export declare const coreMailTransferProtocol: Readonly<{
|
|
306
|
+
pathPrefix: "/transfers/";
|
|
307
|
+
authorizationScheme: "Bearer";
|
|
308
|
+
putSuccessStatus: 204;
|
|
309
|
+
getSuccessStatus: 200;
|
|
310
|
+
requireContentLength: true;
|
|
311
|
+
requireContentType: true;
|
|
312
|
+
integritySource: "grant-metadata-and-completion";
|
|
313
|
+
}>;
|
|
240
314
|
export declare const coreMailCredentialVerifierPolicy: Readonly<{
|
|
241
315
|
readonly format: "argon2id-v1";
|
|
242
316
|
readonly version: 19;
|