@serve.zone/interfaces 17.3.0 → 17.5.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 +18 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/appstore/types.d.ts +76 -1
- package/dist_ts/appstore/types.js +7 -2
- package/dist_ts/data/deploymentoperation.js +5 -3
- package/dist_ts/data/deploymentpreflight.d.ts +2 -2
- package/dist_ts/data/gateway.d.ts +9 -0
- package/dist_ts/data/index.d.ts +1 -0
- package/dist_ts/data/index.js +2 -1
- package/dist_ts/data/service.d.ts +2 -0
- package/dist_ts/data/service.js +1 -1
- package/dist_ts/data/webpush.d.ts +106 -0
- package/dist_ts/data/webpush.js +2 -0
- package/dist_ts/platform/index.d.ts +3 -1
- package/dist_ts/platform/index.js +4 -2
- package/dist_ts/platform/pushnotification.d.ts +1 -0
- package/dist_ts/platform/storage.d.ts +185 -0
- package/dist_ts/platform/storage.js +8 -0
- package/dist_ts/platformservice/pushnotification.d.ts +1 -0
- package/dist_ts/requests/index.d.ts +3 -1
- package/dist_ts/requests/index.js +4 -2
- package/dist_ts/requests/webpush.d.ts +132 -0
- package/dist_ts/requests/webpush.js +2 -0
- package/package.json +1 -1
- package/readme.md +112 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/appstore/types.ts +104 -1
- package/ts/data/deploymentoperation.ts +4 -2
- package/ts/data/deploymentpreflight.ts +2 -2
- package/ts/data/gateway.ts +9 -0
- package/ts/data/index.ts +1 -0
- package/ts/data/service.ts +2 -0
- package/ts/data/webpush.ts +133 -0
- package/ts/platform/index.ts +3 -0
- package/ts/platform/pushnotification.ts +1 -0
- package/ts/platform/storage.ts +237 -0
- package/ts/platformservice/pushnotification.ts +1 -0
- package/ts/requests/index.ts +3 -0
- package/ts/requests/webpush.ts +184 -0
package/ts/appstore/types.ts
CHANGED
|
@@ -4,12 +4,103 @@ import type {
|
|
|
4
4
|
IServicePublicPortMapping,
|
|
5
5
|
IServiceTargetPort,
|
|
6
6
|
} from '../data/serviceports.js';
|
|
7
|
+
import type {
|
|
8
|
+
IStorageCapacityRequest,
|
|
9
|
+
IStorageClassRequirement,
|
|
10
|
+
TFilesystemStorageAccessMode,
|
|
11
|
+
TObjectStorageAccessMode,
|
|
12
|
+
TObjectStorageDelivery,
|
|
13
|
+
TStorageReclaimPolicy,
|
|
14
|
+
TStorageResourceKind,
|
|
15
|
+
TStorageSnapshotMode,
|
|
16
|
+
} from '../platform/storage.js';
|
|
7
17
|
|
|
8
18
|
export type TAppStorePlatformRequirement = 'mongodb' | 's3' | 'clickhouse' | 'valkey' | 'mariadb';
|
|
19
|
+
export interface IAppStorePlatformRequirements {
|
|
20
|
+
mongodb?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* @deprecated `s3: true` is normalized to one legacy object-storage binding.
|
|
23
|
+
* New templates use a named objectStorage request.
|
|
24
|
+
*/
|
|
25
|
+
s3?: boolean;
|
|
26
|
+
clickhouse?: boolean;
|
|
27
|
+
valkey?: boolean;
|
|
28
|
+
mariadb?: boolean;
|
|
29
|
+
}
|
|
9
30
|
export type TAppStoreSourceType = 'inline' | 'repoManifest' | 'dockerImage';
|
|
10
31
|
export type TAppStoreTrackingMode = 'tag' | 'digest';
|
|
11
32
|
export type TAppStoreUpgradeStrategy = 'semver' | 'branch' | 'dockerDigest';
|
|
12
33
|
|
|
34
|
+
export const appStoreStorageFeatureIds = {
|
|
35
|
+
bindingsV1: 'storage.bindings.v1',
|
|
36
|
+
filesystemV1: 'storage.filesystem.v1',
|
|
37
|
+
objectStorageV1: 'storage.object-storage.v1',
|
|
38
|
+
objectStorageSecretFileV1: 'storage.object-storage.secret-file.v1',
|
|
39
|
+
} as const;
|
|
40
|
+
|
|
41
|
+
export type TAppStoreStorageFeatureId =
|
|
42
|
+
typeof appStoreStorageFeatureIds[keyof typeof appStoreStorageFeatureIds];
|
|
43
|
+
|
|
44
|
+
export type TAppStoreStoragePurpose =
|
|
45
|
+
| 'runtime'
|
|
46
|
+
| 'database'
|
|
47
|
+
| 'registry'
|
|
48
|
+
| 'backup';
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* A template-local logical class. It states portable policy requirements and
|
|
52
|
+
* preferences; fulfillment adapters select their own compatible policy class.
|
|
53
|
+
*/
|
|
54
|
+
export interface IAppStoreStorageClass {
|
|
55
|
+
kind: TStorageResourceKind;
|
|
56
|
+
purpose: TAppStoreStoragePurpose;
|
|
57
|
+
required?: IStorageClassRequirement;
|
|
58
|
+
preferred?: IStorageClassRequirement;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface IAppStoreStorageRequestBase {
|
|
62
|
+
/** Stable identity used across upgrades, migrations, and restores. */
|
|
63
|
+
id: string;
|
|
64
|
+
kind: TStorageResourceKind;
|
|
65
|
+
/** Key in the containing version config's storageClasses record. */
|
|
66
|
+
storageClass: string;
|
|
67
|
+
capacity?: IStorageCapacityRequest;
|
|
68
|
+
reclaimPolicy: TStorageReclaimPolicy;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface IAppStoreFilesystemProtection {
|
|
72
|
+
backup?: 'required';
|
|
73
|
+
snapshots?: Exclude<TStorageSnapshotMode, 'none'>;
|
|
74
|
+
consistency?: 'crashConsistent' | 'applicationConsistent';
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface IAppStoreFilesystemStorageRequest
|
|
78
|
+
extends IAppStoreStorageRequestBase {
|
|
79
|
+
kind: 'filesystem';
|
|
80
|
+
mountPath: string;
|
|
81
|
+
accessMode: TFilesystemStorageAccessMode;
|
|
82
|
+
protection?: IAppStoreFilesystemProtection;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export interface IAppStoreObjectStorageProtection {
|
|
86
|
+
backup?: 'required';
|
|
87
|
+
versioning?: 'required';
|
|
88
|
+
/** Minimum provider-enforced retention duration. */
|
|
89
|
+
retentionDays?: number;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export interface IAppStoreObjectStorageRequest
|
|
93
|
+
extends IAppStoreStorageRequestBase {
|
|
94
|
+
kind: 'objectStorage';
|
|
95
|
+
accessMode: TObjectStorageAccessMode;
|
|
96
|
+
delivery: TObjectStorageDelivery;
|
|
97
|
+
protection?: IAppStoreObjectStorageProtection;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export type TAppStoreStorageRequest =
|
|
101
|
+
| IAppStoreFilesystemStorageRequest
|
|
102
|
+
| IAppStoreObjectStorageRequest;
|
|
103
|
+
|
|
13
104
|
export interface IAppStoreInlineSource {
|
|
14
105
|
type: 'inline';
|
|
15
106
|
}
|
|
@@ -140,9 +231,21 @@ export interface IAppStoreVersionConfig {
|
|
|
140
231
|
/** Edge/coretraffic public TCP/UDP exposure, distinct from Docker publishedPorts. */
|
|
141
232
|
publicPortMappings?: IServicePublicPortMapping[];
|
|
142
233
|
envVars?: IAppStoreEnvVar[];
|
|
234
|
+
/**
|
|
235
|
+
* @deprecated Legacy volume syntax. New templates use storageClasses and
|
|
236
|
+
* storageRequests. Resolver normalization must reject legacy physical driver
|
|
237
|
+
* options that cannot be represented portably.
|
|
238
|
+
*/
|
|
143
239
|
volumes?: TAppStoreVolumeSpec[];
|
|
240
|
+
/**
|
|
241
|
+
* Template-local logical policy classes. Keys are stable within the
|
|
242
|
+
* template; they are not Onebox or Cloudly operator class names.
|
|
243
|
+
*/
|
|
244
|
+
storageClasses?: Record<string, IAppStoreStorageClass>;
|
|
245
|
+
/** Stable named filesystem and managed object-storage requests. */
|
|
246
|
+
storageRequests?: TAppStoreStorageRequest[];
|
|
144
247
|
publishedPorts?: IAppStorePublishedPort[];
|
|
145
|
-
platformRequirements?:
|
|
248
|
+
platformRequirements?: IAppStorePlatformRequirements;
|
|
146
249
|
minOneboxVersion?: string;
|
|
147
250
|
minCloudlyVersion?: string;
|
|
148
251
|
appStoreVersion?: string;
|
|
@@ -222,9 +222,11 @@ export const validateDeploymentProposedConfiguration = (
|
|
|
222
222
|
errors.push('volumeMounts must be canonical supported declarations');
|
|
223
223
|
}
|
|
224
224
|
if (!Array.isArray(configurationArg.requiredCapabilities)
|
|
225
|
-
|| configurationArg.requiredCapabilities.length >
|
|
225
|
+
|| configurationArg.requiredCapabilities.length > 3
|
|
226
226
|
|| configurationArg.requiredCapabilities.some((capabilityArg) => (
|
|
227
|
-
capabilityArg !== 'database'
|
|
227
|
+
capabilityArg !== 'database'
|
|
228
|
+
&& capabilityArg !== 'objectstorage'
|
|
229
|
+
&& capabilityArg !== 'pushnotification'
|
|
228
230
|
))
|
|
229
231
|
|| new Set(configurationArg.requiredCapabilities).size
|
|
230
232
|
!== configurationArg.requiredCapabilities.length) {
|
|
@@ -98,7 +98,7 @@ export interface IDeploymentPreflightRuntimeTask {
|
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
export interface IDeploymentPreflightPlatformBinding {
|
|
101
|
-
capability: 'database' | 'objectstorage';
|
|
101
|
+
capability: 'database' | 'objectstorage' | 'pushnotification';
|
|
102
102
|
desiredState: 'enabled' | 'disabled';
|
|
103
103
|
status: 'requested' | 'provisioning' | 'ready' | 'degraded' | 'failed' | 'disabled';
|
|
104
104
|
}
|
|
@@ -139,7 +139,7 @@ export interface IDeploymentPreflightProposedConfiguration {
|
|
|
139
139
|
secretFiles?: IServiceSecretFile[];
|
|
140
140
|
containerPorts: number[];
|
|
141
141
|
volumeMounts: IDeploymentPreflightProposedVolumeMount[];
|
|
142
|
-
requiredCapabilities: Array<'database' | 'objectstorage'>;
|
|
142
|
+
requiredCapabilities: Array<'database' | 'objectstorage' | 'pushnotification'>;
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
export interface IDeploymentReleaseEvidenceReference {
|
package/ts/data/gateway.ts
CHANGED
|
@@ -131,6 +131,13 @@ export interface IGatewayCapabilities {
|
|
|
131
131
|
http3: {
|
|
132
132
|
enabled: boolean;
|
|
133
133
|
};
|
|
134
|
+
/** Absent means that this gateway does not advertise Web Push support. */
|
|
135
|
+
webPush?: {
|
|
136
|
+
bindings: boolean;
|
|
137
|
+
delivery: boolean;
|
|
138
|
+
cancellation: boolean;
|
|
139
|
+
vapidRotation: boolean;
|
|
140
|
+
};
|
|
134
141
|
}
|
|
135
142
|
|
|
136
143
|
/**
|
|
@@ -146,6 +153,8 @@ export interface IGatewayTokenCapabilities {
|
|
|
146
153
|
manageMail?: boolean;
|
|
147
154
|
readCertificates?: boolean;
|
|
148
155
|
requestCertificates?: boolean;
|
|
156
|
+
readWebPush?: boolean;
|
|
157
|
+
manageWebPush?: boolean;
|
|
149
158
|
}
|
|
150
159
|
|
|
151
160
|
/**
|
package/ts/data/index.ts
CHANGED
package/ts/data/service.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { IRegistryTarget } from './registry.js';
|
|
|
3
3
|
import type { IAppStorePublishedPort } from '../appstore/index.js';
|
|
4
4
|
import type { IHostedAppLifecycleState } from './hostedapp.js';
|
|
5
5
|
import type { IServiceMailConfig } from './mail.js';
|
|
6
|
+
import type { IServiceWebPushConfig } from './webpush.js';
|
|
6
7
|
import type {
|
|
7
8
|
IImageRolloutStatus,
|
|
8
9
|
IImmutableImageDeploymentPlan,
|
|
@@ -326,6 +327,7 @@ export interface IService {
|
|
|
326
327
|
custom?: { [domain: string]: string };
|
|
327
328
|
};
|
|
328
329
|
mail?: IServiceMailConfig;
|
|
330
|
+
webPush?: IServiceWebPushConfig;
|
|
329
331
|
volumes?: IServiceVolume[];
|
|
330
332
|
publishedPorts?: IAppStorePublishedPort[];
|
|
331
333
|
/** Edge/coretraffic public TCP/UDP exposure, distinct from Docker Swarm publishedPorts. */
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { TGatewayClientType } from './gateway.js';
|
|
2
|
+
|
|
3
|
+
export type TWebPushBindingStatus = 'active' | 'disabled' | 'pending' | 'failed';
|
|
4
|
+
|
|
5
|
+
export type TWebPushCredentialStatus = 'active' | 'disabled' | 'rotated' | 'revoked';
|
|
6
|
+
|
|
7
|
+
export type TWebPushVapidKeyStatus = 'active' | 'retiring' | 'retired';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* `pushServiceAccepted` means that the remote push service accepted the
|
|
11
|
+
* encrypted request. It does not prove browser receipt or display.
|
|
12
|
+
*/
|
|
13
|
+
export type TWebPushDeliveryState =
|
|
14
|
+
| 'accepted'
|
|
15
|
+
| 'queued'
|
|
16
|
+
| 'sending'
|
|
17
|
+
| 'deferred'
|
|
18
|
+
| 'pushServiceAccepted'
|
|
19
|
+
| 'invalidSubscription'
|
|
20
|
+
| 'failed'
|
|
21
|
+
| 'expired'
|
|
22
|
+
| 'cancelled';
|
|
23
|
+
|
|
24
|
+
export type TWebPushUrgency = 'very-low' | 'low' | 'normal' | 'high';
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* `appInstanceId` identifies the environment-specific deployed service
|
|
28
|
+
* instance, not an App Store template or a browser-provided owner.
|
|
29
|
+
*/
|
|
30
|
+
export interface IWebPushResourceOwner {
|
|
31
|
+
gatewayClientType: TGatewayClientType;
|
|
32
|
+
gatewayClientId: string;
|
|
33
|
+
appInstanceId: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** JSON form returned by the browser Push API. */
|
|
37
|
+
export interface IWebPushSubscription {
|
|
38
|
+
endpoint: string;
|
|
39
|
+
expirationTime: number | null;
|
|
40
|
+
keys: {
|
|
41
|
+
p256dh: string;
|
|
42
|
+
auth: string;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface IWebPushCredentialPublic {
|
|
47
|
+
id: string;
|
|
48
|
+
status: TWebPushCredentialStatus;
|
|
49
|
+
createdAt: number;
|
|
50
|
+
updatedAt: number;
|
|
51
|
+
lastRotatedAt?: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface IWebPushCredentialOneTimeSecret {
|
|
55
|
+
credential: IWebPushCredentialPublic;
|
|
56
|
+
secret: string;
|
|
57
|
+
secretShownOnce: true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface IWebPushVapidKeyPublic {
|
|
61
|
+
id: string;
|
|
62
|
+
publicKey: string;
|
|
63
|
+
status: TWebPushVapidKeyStatus;
|
|
64
|
+
createdAt: number;
|
|
65
|
+
activatedAt?: number;
|
|
66
|
+
retireAfter?: number;
|
|
67
|
+
retiredAt?: number;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface IWebPushBinding {
|
|
71
|
+
id: string;
|
|
72
|
+
owner: IWebPushResourceOwner;
|
|
73
|
+
enabled: boolean;
|
|
74
|
+
status: TWebPushBindingStatus;
|
|
75
|
+
credential?: IWebPushCredentialPublic;
|
|
76
|
+
vapidKeys: IWebPushVapidKeyPublic[];
|
|
77
|
+
createdAt: number;
|
|
78
|
+
updatedAt: number;
|
|
79
|
+
createdBy?: string;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Privacy-minimal notification signal. Applications fetch display content
|
|
84
|
+
* from their authenticated API after receiving this event.
|
|
85
|
+
*/
|
|
86
|
+
export interface IWebPushNotificationPayload {
|
|
87
|
+
schemaVersion: 1;
|
|
88
|
+
event: 'notificationAvailable';
|
|
89
|
+
eventId: string;
|
|
90
|
+
/** Same-origin application route beginning with a single slash. */
|
|
91
|
+
route: string;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Public delivery metadata. Subscription and encrypted payload data are absent. */
|
|
95
|
+
export interface IWebPushDeliveryStatus {
|
|
96
|
+
spoolItemId: string;
|
|
97
|
+
state: TWebPushDeliveryState;
|
|
98
|
+
attempts: number;
|
|
99
|
+
acceptedAt: number;
|
|
100
|
+
updatedAt: number;
|
|
101
|
+
nextAttemptAt?: number;
|
|
102
|
+
terminalAt?: number;
|
|
103
|
+
pushServiceStatusCode?: number;
|
|
104
|
+
errorCode?: string;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export interface IWebPushServiceStatus {
|
|
108
|
+
ready: boolean;
|
|
109
|
+
bindingId: string;
|
|
110
|
+
bindingStatus: TWebPushBindingStatus;
|
|
111
|
+
activeVapidKey?: IWebPushVapidKeyPublic;
|
|
112
|
+
retiringVapidKeys: IWebPushVapidKeyPublic[];
|
|
113
|
+
maxPayloadBytes: number;
|
|
114
|
+
maxTtlSeconds: number;
|
|
115
|
+
contentEncoding: 'aes128gcm';
|
|
116
|
+
message?: string;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export type TWebPushCancellationTarget =
|
|
120
|
+
| {
|
|
121
|
+
type: 'spoolItem';
|
|
122
|
+
spoolItemId: string;
|
|
123
|
+
subscriptionId?: never;
|
|
124
|
+
}
|
|
125
|
+
| {
|
|
126
|
+
type: 'subscription';
|
|
127
|
+
subscriptionId: string;
|
|
128
|
+
spoolItemId?: never;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export interface IServiceWebPushConfig {
|
|
132
|
+
enabled?: boolean;
|
|
133
|
+
}
|
package/ts/platform/index.ts
CHANGED
|
@@ -8,6 +8,7 @@ import * as objectstorage from './objectstorage.js';
|
|
|
8
8
|
import * as pushnotification from './pushnotification.js';
|
|
9
9
|
import * as sip from './sip.js';
|
|
10
10
|
import * as sms from './sms.js';
|
|
11
|
+
import * as storage from './storage.js';
|
|
11
12
|
import * as types from './types.js';
|
|
12
13
|
|
|
13
14
|
export {
|
|
@@ -21,7 +22,9 @@ export {
|
|
|
21
22
|
pushnotification,
|
|
22
23
|
sip,
|
|
23
24
|
sms,
|
|
25
|
+
storage,
|
|
24
26
|
types,
|
|
25
27
|
};
|
|
26
28
|
|
|
29
|
+
export * from './storage.js';
|
|
27
30
|
export * from './types.js';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
|
|
3
|
+
/** @deprecated Use the credential-scoped requests.webpush contracts. */
|
|
3
4
|
export interface IReq_SendPushNotification extends plugins.typedrequestInterfaces.implementsTR<
|
|
4
5
|
plugins.typedrequestInterfaces.ITypedRequest,
|
|
5
6
|
IReq_SendPushNotification
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend-neutral storage vocabulary shared by App Store manifests, control
|
|
3
|
+
* planes, and fulfillment adapters. Physical providers and runtime attachment
|
|
4
|
+
* details intentionally do not belong in these contracts.
|
|
5
|
+
*/
|
|
6
|
+
export type TStorageResourceKind = 'filesystem' | 'objectStorage';
|
|
7
|
+
/**
|
|
8
|
+
* Compatibility bridge for the existing generic platform capability. New
|
|
9
|
+
* filesystem requests intentionally have no generic IPlatformBinding mapping.
|
|
10
|
+
*/
|
|
11
|
+
export const storageKindPlatformCapabilityIds = {
|
|
12
|
+
objectStorage: 'objectstorage',
|
|
13
|
+
} as const;
|
|
14
|
+
export type TFilesystemStorageAccessMode =
|
|
15
|
+
| 'ReadWriteOnce'
|
|
16
|
+
| 'ReadOnlyMany'
|
|
17
|
+
| 'ReadWriteMany';
|
|
18
|
+
export type TObjectStorageAccessMode = 'readOnly' | 'readWrite';
|
|
19
|
+
export type TStoragePerformanceTier = 'standard' | 'highIops' | 'capacity';
|
|
20
|
+
export type TStorageDurability = 'ephemeral' | 'persistent';
|
|
21
|
+
export type TStorageTopology = 'singleNode' | 'multiNode';
|
|
22
|
+
export type TStorageSnapshotMode = 'none' | 'portable' | 'native';
|
|
23
|
+
export type TStorageReclaimPolicy = 'retain' | 'delete';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* A positive base-2 quantity written as an integer followed by KiB, MiB, GiB,
|
|
27
|
+
* or TiB, for example `20GiB`. Parsers must reject every other representation.
|
|
28
|
+
*/
|
|
29
|
+
export type TStorageCapacityQuantity = string;
|
|
30
|
+
|
|
31
|
+
export interface IStorageCapacityRequest {
|
|
32
|
+
request: TStorageCapacityQuantity;
|
|
33
|
+
/**
|
|
34
|
+
* A hard upper bound. A request with a limit can only be fulfilled by a
|
|
35
|
+
* class whose granted capabilities include hardQuota.
|
|
36
|
+
*/
|
|
37
|
+
limit?: TStorageCapacityQuantity;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* App-facing requirements describe policy, never a concrete provider class.
|
|
42
|
+
* Values in a `required` block are hard constraints; values in `preferred`
|
|
43
|
+
* influence selection but may not weaken required constraints.
|
|
44
|
+
*/
|
|
45
|
+
export interface IStorageClassRequirement {
|
|
46
|
+
performanceTier?: TStoragePerformanceTier;
|
|
47
|
+
durability?: TStorageDurability;
|
|
48
|
+
topology?: TStorageTopology;
|
|
49
|
+
hardQuota?: true;
|
|
50
|
+
snapshots?: Exclude<TStorageSnapshotMode, 'none'>;
|
|
51
|
+
backup?: true;
|
|
52
|
+
encryptedInTransit?: true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface IStorageGrantedCapabilities {
|
|
56
|
+
performanceTier: TStoragePerformanceTier;
|
|
57
|
+
durability: TStorageDurability;
|
|
58
|
+
topology: TStorageTopology;
|
|
59
|
+
hardQuota: boolean;
|
|
60
|
+
snapshots: TStorageSnapshotMode;
|
|
61
|
+
backup: boolean;
|
|
62
|
+
encryptedInTransit: boolean;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface IStorageClassCapabilitiesBase {
|
|
66
|
+
/** Opaque operator-defined policy class ID, not a physical backend name. */
|
|
67
|
+
classId: string;
|
|
68
|
+
/** Changes whenever matching behavior or guarantees change. */
|
|
69
|
+
revision: string;
|
|
70
|
+
kind: TStorageResourceKind;
|
|
71
|
+
performanceTiers: TStoragePerformanceTier[];
|
|
72
|
+
durabilities: TStorageDurability[];
|
|
73
|
+
topologies: TStorageTopology[];
|
|
74
|
+
hardQuota: boolean;
|
|
75
|
+
snapshotModes: TStorageSnapshotMode[];
|
|
76
|
+
backup: boolean;
|
|
77
|
+
encryptedInTransit: boolean;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export interface IFilesystemStorageClassCapabilities
|
|
81
|
+
extends IStorageClassCapabilitiesBase {
|
|
82
|
+
kind: 'filesystem';
|
|
83
|
+
accessModes: TFilesystemStorageAccessMode[];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface IObjectStorageClassCapabilities
|
|
87
|
+
extends IStorageClassCapabilitiesBase {
|
|
88
|
+
kind: 'objectStorage';
|
|
89
|
+
accessModes: TObjectStorageAccessMode[];
|
|
90
|
+
versioning: boolean;
|
|
91
|
+
retention: boolean;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export type TStorageClassCapabilities =
|
|
95
|
+
| IFilesystemStorageClassCapabilities
|
|
96
|
+
| IObjectStorageClassCapabilities;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Fulfillment adapters advertise only portable guarantees. Provider names,
|
|
100
|
+
* addresses, mount options, principals, and credential values are private.
|
|
101
|
+
*/
|
|
102
|
+
export interface IStorageCapabilityAdvertisement {
|
|
103
|
+
schemaVersion: 1;
|
|
104
|
+
featureIds: string[];
|
|
105
|
+
classes: TStorageClassCapabilities[];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export interface IObjectStorageEnvironmentDelivery {
|
|
109
|
+
type: 'environment';
|
|
110
|
+
/**
|
|
111
|
+
* Explicit target keys prevent two named bindings from silently overwriting
|
|
112
|
+
* each other. Every required field must have a distinct environment key.
|
|
113
|
+
*/
|
|
114
|
+
keys: {
|
|
115
|
+
endpoint: string;
|
|
116
|
+
bucket: string;
|
|
117
|
+
region: string;
|
|
118
|
+
accessKeyId: string;
|
|
119
|
+
secretAccessKey: string;
|
|
120
|
+
sessionToken?: string;
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface IObjectStorageSecretFileDelivery {
|
|
125
|
+
type: 'secretFile';
|
|
126
|
+
/** Canonical absolute path below /run/secrets/. */
|
|
127
|
+
targetPath: string;
|
|
128
|
+
/**
|
|
129
|
+
* JSON object with endpoint, bucket, region, accessKeyId,
|
|
130
|
+
* secretAccessKey, and optional sessionToken fields.
|
|
131
|
+
*/
|
|
132
|
+
format: 'servezone-object-storage-v1';
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export type TObjectStorageDelivery =
|
|
136
|
+
| IObjectStorageEnvironmentDelivery
|
|
137
|
+
| IObjectStorageSecretFileDelivery;
|
|
138
|
+
|
|
139
|
+
export type TResolvedStorageBindingStatus =
|
|
140
|
+
| 'requested'
|
|
141
|
+
| 'provisioning'
|
|
142
|
+
| 'ready'
|
|
143
|
+
| 'degraded'
|
|
144
|
+
| 'failed'
|
|
145
|
+
| 'releasing'
|
|
146
|
+
| 'retained'
|
|
147
|
+
| 'released';
|
|
148
|
+
|
|
149
|
+
export type TStorageBindingFailureCode =
|
|
150
|
+
| 'unsupportedCapability'
|
|
151
|
+
| 'policyUnavailable'
|
|
152
|
+
| 'provisionFailed'
|
|
153
|
+
| 'attachmentFailed'
|
|
154
|
+
| 'quotaExceeded'
|
|
155
|
+
| 'credentialsUnavailable'
|
|
156
|
+
| 'backendUnavailable'
|
|
157
|
+
| 'migrationRequired';
|
|
158
|
+
|
|
159
|
+
export interface IStorageBindingFailure {
|
|
160
|
+
code: TStorageBindingFailureCode;
|
|
161
|
+
message: string;
|
|
162
|
+
retryable: boolean;
|
|
163
|
+
observedAt: number;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export interface IResolvedStoragePolicyRef {
|
|
167
|
+
/** Opaque operator-defined policy class ID selected for this request. */
|
|
168
|
+
classId: string;
|
|
169
|
+
revision: string;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export interface IResolvedStorageCapacity {
|
|
173
|
+
requested?: TStorageCapacityQuantity;
|
|
174
|
+
granted?: TStorageCapacityQuantity;
|
|
175
|
+
limit?: TStorageCapacityQuantity;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export interface IResolvedStorageBindingBase {
|
|
179
|
+
schemaVersion: 1;
|
|
180
|
+
/** Stable binding/allocation identity. */
|
|
181
|
+
id: string;
|
|
182
|
+
serviceId: string;
|
|
183
|
+
/** Stable App Store storageRequests[].id. */
|
|
184
|
+
requestId: string;
|
|
185
|
+
/**
|
|
186
|
+
* Canonical digest of the normalized request. Adapters use it to distinguish
|
|
187
|
+
* an idempotent reconciliation from a migration.
|
|
188
|
+
*/
|
|
189
|
+
requestDigest: string;
|
|
190
|
+
kind: TStorageResourceKind;
|
|
191
|
+
generation: number;
|
|
192
|
+
observedGeneration: number;
|
|
193
|
+
status: TResolvedStorageBindingStatus;
|
|
194
|
+
policy: IResolvedStoragePolicyRef;
|
|
195
|
+
capabilities: IStorageGrantedCapabilities;
|
|
196
|
+
/** Opaque resource identity; never a host path, export, or provider URL. */
|
|
197
|
+
resourceRef: string;
|
|
198
|
+
capacity?: IResolvedStorageCapacity;
|
|
199
|
+
failure?: IStorageBindingFailure;
|
|
200
|
+
createdAt?: number;
|
|
201
|
+
updatedAt?: number;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export interface IResolvedFilesystemStorageBinding
|
|
205
|
+
extends IResolvedStorageBindingBase {
|
|
206
|
+
kind: 'filesystem';
|
|
207
|
+
mountPath: string;
|
|
208
|
+
accessMode: TFilesystemStorageAccessMode;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export interface IStorageObjectCredentialsRef {
|
|
212
|
+
secretBundleId: string;
|
|
213
|
+
accessKeyIdKey: string;
|
|
214
|
+
secretAccessKeyKey: string;
|
|
215
|
+
sessionTokenKey?: string;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export interface IResolvedObjectStorageConnection {
|
|
219
|
+
endpoint: string;
|
|
220
|
+
bucket: string;
|
|
221
|
+
region: string;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export interface IResolvedObjectStorageBinding
|
|
225
|
+
extends IResolvedStorageBindingBase {
|
|
226
|
+
kind: 'objectStorage';
|
|
227
|
+
accessMode: TObjectStorageAccessMode;
|
|
228
|
+
connection: IResolvedObjectStorageConnection;
|
|
229
|
+
credentials: IStorageObjectCredentialsRef;
|
|
230
|
+
delivery: TObjectStorageDelivery;
|
|
231
|
+
versioning: boolean;
|
|
232
|
+
retentionDays?: number;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export type TResolvedStorageBinding =
|
|
236
|
+
| IResolvedFilesystemStorageBinding
|
|
237
|
+
| IResolvedObjectStorageBinding;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
|
|
3
|
+
/** @deprecated Use the credential-scoped requests.webpush contracts. */
|
|
3
4
|
export interface IRequest_SendPushNotification extends plugins.typedrequestInterfaces.implementsTR<
|
|
4
5
|
plugins.typedrequestInterfaces.ITypedRequest,
|
|
5
6
|
IRequest_SendPushNotification
|
package/ts/requests/index.ts
CHANGED
|
@@ -33,6 +33,7 @@ import * as settingsRequests from './settings.js';
|
|
|
33
33
|
import * as statusRequests from './status.js';
|
|
34
34
|
import * as taskRequests from './task.js';
|
|
35
35
|
import * as versionRequests from './version.js';
|
|
36
|
+
import * as webPushRequests from './webpush.js';
|
|
36
37
|
|
|
37
38
|
export {
|
|
38
39
|
adminRequests as admin,
|
|
@@ -68,8 +69,10 @@ export {
|
|
|
68
69
|
statusRequests as status,
|
|
69
70
|
taskRequests as task,
|
|
70
71
|
versionRequests as version,
|
|
72
|
+
webPushRequests as webpush,
|
|
71
73
|
};
|
|
72
74
|
|
|
73
75
|
export * from './inform.js';
|
|
74
76
|
export * from './hostedapp.js';
|
|
75
77
|
export * from './mail.js';
|
|
78
|
+
export * from './webpush.js';
|