@serve.zone/interfaces 32.71.0 → 32.72.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/changelog.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-11-05 - 32.72.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- Restore operation refusal (Linus 2026-11-05 ruling): `data.backupRestoreRefusalNames` adds `restore-operation-unavailable` (`data.IBackupRestoreOperationUnavailableRefusal`, exactly `{ name }`, built by `data.buildBackupRestoreOperationUnavailableRefusal`). Cloudly answers it for every in-place restore while a restore is not yet an operation the node owns (a restore relayed as one request is cut at the transport timeout); it names the missing capability, not a version. `data.validateBackupRestoreRefusal`, `data.isBackupRestoreRefusal`, `data.readBackupRestoreRefusal` and `data.validateBackupRestoreEvent` accept it as the refusal of a `refused` restore event, and it stays in the contract because stored restore events carry it. A reader built before this version refuses it as an unnamed refusal; Cloudly, its only producer, reads its own restore history, so readers of restore events upgrade before Cloudly and Cloudly is not rolled back below a release that stored it. Spec: `test.backuprestorerefusal`.
|
|
8
|
+
|
|
3
9
|
## 2026-11-05 - 32.71.0
|
|
4
10
|
|
|
5
11
|
### Features
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/interfaces',
|
|
6
|
-
version: '32.
|
|
6
|
+
version: '32.72.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=
|
|
@@ -15,13 +15,20 @@ import type { TBackupResourceType } from './backup.js';
|
|
|
15
15
|
* that carries the restore check, so Cloudly does not dispatch the restore; the relay states
|
|
16
16
|
* `relayInterfacesVersion` (`null` when it stated none) and the restore needs
|
|
17
17
|
* `minimumInterfacesVersion`.
|
|
18
|
+
* - `restore-operation-unavailable`: Cloudly refuses every in-place restore because a restore is not
|
|
19
|
+
* yet an operation the node owns: a restore relayed as one request is cut at the transport
|
|
20
|
+
* timeout, so Cloudly cannot learn whether it finished. It names the missing capability, not a
|
|
21
|
+
* version, and stays in this contract permanently because stored restore events carry it.
|
|
22
|
+
* Cloudly is its only producer and reads its own restore history, so it carries this reader
|
|
23
|
+
* itself: readers of restore events upgrade before Cloudly, and Cloudly is not rolled back below
|
|
24
|
+
* a release that stored it.
|
|
18
25
|
*
|
|
19
26
|
* It travels as `TypedResponseError.errorData` of a refused restore and is recorded as the
|
|
20
27
|
* `refusal` of the backup's `refused` restore event (`IBackupRestoreEvent`). Each refusal is
|
|
21
28
|
* exactly its schema: `readBackupRestoreRefusal` refuses any other member, so a producer never adds
|
|
22
29
|
* one without gating it on the reader's interfaces version.
|
|
23
30
|
*/
|
|
24
|
-
export declare const backupRestoreRefusalNames: readonly ["restore-snapshot-unavailable", "restore-preflight-unsupported", "restore-relay-contract-behind"];
|
|
31
|
+
export declare const backupRestoreRefusalNames: readonly ["restore-snapshot-unavailable", "restore-preflight-unsupported", "restore-relay-contract-behind", "restore-operation-unavailable"];
|
|
25
32
|
export type TBackupRestoreRefusalName = typeof backupRestoreRefusalNames[number];
|
|
26
33
|
export declare const backupRestoreRefusalContract: Readonly<{
|
|
27
34
|
/** At most this many snapshots are named in one `restore-snapshot-unavailable`. */
|
|
@@ -52,8 +59,11 @@ export interface IBackupRestoreRelayContractBehindRefusal {
|
|
|
52
59
|
/** The lowest interfaces release a relay must speak to carry a restore. */
|
|
53
60
|
minimumInterfacesVersion: string;
|
|
54
61
|
}
|
|
62
|
+
export interface IBackupRestoreOperationUnavailableRefusal {
|
|
63
|
+
name: 'restore-operation-unavailable';
|
|
64
|
+
}
|
|
55
65
|
/** A refused restore, discriminated by `name` (`backupRestoreRefusalNames`). */
|
|
56
|
-
export type TBackupRestoreRefusal = IBackupRestoreSnapshotUnavailableRefusal | IBackupRestorePreflightUnsupportedRefusal | IBackupRestoreRelayContractBehindRefusal;
|
|
66
|
+
export type TBackupRestoreRefusal = IBackupRestoreSnapshotUnavailableRefusal | IBackupRestorePreflightUnsupportedRefusal | IBackupRestoreRelayContractBehindRefusal | IBackupRestoreOperationUnavailableRefusal;
|
|
57
67
|
/** Validates one restore refusal against its exact schema and names every reason it is refused. */
|
|
58
68
|
export declare const validateBackupRestoreRefusal: (valueArg: unknown, pathArg?: string) => string[];
|
|
59
69
|
/** Whether a value is exactly one restore refusal. */
|
|
@@ -75,6 +85,11 @@ export declare const buildBackupRestorePreflightUnsupportedRefusal: () => IBacku
|
|
|
75
85
|
* passes `null` for a relay whose stated version it cannot read.
|
|
76
86
|
*/
|
|
77
87
|
export declare const buildBackupRestoreRelayContractBehindRefusal: (relayInterfacesVersionArg: string | null, minimumInterfacesVersionArg: string) => IBackupRestoreRelayContractBehindRefusal;
|
|
88
|
+
/**
|
|
89
|
+
* `restore-operation-unavailable`: Cloudly refuses the in-place restore because a restore is not
|
|
90
|
+
* yet a node-owned operation.
|
|
91
|
+
*/
|
|
92
|
+
export declare const buildBackupRestoreOperationUnavailableRefusal: () => IBackupRestoreOperationUnavailableRefusal;
|
|
78
93
|
/**
|
|
79
94
|
* Validates what this contract adds to a restore event of a backup's `restoreHistory` and names
|
|
80
95
|
* every reason it is refused: `status` is `restored`, `failed` or `refused`, and `refusal` is
|
|
@@ -16,6 +16,13 @@ import { compareReleaseVersions, parseReleaseVersion } from './releaseversion.js
|
|
|
16
16
|
* that carries the restore check, so Cloudly does not dispatch the restore; the relay states
|
|
17
17
|
* `relayInterfacesVersion` (`null` when it stated none) and the restore needs
|
|
18
18
|
* `minimumInterfacesVersion`.
|
|
19
|
+
* - `restore-operation-unavailable`: Cloudly refuses every in-place restore because a restore is not
|
|
20
|
+
* yet an operation the node owns: a restore relayed as one request is cut at the transport
|
|
21
|
+
* timeout, so Cloudly cannot learn whether it finished. It names the missing capability, not a
|
|
22
|
+
* version, and stays in this contract permanently because stored restore events carry it.
|
|
23
|
+
* Cloudly is its only producer and reads its own restore history, so it carries this reader
|
|
24
|
+
* itself: readers of restore events upgrade before Cloudly, and Cloudly is not rolled back below
|
|
25
|
+
* a release that stored it.
|
|
19
26
|
*
|
|
20
27
|
* It travels as `TypedResponseError.errorData` of a refused restore and is recorded as the
|
|
21
28
|
* `refusal` of the backup's `refused` restore event (`IBackupRestoreEvent`). Each refusal is
|
|
@@ -26,6 +33,7 @@ export const backupRestoreRefusalNames = Object.freeze([
|
|
|
26
33
|
'restore-snapshot-unavailable',
|
|
27
34
|
'restore-preflight-unsupported',
|
|
28
35
|
'restore-relay-contract-behind',
|
|
36
|
+
'restore-operation-unavailable',
|
|
29
37
|
]);
|
|
30
38
|
export const backupRestoreRefusalContract = Object.freeze({
|
|
31
39
|
/** At most this many snapshots are named in one `restore-snapshot-unavailable`. */
|
|
@@ -108,6 +116,7 @@ const refusalKeys = Object.freeze({
|
|
|
108
116
|
'restore-relay-contract-behind': Object.freeze([
|
|
109
117
|
'name', 'relayInterfacesVersion', 'minimumInterfacesVersion',
|
|
110
118
|
]),
|
|
119
|
+
'restore-operation-unavailable': Object.freeze(['name']),
|
|
111
120
|
});
|
|
112
121
|
/** Validates one restore refusal against its exact schema and names every reason it is refused. */
|
|
113
122
|
export const validateBackupRestoreRefusal = (valueArg, pathArg = 'backup restore refusal') => {
|
|
@@ -126,6 +135,8 @@ export const validateBackupRestoreRefusal = (valueArg, pathArg = 'backup restore
|
|
|
126
135
|
return [];
|
|
127
136
|
case 'restore-relay-contract-behind':
|
|
128
137
|
return validateRelayContractBehind(refusal, pathArg);
|
|
138
|
+
case 'restore-operation-unavailable':
|
|
139
|
+
return [];
|
|
129
140
|
}
|
|
130
141
|
};
|
|
131
142
|
/** Whether a value is exactly one restore refusal. */
|
|
@@ -146,6 +157,7 @@ const copyRelayContractBehindRefusal = (refusalArg) => Object.freeze({
|
|
|
146
157
|
relayInterfacesVersion: refusalArg.relayInterfacesVersion,
|
|
147
158
|
minimumInterfacesVersion: refusalArg.minimumInterfacesVersion,
|
|
148
159
|
});
|
|
160
|
+
const copyOperationUnavailableRefusal = (refusalArg) => Object.freeze({ name: refusalArg.name });
|
|
149
161
|
/** An inert frozen copy of a refusal that passed `validateBackupRestoreRefusal`. */
|
|
150
162
|
const copyRefusal = (refusalArg) => {
|
|
151
163
|
switch (refusalArg.name) {
|
|
@@ -155,6 +167,8 @@ const copyRefusal = (refusalArg) => {
|
|
|
155
167
|
return copyPreflightUnsupportedRefusal(refusalArg);
|
|
156
168
|
case 'restore-relay-contract-behind':
|
|
157
169
|
return copyRelayContractBehindRefusal(refusalArg);
|
|
170
|
+
case 'restore-operation-unavailable':
|
|
171
|
+
return copyOperationUnavailableRefusal(refusalArg);
|
|
158
172
|
}
|
|
159
173
|
};
|
|
160
174
|
/**
|
|
@@ -192,6 +206,11 @@ export const buildBackupRestoreRelayContractBehindRefusal = (relayInterfacesVers
|
|
|
192
206
|
relayInterfacesVersion: relayInterfacesVersionArg,
|
|
193
207
|
minimumInterfacesVersion: minimumInterfacesVersionArg,
|
|
194
208
|
}));
|
|
209
|
+
/**
|
|
210
|
+
* `restore-operation-unavailable`: Cloudly refuses the in-place restore because a restore is not
|
|
211
|
+
* yet a node-owned operation.
|
|
212
|
+
*/
|
|
213
|
+
export const buildBackupRestoreOperationUnavailableRefusal = () => (copyOperationUnavailableRefusal(requireRefusal({ name: 'restore-operation-unavailable' })));
|
|
195
214
|
const restoreEventStatuses = Object.freeze([
|
|
196
215
|
'restored', 'failed', 'refused',
|
|
197
216
|
]);
|
|
@@ -225,4 +244,4 @@ export const validateBackupRestoreEvent = (valueArg, pathArg = 'backup restore e
|
|
|
225
244
|
}
|
|
226
245
|
return errors;
|
|
227
246
|
};
|
|
228
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwcmVzdG9yZXJlZnVzYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2JhY2t1cHJlc3RvcmVyZWZ1c2FsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEdBQ3hFLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDckQsOEJBQThCO0lBQzlCLCtCQUErQjtJQUMvQiwrQkFBK0I7Q0FDdkIsQ0FBQyxDQUFDO0FBSVosTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN4RCxtRkFBbUY7SUFDbkYsdUJBQXVCLEVBQUUsR0FBRztJQUM1QiwyRkFBMkY7SUFDM0YsaUJBQWlCLEVBQUUsR0FBRztDQUNkLENBQUMsQ0FBQztBQW1DWiw4RkFBOEY7QUFDOUYsTUFBTSxzQkFBc0IsR0FBZ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN4RixNQUFNLEVBQUUsSUFBSTtJQUNaLFFBQVEsRUFBRSxJQUFJO0lBQ2QsYUFBYSxFQUFFLElBQUk7Q0FDcEIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFFBQWlCLEVBQW1DLEVBQUUsQ0FBQyxDQUNuRixPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxRQUFRLENBQUMsQ0FDaEYsQ0FBQztBQUVGLE1BQU0sb0JBQW9CLEdBQUcsZ0JBQWdCLENBQUM7QUFFOUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxRQUFpQixFQUFzQixFQUFFLENBQUMs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
|
|
247
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwcmVzdG9yZXJlZnVzYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2JhY2t1cHJlc3RvcmVyZWZ1c2FsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEdBQ3hFLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFDSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3JELDhCQUE4QjtJQUM5QiwrQkFBK0I7SUFDL0IsK0JBQStCO0lBQy9CLCtCQUErQjtDQUN2QixDQUFDLENBQUM7QUFJWixNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3hELG1GQUFtRjtJQUNuRix1QkFBdUIsRUFBRSxHQUFHO0lBQzVCLDJGQUEyRjtJQUMzRixpQkFBaUIsRUFBRSxHQUFHO0NBQ2QsQ0FBQyxDQUFDO0FBd0NaLDhGQUE4RjtBQUM5RixNQUFNLHNCQUFzQixHQUFnRCxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3hGLE1BQU0sRUFBRSxJQUFJO0lBQ1osUUFBUSxFQUFFLElBQUk7SUFDZCxhQUFhLEVBQUUsSUFBSTtDQUNwQixDQUFDLENBQUM7QUFFSCxNQUFNLG9CQUFvQixHQUFHLENBQUMsUUFBaUIsRUFBbUMsRUFBRSxDQUFDLENBQ25GLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxDQUNoRixDQUFDO0FBRUYsTUFBTSxvQkFBb0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUU5QyxNQUFNLGFBQWEsR0FBRyxDQUFDLFFB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
|
package/package.json
CHANGED
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -20,6 +20,13 @@ import { compareReleaseVersions, parseReleaseVersion } from './releaseversion.js
|
|
|
20
20
|
* that carries the restore check, so Cloudly does not dispatch the restore; the relay states
|
|
21
21
|
* `relayInterfacesVersion` (`null` when it stated none) and the restore needs
|
|
22
22
|
* `minimumInterfacesVersion`.
|
|
23
|
+
* - `restore-operation-unavailable`: Cloudly refuses every in-place restore because a restore is not
|
|
24
|
+
* yet an operation the node owns: a restore relayed as one request is cut at the transport
|
|
25
|
+
* timeout, so Cloudly cannot learn whether it finished. It names the missing capability, not a
|
|
26
|
+
* version, and stays in this contract permanently because stored restore events carry it.
|
|
27
|
+
* Cloudly is its only producer and reads its own restore history, so it carries this reader
|
|
28
|
+
* itself: readers of restore events upgrade before Cloudly, and Cloudly is not rolled back below
|
|
29
|
+
* a release that stored it.
|
|
23
30
|
*
|
|
24
31
|
* It travels as `TypedResponseError.errorData` of a refused restore and is recorded as the
|
|
25
32
|
* `refusal` of the backup's `refused` restore event (`IBackupRestoreEvent`). Each refusal is
|
|
@@ -30,6 +37,7 @@ export const backupRestoreRefusalNames = Object.freeze([
|
|
|
30
37
|
'restore-snapshot-unavailable',
|
|
31
38
|
'restore-preflight-unsupported',
|
|
32
39
|
'restore-relay-contract-behind',
|
|
40
|
+
'restore-operation-unavailable',
|
|
33
41
|
] as const);
|
|
34
42
|
|
|
35
43
|
export type TBackupRestoreRefusalName = typeof backupRestoreRefusalNames[number];
|
|
@@ -68,11 +76,16 @@ export interface IBackupRestoreRelayContractBehindRefusal {
|
|
|
68
76
|
minimumInterfacesVersion: string;
|
|
69
77
|
}
|
|
70
78
|
|
|
79
|
+
export interface IBackupRestoreOperationUnavailableRefusal {
|
|
80
|
+
name: 'restore-operation-unavailable';
|
|
81
|
+
}
|
|
82
|
+
|
|
71
83
|
/** A refused restore, discriminated by `name` (`backupRestoreRefusalNames`). */
|
|
72
84
|
export type TBackupRestoreRefusal =
|
|
73
85
|
| IBackupRestoreSnapshotUnavailableRefusal
|
|
74
86
|
| IBackupRestorePreflightUnsupportedRefusal
|
|
75
|
-
| IBackupRestoreRelayContractBehindRefusal
|
|
87
|
+
| IBackupRestoreRelayContractBehindRefusal
|
|
88
|
+
| IBackupRestoreOperationUnavailableRefusal;
|
|
76
89
|
|
|
77
90
|
/** Every resource type, keyed so a new `TBackupResourceType` member fails to compile here. */
|
|
78
91
|
const backupResourceTypeKeys: Readonly<Record<TBackupResourceType, true>> = Object.freeze({
|
|
@@ -169,6 +182,7 @@ const refusalKeys: Readonly<Record<TBackupRestoreRefusalName, readonly string[]>
|
|
|
169
182
|
'restore-relay-contract-behind': Object.freeze([
|
|
170
183
|
'name', 'relayInterfacesVersion', 'minimumInterfacesVersion',
|
|
171
184
|
]),
|
|
185
|
+
'restore-operation-unavailable': Object.freeze(['name']),
|
|
172
186
|
});
|
|
173
187
|
|
|
174
188
|
/** Validates one restore refusal against its exact schema and names every reason it is refused. */
|
|
@@ -191,6 +205,8 @@ export const validateBackupRestoreRefusal = (
|
|
|
191
205
|
return [];
|
|
192
206
|
case 'restore-relay-contract-behind':
|
|
193
207
|
return validateRelayContractBehind(refusal, pathArg);
|
|
208
|
+
case 'restore-operation-unavailable':
|
|
209
|
+
return [];
|
|
194
210
|
}
|
|
195
211
|
};
|
|
196
212
|
|
|
@@ -227,6 +243,10 @@ const copyRelayContractBehindRefusal = (
|
|
|
227
243
|
minimumInterfacesVersion: refusalArg.minimumInterfacesVersion,
|
|
228
244
|
});
|
|
229
245
|
|
|
246
|
+
const copyOperationUnavailableRefusal = (
|
|
247
|
+
refusalArg: IBackupRestoreOperationUnavailableRefusal,
|
|
248
|
+
): IBackupRestoreOperationUnavailableRefusal => Object.freeze({ name: refusalArg.name });
|
|
249
|
+
|
|
230
250
|
/** An inert frozen copy of a refusal that passed `validateBackupRestoreRefusal`. */
|
|
231
251
|
const copyRefusal = (refusalArg: TBackupRestoreRefusal): TBackupRestoreRefusal => {
|
|
232
252
|
switch (refusalArg.name) {
|
|
@@ -236,6 +256,8 @@ const copyRefusal = (refusalArg: TBackupRestoreRefusal): TBackupRestoreRefusal =
|
|
|
236
256
|
return copyPreflightUnsupportedRefusal(refusalArg);
|
|
237
257
|
case 'restore-relay-contract-behind':
|
|
238
258
|
return copyRelayContractBehindRefusal(refusalArg);
|
|
259
|
+
case 'restore-operation-unavailable':
|
|
260
|
+
return copyOperationUnavailableRefusal(refusalArg);
|
|
239
261
|
}
|
|
240
262
|
};
|
|
241
263
|
|
|
@@ -287,6 +309,14 @@ export const buildBackupRestoreRelayContractBehindRefusal = (
|
|
|
287
309
|
minimumInterfacesVersion: minimumInterfacesVersionArg,
|
|
288
310
|
}));
|
|
289
311
|
|
|
312
|
+
/**
|
|
313
|
+
* `restore-operation-unavailable`: Cloudly refuses the in-place restore because a restore is not
|
|
314
|
+
* yet a node-owned operation.
|
|
315
|
+
*/
|
|
316
|
+
export const buildBackupRestoreOperationUnavailableRefusal = (): IBackupRestoreOperationUnavailableRefusal => (
|
|
317
|
+
copyOperationUnavailableRefusal(requireRefusal({ name: 'restore-operation-unavailable' }))
|
|
318
|
+
);
|
|
319
|
+
|
|
290
320
|
const restoreEventStatuses: readonly IBackupRestoreEvent['status'][] = Object.freeze([
|
|
291
321
|
'restored', 'failed', 'refused',
|
|
292
322
|
]);
|