@futo-org/backups-orchestrator-api 0.41.0 → 0.42.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/enum.d.ts +2 -1
- package/dist/enum.js +1 -0
- package/dist/enum.js.map +1 -1
- package/dist/orchestrationApi.module.d.ts +2 -0
- package/dist/orchestrationApi.module.js +18 -11
- package/dist/orchestrationApi.module.js.map +1 -1
- package/dist/repositories/config.repository.d.ts +7 -1
- package/dist/repositories/config.repository.js +42 -4
- package/dist/repositories/config.repository.js.map +1 -1
- package/package.json +2 -2
package/dist/enum.d.ts
CHANGED
|
@@ -20,7 +20,8 @@ export declare enum ConfigurationKey {
|
|
|
20
20
|
Telemetry = "telemetry",
|
|
21
21
|
SkippedOnboardingExtraConfig = "skipped-onboarding-extra-config",
|
|
22
22
|
ResticOptionRestConnections = "restic-o-rest-connections",
|
|
23
|
-
SessionSecret = "session-secret"
|
|
23
|
+
SessionSecret = "session-secret",
|
|
24
|
+
StatePath = "state-path"
|
|
24
25
|
}
|
|
25
26
|
export declare enum MetadataKey {
|
|
26
27
|
PublicRoute = "public-route"
|
package/dist/enum.js
CHANGED
|
@@ -28,6 +28,7 @@ var ConfigurationKey;
|
|
|
28
28
|
ConfigurationKey["SkippedOnboardingExtraConfig"] = "skipped-onboarding-extra-config";
|
|
29
29
|
ConfigurationKey["ResticOptionRestConnections"] = "restic-o-rest-connections";
|
|
30
30
|
ConfigurationKey["SessionSecret"] = "session-secret";
|
|
31
|
+
ConfigurationKey["StatePath"] = "state-path";
|
|
31
32
|
})(ConfigurationKey || (exports.ConfigurationKey = ConfigurationKey = {}));
|
|
32
33
|
var MetadataKey;
|
|
33
34
|
(function (MetadataKey) {
|
package/dist/enum.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enum.js","sourceRoot":"","sources":["../src/enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,UAQX;AARD,WAAY,UAAU;IACpB,kCAAoB,CAAA;IACpB,0CAA4B,CAAA;IAC5B,yDAA2C,CAAA;IAC3C,0CAA4B,CAAA;IAC5B,qDAAuC,CAAA;IACvC,iDAAmC,CAAA;IACnC,gEAAkD,CAAA;AACpD,CAAC,EARW,UAAU,0BAAV,UAAU,QAQrB;AAED,IAAY,YAEX;AAFD,WAAY,YAAY;IACtB,6DAA6C,CAAA;AAC/C,CAAC,EAFW,YAAY,4BAAZ,YAAY,QAEvB;AAED,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,sDAAsC,CAAA;IACtC,uDAAuC,CAAA;AACzC,CAAC,EAHW,YAAY,4BAAZ,YAAY,QAGvB;AAED,IAAY,
|
|
1
|
+
{"version":3,"file":"enum.js","sourceRoot":"","sources":["../src/enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,UAQX;AARD,WAAY,UAAU;IACpB,kCAAoB,CAAA;IACpB,0CAA4B,CAAA;IAC5B,yDAA2C,CAAA;IAC3C,0CAA4B,CAAA;IAC5B,qDAAuC,CAAA;IACvC,iDAAmC,CAAA;IACnC,gEAAkD,CAAA;AACpD,CAAC,EARW,UAAU,0BAAV,UAAU,QAQrB;AAED,IAAY,YAEX;AAFD,WAAY,YAAY;IACtB,6DAA6C,CAAA;AAC/C,CAAC,EAFW,YAAY,4BAAZ,YAAY,QAEvB;AAED,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,sDAAsC,CAAA;IACtC,uDAAuC,CAAA;AACzC,CAAC,EAHW,YAAY,4BAAZ,YAAY,QAGvB;AAED,IAAY,gBAQX;AARD,WAAY,gBAAgB;IAC1B,oDAAgC,CAAA;IAChC,kDAA8B,CAAA;IAC9B,2CAAuB,CAAA;IACvB,oFAAgE,CAAA;IAChE,6EAAyD,CAAA;IACzD,oDAAgC,CAAA;IAChC,4CAAwB,CAAA;AAC1B,CAAC,EARW,gBAAgB,gCAAhB,gBAAgB,QAQ3B;AAED,IAAY,WAEX;AAFD,WAAY,WAAW;IACrB,2CAA4B,CAAA;AAC9B,CAAC,EAFW,WAAW,2BAAX,WAAW,QAEtB;AAED,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,8BAAe,CAAA;IACf,8BAAe,CAAA;IACf,wBAAS,CAAA;AACX,CAAC,EAJW,WAAW,2BAAX,WAAW,QAItB;AAED,IAAY,UAKX;AALD,WAAY,UAAU;IACpB,uCAAyB,CAAA;IACzB,mCAAqB,CAAA;IACrB,2BAAa,CAAA;IACb,+BAAiB,CAAA;AACnB,CAAC,EALW,UAAU,0BAAV,UAAU,QAKrB;AAED,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,iCAAqB,CAAA;IACrB,+BAAmB,CAAA;IACnB,6BAAiB,CAAA;IACjB,6BAAiB,CAAA;AACnB,CAAC,EALW,QAAQ,wBAAR,QAAQ,QAKnB;AAED,IAAY,aAEX;AAFD,WAAY,aAAa;IACvB,mEAAkD,CAAA;AACpD,CAAC,EAFW,aAAa,6BAAb,aAAa,QAExB;AAED,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC7B,sCAAe,CAAA;IACf,0CAAmB,CAAA;IACnB,0CAAmB,CAAA;AACrB,CAAC,EAJW,mBAAmB,mCAAnB,mBAAmB,QAI9B;AAED,IAAY,uBAKX;AALD,WAAY,uBAAuB;IACjC,yDAA8B,CAAA;IAC9B,kEAAuC,CAAA;IACvC,yDAA8B,CAAA;IAC9B,8CAAmB,CAAA;AACrB,CAAC,EALW,uBAAuB,uCAAvB,uBAAuB,QAKlC;AAED,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,yCAAsB,CAAA;IACtB,kCAAe,CAAA;IACf,kCAAe,CAAA;AACjB,CAAC,EAJW,eAAe,+BAAf,eAAe,QAI1B;AAED,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,+BAAa,CAAA;AACf,CAAC,EAHW,cAAc,8BAAd,cAAc,QAGzB;AAED,IAAY,eAEX;AAFD,WAAY,eAAe;IACzB,yEAAsD,CAAA;AACxD,CAAC,EAFW,eAAe,+BAAf,eAAe,QAE1B"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DynamicModule, FactoryProvider, ModuleMetadata } from '@nestjs/common';
|
|
2
|
+
import { type SqliteDatabase } from 'kysely';
|
|
2
3
|
import { AuthController } from './controllers/auth.controller';
|
|
3
4
|
import { BackendController } from './controllers/backend.controller';
|
|
4
5
|
import { DevelopmentController } from './controllers/development.controller';
|
|
@@ -42,6 +43,7 @@ import { YuccaService } from './services/yucca.service';
|
|
|
42
43
|
export declare const controllers: (typeof AuthController | typeof BackendController | typeof DevelopmentController | typeof FilesystemController | typeof IntegrationsController | typeof OnboardingController | typeof RepositoryController | typeof RunHistoryController | typeof RunningTasksController | typeof ScheduleController)[];
|
|
43
44
|
export declare const repositories: (typeof ModuleConfigRepository | typeof LoggingRepository | typeof BackendRepository | typeof ConfigRepository | typeof RepositoryRepository | typeof BootstrapRepository | typeof StorageRepository | typeof DatabaseRepository | typeof RunHistoryRepository | typeof RepositoryIntegrationImmichRepository | typeof RunningTasksRepository | typeof ScheduleRepository | typeof RepositoryLocalMetricsRepository | typeof RepositoryPathRepository | typeof ResticRepository)[];
|
|
44
45
|
export declare const services: (typeof SessionService | typeof TelemetryService | typeof AuthService | typeof BackendService | typeof RunHistoryService | typeof RepositoryService | typeof BootstrapService | typeof ScheduleService | typeof DevelopmentService | typeof FilesystemService | typeof IntegrationsService | typeof OnboardingService | typeof RunningTasksService | typeof YuccaService)[];
|
|
46
|
+
export declare function openStateDatabase(config: Pick<ModuleConfig, 'statePath'>, logger?: LoggingRepository): SqliteDatabase;
|
|
45
47
|
export interface OrchestrationApiModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
|
|
46
48
|
inject?: FactoryProvider['inject'];
|
|
47
49
|
useFactory: (...args: any[]) => Promise<Partial<ModuleConfig>> | Partial<ModuleConfig>;
|
|
@@ -11,6 +11,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
11
11
|
var OrchestrationConfigModule_1, OrchestrationApiModule_1;
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
exports.OrchestrationApiModule = exports.services = exports.repositories = exports.controllers = void 0;
|
|
14
|
+
exports.openStateDatabase = openStateDatabase;
|
|
14
15
|
const common_1 = require("@nestjs/common");
|
|
15
16
|
const core_1 = require("@nestjs/core");
|
|
16
17
|
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
@@ -112,6 +113,20 @@ exports.services = [
|
|
|
112
113
|
telemetry_service_1.TelemetryService,
|
|
113
114
|
yucca_service_1.YuccaService,
|
|
114
115
|
];
|
|
116
|
+
function openStateDatabase(config, logger = logging_repository_1.LoggingRepository.create('State')) {
|
|
117
|
+
(0, node_fs_1.mkdirSync)(config.statePath, { recursive: true });
|
|
118
|
+
const databasePath = (0, node_path_1.resolve)(config.statePath, 'state.sqlite3');
|
|
119
|
+
if ((0, node_fs_1.existsSync)(databasePath)) {
|
|
120
|
+
logger.log(`Opened existing state database at ${databasePath}`);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
logger.warn(`No state database at ${databasePath}, creating a new one`);
|
|
124
|
+
}
|
|
125
|
+
const database = new better_sqlite3_1.default(databasePath);
|
|
126
|
+
database.pragma('journal_mode = WAL');
|
|
127
|
+
database.pragma('wal_autocheckpoint = 1');
|
|
128
|
+
return database;
|
|
129
|
+
}
|
|
115
130
|
let OrchestrationConfigModule = OrchestrationConfigModule_1 = class OrchestrationConfigModule {
|
|
116
131
|
static forRootAsync(options) {
|
|
117
132
|
return {
|
|
@@ -147,17 +162,9 @@ let OrchestrationApiModule = OrchestrationApiModule_1 = class OrchestrationApiMo
|
|
|
147
162
|
namespace: 'orchestrator',
|
|
148
163
|
imports: [configModule],
|
|
149
164
|
inject: [moduleConfig_1.ModuleConfigProvider],
|
|
150
|
-
useFactory: (config) => {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
154
|
-
const database = new better_sqlite3_1.default((0, node_path_1.resolve)(config.statePath, 'state.sqlite3'));
|
|
155
|
-
database.pragma('journal_mode = WAL');
|
|
156
|
-
database.pragma('wal_autocheckpoint = 1');
|
|
157
|
-
return {
|
|
158
|
-
dialect: new kysely_1.SqliteDialect({ database }),
|
|
159
|
-
};
|
|
160
|
-
},
|
|
165
|
+
useFactory: (config) => ({
|
|
166
|
+
dialect: new kysely_1.SqliteDialect({ database: openStateDatabase(config) }),
|
|
167
|
+
}),
|
|
161
168
|
}),
|
|
162
169
|
event_emitter_1.EventEmitterModule.forRoot(),
|
|
163
170
|
jwt_1.JwtModule.register({}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrationApi.module.js","sourceRoot":"","sources":["../src/orchestrationApi.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"orchestrationApi.module.js","sourceRoot":"","sources":["../src/orchestrationApi.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { Kysely } from 'kysely';
|
|
2
|
+
import { type ModuleConfig } from '../moduleConfig';
|
|
2
3
|
import { DB } from '../schema';
|
|
4
|
+
import { LoggingRepository } from './logging.repository';
|
|
3
5
|
export type ResticPlacement = {
|
|
4
6
|
siteCode: string | null;
|
|
5
7
|
storageClusterCode: string | null;
|
|
6
8
|
};
|
|
7
9
|
export declare class ConfigRepository {
|
|
8
10
|
private db;
|
|
9
|
-
|
|
11
|
+
private moduleConfig;
|
|
12
|
+
private readonly logger;
|
|
13
|
+
constructor(db: Kysely<DB>, moduleConfig: ModuleConfig, logger: LoggingRepository);
|
|
10
14
|
bootstrap(): Promise<void>;
|
|
15
|
+
private assertStateIsEmpty;
|
|
16
|
+
private recordStatePath;
|
|
11
17
|
private set;
|
|
12
18
|
private get;
|
|
13
19
|
private getOptional;
|
|
@@ -11,6 +11,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
12
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
13
|
};
|
|
14
|
+
var ConfigRepository_1;
|
|
14
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
16
|
exports.ConfigRepository = void 0;
|
|
16
17
|
const common_1 = require("@nestjs/common");
|
|
@@ -18,23 +19,59 @@ const kysely_1 = require("kysely");
|
|
|
18
19
|
const nestjs_kysely_1 = require("nestjs-kysely");
|
|
19
20
|
const node_crypto_1 = require("node:crypto");
|
|
20
21
|
const node_os_1 = require("node:os");
|
|
22
|
+
const node_path_1 = require("node:path");
|
|
21
23
|
const enum_1 = require("../enum");
|
|
24
|
+
const moduleConfig_1 = require("../moduleConfig");
|
|
22
25
|
const wellKnown_1 = require("../wellKnown");
|
|
23
|
-
|
|
26
|
+
const logging_repository_1 = require("./logging.repository");
|
|
27
|
+
let ConfigRepository = ConfigRepository_1 = class ConfigRepository {
|
|
24
28
|
db;
|
|
25
|
-
|
|
29
|
+
moduleConfig;
|
|
30
|
+
logger;
|
|
31
|
+
constructor(db, moduleConfig, logger) {
|
|
26
32
|
this.db = db;
|
|
33
|
+
this.moduleConfig = moduleConfig;
|
|
34
|
+
this.logger = logger;
|
|
35
|
+
this.logger.setContext(ConfigRepository_1.name);
|
|
27
36
|
}
|
|
28
37
|
async bootstrap() {
|
|
38
|
+
const statePath = (0, node_path_1.resolve)(this.moduleConfig.statePath);
|
|
29
39
|
const hasKey = await this.hasEncryptionKey();
|
|
30
40
|
if (!hasKey) {
|
|
41
|
+
await this.assertStateIsEmpty(statePath);
|
|
42
|
+
this.logger.warn(`Generating a new master encryption key for the state in ${statePath}. Backups written with a previous key cannot be decrypted with this one.`);
|
|
31
43
|
await this.set(enum_1.ConfigurationKey.EncryptionKey, (0, node_crypto_1.randomBytes)(32).toString('hex'));
|
|
32
44
|
}
|
|
45
|
+
await this.recordStatePath(statePath);
|
|
33
46
|
const hasSecret = await this.hasSessionSecret();
|
|
34
47
|
if (!hasSecret) {
|
|
35
48
|
await this.set(enum_1.ConfigurationKey.SessionSecret, (0, node_crypto_1.randomBytes)(32).toString('hex'));
|
|
36
49
|
}
|
|
37
50
|
}
|
|
51
|
+
async assertStateIsEmpty(statePath) {
|
|
52
|
+
const [{ backends }] = await this.db
|
|
53
|
+
.selectFrom('backends')
|
|
54
|
+
.select((eb) => eb.fn.countAll().as('backends'))
|
|
55
|
+
.execute();
|
|
56
|
+
const [{ repositories }] = await this.db
|
|
57
|
+
.selectFrom('repositories')
|
|
58
|
+
.select((eb) => eb.fn.countAll().as('repositories'))
|
|
59
|
+
.execute();
|
|
60
|
+
if (backends === 0 && repositories === 0) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
throw new Error(`The state in ${statePath} has ${backends} backend(s) and ${repositories} repository(ies) but no master encryption key. Refusing to generate one, as that would make those backups undecryptable. Restore the original state database.`);
|
|
64
|
+
}
|
|
65
|
+
async recordStatePath(statePath) {
|
|
66
|
+
const previous = await this.getOptional(enum_1.ConfigurationKey.StatePath);
|
|
67
|
+
if (previous === statePath) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (previous) {
|
|
71
|
+
this.logger.warn(`The state database was created in ${previous} but is being opened from ${statePath}. If the original directory is still populated, two installations are now diverging.`);
|
|
72
|
+
}
|
|
73
|
+
await this.set(enum_1.ConfigurationKey.StatePath, statePath);
|
|
74
|
+
}
|
|
38
75
|
async set(key, value) {
|
|
39
76
|
await this.db
|
|
40
77
|
.insertInto('config')
|
|
@@ -121,9 +158,10 @@ let ConfigRepository = class ConfigRepository {
|
|
|
121
158
|
}
|
|
122
159
|
};
|
|
123
160
|
exports.ConfigRepository = ConfigRepository;
|
|
124
|
-
exports.ConfigRepository = ConfigRepository = __decorate([
|
|
161
|
+
exports.ConfigRepository = ConfigRepository = ConfigRepository_1 = __decorate([
|
|
125
162
|
(0, common_1.Injectable)(),
|
|
126
163
|
__param(0, (0, nestjs_kysely_1.InjectKysely)('orchestrator')),
|
|
127
|
-
|
|
164
|
+
__param(1, (0, common_1.Inject)(moduleConfig_1.ModuleConfigProvider)),
|
|
165
|
+
__metadata("design:paramtypes", [kysely_1.Kysely, Object, logging_repository_1.LoggingRepository])
|
|
128
166
|
], ConfigRepository);
|
|
129
167
|
//# sourceMappingURL=config.repository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.repository.js","sourceRoot":"","sources":["../../src/repositories/config.repository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.repository.js","sourceRoot":"","sources":["../../src/repositories/config.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,mCAAgC;AAChC,iDAA6C;AAC7C,6CAA0C;AAC1C,qCAA+C;AAC/C,yCAAoC;AACpC,kCAA2C;AAC3C,kDAA0E;AAE1E,4CAA8C;AAC9C,6DAAyD;AAKlD,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IAEa;IACA;IACrB;IAHnB,YACwC,EAAc,EACd,YAA0B,EAC/C,MAAyB;QAFJ,OAAE,GAAF,EAAE,CAAY;QACd,iBAAY,GAAZ,YAAY,CAAc;QAC/C,WAAM,GAAN,MAAM,CAAmB;QAE1C,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,kBAAgB,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAEzC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,2DAA2D,SAAS,0EAA0E,CAC/I,CAAC;YAEF,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,aAAa,EAAE,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAEtC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAEhD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,aAAa,EAAE,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,SAAiB;QAChD,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE;aACjC,UAAU,CAAC,UAAU,CAAC;aACtB,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAU,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;aACvD,OAAO,EAAE,CAAC;QAEb,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE;aACrC,UAAU,CAAC,cAAc,CAAC;aAC1B,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAU,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;aAC3D,OAAO,EAAE,CAAC;QAEb,IAAI,QAAQ,KAAK,CAAC,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,KAAK,CACb,gBAAgB,SAAS,QAAQ,QAAQ,mBAAmB,YAAY,+JAA+J,CACxO,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,SAAiB;QAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,uBAAgB,CAAC,SAAS,CAAC,CAAC;QAEpE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,qCAAqC,QAAQ,6BAA6B,SAAS,sFAAsF,CAC1K,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,GAAqB,EAAE,KAAa;QACpD,MAAM,IAAI,CAAC,EAAE;aACV,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC;YACN,GAAG;YACH,KAAK;SACN,CAAC;aACD,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;aAC7C,uBAAuB,EAAE,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,GAAqB;QACrC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC5B,UAAU,CAAC,QAAQ,CAAC;aACpB,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC;aAC7B,MAAM,CAAC,cAAc,CAAC;aACtB,uBAAuB,EAAE,CAAC;QAE7B,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,GAAqB;QAC7C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,UAAU,CAAC,QAAQ,CAAC;aACpB,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC;aAC7B,MAAM,CAAC,cAAc,CAAC;aACtB,gBAAgB,EAAE,CAAC;QAEtB,OAAO,GAAG,EAAE,KAAK,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,GAAqB;QACrC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;QAEvG,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,aAAa,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAA4B;QACpD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,aAAa,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAEpD,MAAM,GAAG,GAAG,IAAI,UAAU,CACxB,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAC5B;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAa,CAAC;SAClE,EACD,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC,CAAC,EAC9E,GAAG,CACJ,CACF,CAAC;QAEF,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,GAAW;QACnC,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,4BAA4B,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,SAA0B;QAE1B,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC;QACjD,MAAM,WAAW,GAAG,SAAS,CAAC,kBAAkB,IAAI,SAAS,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAA,8BAAoB,GAAE,CAAC;QAErC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,uBAAgB,CAAC,2BAA2B,CAAC,CAAC;QACtF,MAAM,WAAW,GAAG,QAAQ;YAC1B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,CAAC,CAAC,CAAC,CAAC,MAAM,0BAAc,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC;QAEnF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAAc,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;IAClG,CAAC;CACF,CAAA;AAvLY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,4BAAY,EAAC,cAAc,CAAC,CAAA;IAC5B,WAAA,IAAA,eAAM,EAAC,mCAAoB,CAAC,CAAA;qCADa,eAAM,UAEvB,sCAAiB;GAJjC,gBAAgB,CAuL5B"}
|
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.42.0",
|
|
5
5
|
"description": "Backups orchestrator (API)",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"socket.io": "^4.8.3",
|
|
35
35
|
"tail": "^2.2.6",
|
|
36
36
|
"zod": "4.4.3",
|
|
37
|
-
"@futo-org/backups-api-client": "^0.
|
|
37
|
+
"@futo-org/backups-api-client": "^0.42.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@nestjs/cli": "^11.0.14",
|