@futo-org/backups-orchestrator-api 0.23.1 → 0.25.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/dist/backends/local.backend.js +6 -0
- package/dist/backends/local.backend.js.map +1 -1
- package/dist/backends/yucca.backend.d.ts +0 -15
- package/dist/backends/yucca.backend.js +3 -22
- package/dist/backends/yucca.backend.js.map +1 -1
- package/dist/const.d.ts +1 -1
- package/dist/const.js +1 -1
- package/dist/const.js.map +1 -1
- package/dist/dto/repository.dto.d.ts +3 -0
- package/dist/dto/repository.dto.js +17 -0
- package/dist/dto/repository.dto.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/moduleConfig.d.ts +1 -1
- package/dist/orchestrationApi.module.js +2 -0
- package/dist/orchestrationApi.module.js.map +1 -1
- package/dist/repositories/config.repository.d.ts +8 -1
- package/dist/repositories/config.repository.js +10 -3
- package/dist/repositories/config.repository.js.map +1 -1
- package/dist/repositories/repository.repository.d.ts +2 -0
- package/dist/repositories/repository.repository.js +6 -0
- package/dist/repositories/repository.repository.js.map +1 -1
- package/dist/repositories/restic.repository.d.ts +13 -13
- package/dist/repositories/restic.repository.js +38 -24
- package/dist/repositories/restic.repository.js.map +1 -1
- package/dist/schema/migrations/20260729130000-AddRepositoryPlacement.d.ts +3 -0
- package/dist/schema/migrations/20260729130000-AddRepositoryPlacement.js +13 -0
- package/dist/schema/migrations/20260729130000-AddRepositoryPlacement.js.map +1 -0
- package/dist/schema/tables/backend.table.d.ts +0 -1
- package/dist/schema/tables/backend.table.js.map +1 -1
- package/dist/schema/tables/repository.table.d.ts +2 -0
- package/dist/schema/tables/repository.table.js +2 -0
- package/dist/schema/tables/repository.table.js.map +1 -1
- package/dist/services/auth.service.d.ts +1 -3
- package/dist/services/auth.service.js +5 -11
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/repository.service.js +71 -40
- package/dist/services/repository.service.js.map +1 -1
- package/dist/utils/connectionsMath.d.ts +2 -0
- package/dist/utils/connectionsMath.js +131 -0
- package/dist/utils/connectionsMath.js.map +1 -0
- package/dist/wellKnown.d.ts +79 -0
- package/dist/wellKnown.js +163 -0
- package/dist/wellKnown.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
declare const metaConfigSchema: z.ZodObject<{
|
|
3
|
+
restic_pack_size_mib: z.ZodOptional<z.ZodNumber>;
|
|
4
|
+
connections_math: z.ZodOptional<z.ZodString>;
|
|
5
|
+
}, z.core.$strict>;
|
|
6
|
+
declare const metaClusterSchema: z.ZodObject<{
|
|
7
|
+
code: z.ZodString;
|
|
8
|
+
display_name: z.ZodString;
|
|
9
|
+
cluster_config: z.ZodObject<{
|
|
10
|
+
restic_pack_size_mib: z.ZodOptional<z.ZodNumber>;
|
|
11
|
+
connections_math: z.ZodOptional<z.ZodString>;
|
|
12
|
+
}, z.core.$strict>;
|
|
13
|
+
}, z.core.$strict>;
|
|
14
|
+
declare const metaSiteSchema: z.ZodObject<{
|
|
15
|
+
code: z.ZodString;
|
|
16
|
+
display_name: z.ZodString;
|
|
17
|
+
description: z.ZodString;
|
|
18
|
+
rest_url: z.ZodURL;
|
|
19
|
+
default_cluster: z.ZodString;
|
|
20
|
+
site_config: z.ZodObject<{
|
|
21
|
+
restic_pack_size_mib: z.ZodOptional<z.ZodNumber>;
|
|
22
|
+
connections_math: z.ZodOptional<z.ZodString>;
|
|
23
|
+
}, z.core.$strict>;
|
|
24
|
+
clusters: z.ZodArray<z.ZodObject<{
|
|
25
|
+
code: z.ZodString;
|
|
26
|
+
display_name: z.ZodString;
|
|
27
|
+
cluster_config: z.ZodObject<{
|
|
28
|
+
restic_pack_size_mib: z.ZodOptional<z.ZodNumber>;
|
|
29
|
+
connections_math: z.ZodOptional<z.ZodString>;
|
|
30
|
+
}, z.core.$strict>;
|
|
31
|
+
}, z.core.$strict>>;
|
|
32
|
+
}, z.core.$strict>;
|
|
33
|
+
declare const metaSchema: z.ZodObject<{
|
|
34
|
+
api_root: z.ZodURL;
|
|
35
|
+
config: z.ZodObject<{
|
|
36
|
+
restic_pack_size_mib: z.ZodOptional<z.ZodNumber>;
|
|
37
|
+
connections_math: z.ZodOptional<z.ZodString>;
|
|
38
|
+
}, z.core.$strict>;
|
|
39
|
+
default_site: z.ZodString;
|
|
40
|
+
sites: z.ZodArray<z.ZodObject<{
|
|
41
|
+
code: z.ZodString;
|
|
42
|
+
display_name: z.ZodString;
|
|
43
|
+
description: z.ZodString;
|
|
44
|
+
rest_url: z.ZodURL;
|
|
45
|
+
default_cluster: z.ZodString;
|
|
46
|
+
site_config: z.ZodObject<{
|
|
47
|
+
restic_pack_size_mib: z.ZodOptional<z.ZodNumber>;
|
|
48
|
+
connections_math: z.ZodOptional<z.ZodString>;
|
|
49
|
+
}, z.core.$strict>;
|
|
50
|
+
clusters: z.ZodArray<z.ZodObject<{
|
|
51
|
+
code: z.ZodString;
|
|
52
|
+
display_name: z.ZodString;
|
|
53
|
+
cluster_config: z.ZodObject<{
|
|
54
|
+
restic_pack_size_mib: z.ZodOptional<z.ZodNumber>;
|
|
55
|
+
connections_math: z.ZodOptional<z.ZodString>;
|
|
56
|
+
}, z.core.$strict>;
|
|
57
|
+
}, z.core.$strict>>;
|
|
58
|
+
}, z.core.$strict>>;
|
|
59
|
+
}, z.core.$strict>;
|
|
60
|
+
export type MetaConfig = z.infer<typeof metaConfigSchema>;
|
|
61
|
+
export type MetaCluster = z.infer<typeof metaClusterSchema>;
|
|
62
|
+
export type MetaSite = z.infer<typeof metaSiteSchema>;
|
|
63
|
+
export type Meta = z.infer<typeof metaSchema>;
|
|
64
|
+
export declare class YuccaWellKnown {
|
|
65
|
+
private url;
|
|
66
|
+
private data?;
|
|
67
|
+
private fetchedAt;
|
|
68
|
+
private lastError?;
|
|
69
|
+
private failedAt;
|
|
70
|
+
configure(url?: string): void;
|
|
71
|
+
get(): Promise<Meta>;
|
|
72
|
+
getBaseUrl(): Promise<string>;
|
|
73
|
+
getSites(): Promise<MetaSite[]>;
|
|
74
|
+
getConfig(siteCode?: string, clusterCode?: string): Promise<MetaConfig>;
|
|
75
|
+
getConnections(cores: number, siteCode?: string, clusterCode?: string): Promise<number | undefined>;
|
|
76
|
+
getPackSizeMib(siteCode?: string, clusterCode?: string): Promise<number | undefined>;
|
|
77
|
+
}
|
|
78
|
+
export declare const yuccaWellKnown: YuccaWellKnown;
|
|
79
|
+
export {};
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.yuccaWellKnown = exports.YuccaWellKnown = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const const_1 = require("./const");
|
|
6
|
+
const connectionsMath_1 = require("./utils/connectionsMath");
|
|
7
|
+
const metaConfigSchema = zod_1.z
|
|
8
|
+
.object({
|
|
9
|
+
restic_pack_size_mib: zod_1.z.number().int().min(1).max(128).optional(),
|
|
10
|
+
connections_math: zod_1.z.string().optional(),
|
|
11
|
+
})
|
|
12
|
+
.strict();
|
|
13
|
+
const metaClusterSchema = zod_1.z
|
|
14
|
+
.object({
|
|
15
|
+
code: zod_1.z.string().min(1),
|
|
16
|
+
display_name: zod_1.z.string().min(1),
|
|
17
|
+
cluster_config: metaConfigSchema,
|
|
18
|
+
})
|
|
19
|
+
.strict();
|
|
20
|
+
const metaSiteSchema = zod_1.z
|
|
21
|
+
.object({
|
|
22
|
+
code: zod_1.z.string().min(1),
|
|
23
|
+
display_name: zod_1.z.string().min(1),
|
|
24
|
+
description: zod_1.z.string(),
|
|
25
|
+
rest_url: zod_1.z.url(),
|
|
26
|
+
default_cluster: zod_1.z.string().min(1),
|
|
27
|
+
site_config: metaConfigSchema,
|
|
28
|
+
clusters: zod_1.z.array(metaClusterSchema).min(1),
|
|
29
|
+
})
|
|
30
|
+
.strict();
|
|
31
|
+
const metaSchema = zod_1.z
|
|
32
|
+
.object({
|
|
33
|
+
api_root: zod_1.z.url(),
|
|
34
|
+
config: metaConfigSchema,
|
|
35
|
+
default_site: zod_1.z.string().min(1),
|
|
36
|
+
sites: zod_1.z.array(metaSiteSchema).min(1),
|
|
37
|
+
})
|
|
38
|
+
.strict()
|
|
39
|
+
.superRefine((meta, ctx) => {
|
|
40
|
+
if (!meta.sites.some((site) => site.code === meta.default_site)) {
|
|
41
|
+
ctx.addIssue({ code: 'custom', message: `default_site '${meta.default_site}' is not declared` });
|
|
42
|
+
}
|
|
43
|
+
for (const site of meta.sites) {
|
|
44
|
+
if (!site.clusters.some((cluster) => cluster.code === site.default_cluster)) {
|
|
45
|
+
ctx.addIssue({
|
|
46
|
+
code: 'custom',
|
|
47
|
+
message: `Site '${site.code}' default_cluster '${site.default_cluster}' is not declared`,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
const pointerSchema = zod_1.z.object({ meta_url: zod_1.z.url() }).strict();
|
|
53
|
+
const META_CACHE_TTL = 5 * 60 * 1000;
|
|
54
|
+
const FAILURE_CACHE_TTL = 60 * 1000;
|
|
55
|
+
const FETCH_TIMEOUT = 8000;
|
|
56
|
+
class UnknownTopologyCodeError extends Error {
|
|
57
|
+
}
|
|
58
|
+
const fetchValidated = async (url, schema) => {
|
|
59
|
+
const response = await fetch(url, { signal: AbortSignal.timeout(FETCH_TIMEOUT) });
|
|
60
|
+
if (!response.ok) {
|
|
61
|
+
throw new Error(`GET ${url} failed with HTTP ${response.status}`);
|
|
62
|
+
}
|
|
63
|
+
return schema.parse(await response.json());
|
|
64
|
+
};
|
|
65
|
+
class YuccaWellKnown {
|
|
66
|
+
url = const_1.YUCCA_WELL_KNOWN;
|
|
67
|
+
data;
|
|
68
|
+
fetchedAt = 0;
|
|
69
|
+
lastError;
|
|
70
|
+
failedAt = 0;
|
|
71
|
+
configure(url) {
|
|
72
|
+
this.url = url ?? const_1.YUCCA_WELL_KNOWN;
|
|
73
|
+
this.data = undefined;
|
|
74
|
+
this.fetchedAt = 0;
|
|
75
|
+
this.lastError = undefined;
|
|
76
|
+
this.failedAt = 0;
|
|
77
|
+
}
|
|
78
|
+
async get() {
|
|
79
|
+
const fresh = Date.now() - this.fetchedAt < META_CACHE_TTL;
|
|
80
|
+
const failedRecently = this.lastError !== undefined && Date.now() - this.failedAt < FAILURE_CACHE_TTL;
|
|
81
|
+
if (this.data && (fresh || failedRecently)) {
|
|
82
|
+
return this.data;
|
|
83
|
+
}
|
|
84
|
+
if (!this.data && failedRecently) {
|
|
85
|
+
throw this.lastError;
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
const pointer = await fetchValidated(this.url, pointerSchema);
|
|
89
|
+
const next = await fetchValidated(pointer.meta_url, metaSchema);
|
|
90
|
+
this.data = next;
|
|
91
|
+
this.fetchedAt = Date.now();
|
|
92
|
+
this.lastError = undefined;
|
|
93
|
+
return next;
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
this.lastError = error;
|
|
97
|
+
this.failedAt = Date.now();
|
|
98
|
+
if (this.data) {
|
|
99
|
+
return this.data;
|
|
100
|
+
}
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async getBaseUrl() {
|
|
105
|
+
const meta = await this.get();
|
|
106
|
+
return meta.api_root.replace(/\/api\/?$/, '');
|
|
107
|
+
}
|
|
108
|
+
async getSites() {
|
|
109
|
+
const meta = await this.get();
|
|
110
|
+
return meta.sites;
|
|
111
|
+
}
|
|
112
|
+
async getConfig(siteCode, clusterCode) {
|
|
113
|
+
const meta = await this.get();
|
|
114
|
+
if (!siteCode) {
|
|
115
|
+
if (clusterCode) {
|
|
116
|
+
throw new UnknownTopologyCodeError(`Cluster '${clusterCode}' was provided without a site`);
|
|
117
|
+
}
|
|
118
|
+
return { ...meta.config };
|
|
119
|
+
}
|
|
120
|
+
const site = meta.sites.find((candidate) => candidate.code === siteCode);
|
|
121
|
+
if (!site) {
|
|
122
|
+
throw new UnknownTopologyCodeError(`Unknown site '${siteCode}'`);
|
|
123
|
+
}
|
|
124
|
+
if (!clusterCode) {
|
|
125
|
+
return { ...meta.config, ...site.site_config };
|
|
126
|
+
}
|
|
127
|
+
const cluster = site.clusters.find((candidate) => candidate.code === clusterCode);
|
|
128
|
+
if (!cluster) {
|
|
129
|
+
throw new UnknownTopologyCodeError(`Unknown cluster '${clusterCode}' for site '${siteCode}'`);
|
|
130
|
+
}
|
|
131
|
+
return { ...meta.config, ...site.site_config, ...cluster.cluster_config };
|
|
132
|
+
}
|
|
133
|
+
async getConnections(cores, siteCode, clusterCode) {
|
|
134
|
+
try {
|
|
135
|
+
const { connections_math } = await this.getConfig(siteCode, clusterCode);
|
|
136
|
+
if (!connections_math) {
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
return Math.max(1, Math.floor((0, connectionsMath_1.evaluateConnectionsMath)(connections_math, cores)));
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
if (error instanceof UnknownTopologyCodeError) {
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async getPackSizeMib(siteCode, clusterCode) {
|
|
149
|
+
try {
|
|
150
|
+
const config = await this.getConfig(siteCode, clusterCode);
|
|
151
|
+
return config.restic_pack_size_mib;
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
if (error instanceof UnknownTopologyCodeError) {
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
exports.YuccaWellKnown = YuccaWellKnown;
|
|
162
|
+
exports.yuccaWellKnown = new YuccaWellKnown();
|
|
163
|
+
//# sourceMappingURL=wellKnown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wellKnown.js","sourceRoot":"","sources":["../src/wellKnown.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AACxB,mCAA2C;AAC3C,6DAAkE;AAElE,MAAM,gBAAgB,GAAG,OAAC;KACvB,MAAM,CAAC;IACN,oBAAoB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACjE,gBAAgB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACxC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,iBAAiB,GAAG,OAAC;KACxB,MAAM,CAAC;IACN,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,cAAc,EAAE,gBAAgB;CACjC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,cAAc,GAAG,OAAC;KACrB,MAAM,CAAC;IACN,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;IACvB,QAAQ,EAAE,OAAC,CAAC,GAAG,EAAE;IACjB,eAAe,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAClC,WAAW,EAAE,gBAAgB;IAC7B,QAAQ,EAAE,OAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CAC5C,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,UAAU,GAAG,OAAC;KACjB,MAAM,CAAC;IACN,QAAQ,EAAE,OAAC,CAAC,GAAG,EAAE;IACjB,MAAM,EAAE,gBAAgB;IACxB,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,KAAK,EAAE,OAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CACtC,CAAC;KACD,MAAM,EAAE;KACR,WAAW,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACzB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,IAAI,CAAC,YAAY,mBAAmB,EAAE,CAAC,CAAC;IACnG,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YAC5E,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,sBAAsB,IAAI,CAAC,eAAe,mBAAmB;aACzF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,aAAa,GAAG,OAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAO/D,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACrC,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC;AACpC,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,MAAM,wBAAyB,SAAQ,KAAK;CAAG;AAE/C,MAAM,cAAc,GAAG,KAAK,EAAK,GAAW,EAAE,MAAoB,EAAc,EAAE;IAChF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAClF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,qBAAqB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAa,cAAc;IACjB,GAAG,GAAG,wBAAgB,CAAC;IACvB,IAAI,CAAQ;IACZ,SAAS,GAAG,CAAC,CAAC;IACd,SAAS,CAAW;IACpB,QAAQ,GAAG,CAAC,CAAC;IAErB,SAAS,CAAC,GAAY;QACpB,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,wBAAgB,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC;QAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,iBAAiB,CAAC;QACtG,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,SAAS,CAAC;QACvB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAChE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,IAAI,CAAC,IAAI,CAAC;YACnB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAID,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAiB,EAAE,WAAoB;QACrD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,IAAI,wBAAwB,CAAC,YAAY,WAAW,+BAA+B,CAAC,CAAC;YAC7F,CAAC;YACD,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACzE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,wBAAwB,CAAC,iBAAiB,QAAQ,GAAG,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QAClF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,wBAAwB,CAAC,oBAAoB,WAAW,eAAe,QAAQ,GAAG,CAAC,CAAC;QAChG,CAAC;QACD,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,QAAiB,EAAE,WAAoB;QACzE,IAAI,CAAC;YACH,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACzE,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAA,yCAAuB,EAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACnF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,wBAAwB,EAAE,CAAC;gBAC9C,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAiB,EAAE,WAAoB;QAC1D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC3D,OAAO,MAAM,CAAC,oBAAoB,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,wBAAwB,EAAE,CAAC;gBAC9C,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AAxGD,wCAwGC;AAEY,QAAA,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@futo-org/backups-orchestrator-api",
|
|
3
3
|
"repository": "https://github.com/immich-app/yucca",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.25.0",
|
|
5
5
|
"description": "Backups orchestrator (API)",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -31,7 +31,8 @@
|
|
|
31
31
|
"rxjs": "^7.8.2",
|
|
32
32
|
"socket.io": "^4.8.3",
|
|
33
33
|
"tail": "^2.2.6",
|
|
34
|
-
"
|
|
34
|
+
"zod": "^4.3.5",
|
|
35
|
+
"@futo-org/backups-api-client": "^0.25.0"
|
|
35
36
|
},
|
|
36
37
|
"devDependencies": {
|
|
37
38
|
"@nestjs/cli": "^11.0.14",
|