@byigitt/wbackup 1.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/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/manager.d.ts +33 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +114 -0
- package/dist/manager.js.map +1 -0
- package/dist/registry.d.ts +16 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +43 -0
- package/dist/registry.js.map +1 -0
- package/dist/strategies/backup/index.d.ts +7 -0
- package/dist/strategies/backup/index.d.ts.map +1 -0
- package/dist/strategies/backup/index.js +5 -0
- package/dist/strategies/backup/index.js.map +1 -0
- package/dist/strategies/backup/mongodb.d.ts +29 -0
- package/dist/strategies/backup/mongodb.d.ts.map +1 -0
- package/dist/strategies/backup/mongodb.js +80 -0
- package/dist/strategies/backup/mongodb.js.map +1 -0
- package/dist/strategies/backup/mysql.d.ts +53 -0
- package/dist/strategies/backup/mysql.d.ts.map +1 -0
- package/dist/strategies/backup/mysql.js +92 -0
- package/dist/strategies/backup/mysql.js.map +1 -0
- package/dist/strategies/backup/postgresql.d.ts +46 -0
- package/dist/strategies/backup/postgresql.d.ts.map +1 -0
- package/dist/strategies/backup/postgresql.js +116 -0
- package/dist/strategies/backup/postgresql.js.map +1 -0
- package/dist/strategies/delivery/discord.d.ts +29 -0
- package/dist/strategies/delivery/discord.d.ts.map +1 -0
- package/dist/strategies/delivery/discord.js +110 -0
- package/dist/strategies/delivery/discord.js.map +1 -0
- package/dist/strategies/delivery/index.d.ts +5 -0
- package/dist/strategies/delivery/index.d.ts.map +1 -0
- package/dist/strategies/delivery/index.js +4 -0
- package/dist/strategies/delivery/index.js.map +1 -0
- package/dist/strategies/delivery/telegram.d.ts +54 -0
- package/dist/strategies/delivery/telegram.d.ts.map +1 -0
- package/dist/strategies/delivery/telegram.js +120 -0
- package/dist/strategies/delivery/telegram.js.map +1 -0
- package/dist/types.d.ts +61 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +25 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +114 -0
- package/dist/utils.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { basename } from 'node:path';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { generateTempPath, compressFile, getFileSize, removeFile, runCommand, } from '../../utils.js';
|
|
4
|
+
const PostgresConfigSchema = z.object({
|
|
5
|
+
connectionString: z.string().min(1, 'Connection string is required'),
|
|
6
|
+
format: z.enum(['plain', 'custom', 'directory', 'tar']).default('custom'),
|
|
7
|
+
compress: z.boolean().default(true),
|
|
8
|
+
schema: z.string().optional(),
|
|
9
|
+
table: z.string().optional(),
|
|
10
|
+
dataOnly: z.boolean().default(false),
|
|
11
|
+
schemaOnly: z.boolean().default(false),
|
|
12
|
+
clean: z.boolean().default(false),
|
|
13
|
+
additionalArgs: z.array(z.string()).default([]),
|
|
14
|
+
});
|
|
15
|
+
const FORMAT_EXTENSIONS = {
|
|
16
|
+
plain: '.sql',
|
|
17
|
+
custom: '.dump',
|
|
18
|
+
tar: '.tar',
|
|
19
|
+
directory: '',
|
|
20
|
+
};
|
|
21
|
+
export class PostgresBackupStrategy {
|
|
22
|
+
name = 'postgresql';
|
|
23
|
+
configSchema = PostgresConfigSchema;
|
|
24
|
+
async backup(config) {
|
|
25
|
+
const validatedConfig = this.configSchema.parse(config);
|
|
26
|
+
const startTime = Date.now();
|
|
27
|
+
const extension = FORMAT_EXTENSIONS[validatedConfig.format] ?? '.dump';
|
|
28
|
+
const outputPath = generateTempPath('postgres-backup', extension);
|
|
29
|
+
const args = this.buildArgs(validatedConfig, outputPath);
|
|
30
|
+
const env = this.buildEnv(validatedConfig);
|
|
31
|
+
await runCommand({
|
|
32
|
+
command: 'pg_dump',
|
|
33
|
+
args,
|
|
34
|
+
env,
|
|
35
|
+
notFoundMessage: 'pg_dump not found. Please install PostgreSQL client tools.',
|
|
36
|
+
});
|
|
37
|
+
let finalPath = outputPath;
|
|
38
|
+
let compressed = false;
|
|
39
|
+
// Only compress plain SQL format - others have built-in compression
|
|
40
|
+
if (validatedConfig.compress && validatedConfig.format === 'plain') {
|
|
41
|
+
finalPath = await compressFile(outputPath);
|
|
42
|
+
compressed = true;
|
|
43
|
+
}
|
|
44
|
+
const sizeBytes = await getFileSize(finalPath);
|
|
45
|
+
return {
|
|
46
|
+
filePath: finalPath,
|
|
47
|
+
fileName: basename(finalPath),
|
|
48
|
+
sizeBytes,
|
|
49
|
+
database: this.extractDatabaseName(validatedConfig.connectionString),
|
|
50
|
+
createdAt: new Date(),
|
|
51
|
+
compressed,
|
|
52
|
+
metadata: {
|
|
53
|
+
type: 'postgresql',
|
|
54
|
+
format: validatedConfig.format,
|
|
55
|
+
duration: Date.now() - startTime,
|
|
56
|
+
schema: validatedConfig.schema,
|
|
57
|
+
table: validatedConfig.table,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
async cleanup(filePath) {
|
|
62
|
+
await removeFile(filePath);
|
|
63
|
+
}
|
|
64
|
+
buildArgs(config, outputPath) {
|
|
65
|
+
const args = [`--format=${config.format}`, `--file=${outputPath}`];
|
|
66
|
+
if (config.schema) {
|
|
67
|
+
args.push(`--schema=${config.schema}`);
|
|
68
|
+
}
|
|
69
|
+
if (config.table) {
|
|
70
|
+
args.push(`--table=${config.table}`);
|
|
71
|
+
}
|
|
72
|
+
if (config.dataOnly) {
|
|
73
|
+
args.push('--data-only');
|
|
74
|
+
}
|
|
75
|
+
if (config.schemaOnly) {
|
|
76
|
+
args.push('--schema-only');
|
|
77
|
+
}
|
|
78
|
+
if (config.clean) {
|
|
79
|
+
args.push('--clean');
|
|
80
|
+
}
|
|
81
|
+
if (config.format === 'custom') {
|
|
82
|
+
args.push('--compress=9');
|
|
83
|
+
}
|
|
84
|
+
args.push(...config.additionalArgs);
|
|
85
|
+
args.push(config.connectionString);
|
|
86
|
+
return args;
|
|
87
|
+
}
|
|
88
|
+
buildEnv(config) {
|
|
89
|
+
const env = { ...process.env };
|
|
90
|
+
try {
|
|
91
|
+
const url = new URL(config.connectionString);
|
|
92
|
+
if (url.password) {
|
|
93
|
+
env['PGPASSWORD'] = decodeURIComponent(url.password);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Not a URL format, let pg_dump handle it
|
|
98
|
+
}
|
|
99
|
+
return env;
|
|
100
|
+
}
|
|
101
|
+
extractDatabaseName(connectionString) {
|
|
102
|
+
try {
|
|
103
|
+
const url = new URL(connectionString);
|
|
104
|
+
const dbFromPath = url.pathname.slice(1);
|
|
105
|
+
return dbFromPath || 'postgres';
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
const match = /dbname=([^\s]+)/i.exec(connectionString);
|
|
109
|
+
return match?.[1] ?? 'postgres';
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
export function createPostgresBackupStrategy() {
|
|
114
|
+
return new PostgresBackupStrategy();
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=postgresql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresql.js","sourceRoot":"","sources":["../../../src/strategies/backup/postgresql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { BackupResult, DeliveryResult, DeliveryStrategy } from '../../types.js';
|
|
3
|
+
declare const DiscordConfigSchema: z.ZodObject<{
|
|
4
|
+
webhookUrl: z.ZodString;
|
|
5
|
+
username: z.ZodDefault<z.ZodString>;
|
|
6
|
+
avatarUrl: z.ZodOptional<z.ZodString>;
|
|
7
|
+
threadId: z.ZodOptional<z.ZodString>;
|
|
8
|
+
embedColor: z.ZodDefault<z.ZodNumber>;
|
|
9
|
+
includeMetadata: z.ZodDefault<z.ZodBoolean>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
export type DiscordConfig = z.infer<typeof DiscordConfigSchema>;
|
|
12
|
+
export declare class DiscordDeliveryStrategy implements DeliveryStrategy<DiscordConfig> {
|
|
13
|
+
readonly name = "discord";
|
|
14
|
+
readonly configSchema: z.ZodObject<{
|
|
15
|
+
webhookUrl: z.ZodString;
|
|
16
|
+
username: z.ZodDefault<z.ZodString>;
|
|
17
|
+
avatarUrl: z.ZodOptional<z.ZodString>;
|
|
18
|
+
threadId: z.ZodOptional<z.ZodString>;
|
|
19
|
+
embedColor: z.ZodDefault<z.ZodNumber>;
|
|
20
|
+
includeMetadata: z.ZodDefault<z.ZodBoolean>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
readonly maxFileSizeBytes: number;
|
|
23
|
+
deliver(config: DiscordConfig, backup: BackupResult): Promise<DeliveryResult>;
|
|
24
|
+
private buildEmbed;
|
|
25
|
+
private sendFile;
|
|
26
|
+
}
|
|
27
|
+
export declare function createDiscordDeliveryStrategy(): DeliveryStrategy<DiscordConfig>;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=discord.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord.d.ts","sourceRoot":"","sources":["../../../src/strategies/delivery/discord.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAKrF,QAAA,MAAM,mBAAmB;;;;;;;iBAOvB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAUhE,qBAAa,uBAAwB,YAAW,gBAAgB,CAAC,aAAa,CAAC;IAC7E,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,YAAY;;;;;;;sBAAuB;IAC5C,QAAQ,CAAC,gBAAgB,SAAyB;IAE5C,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;IAgDnF,OAAO,CAAC,UAAU;YAuCJ,QAAQ;CAkCvB;AAED,wBAAgB,6BAA6B,IAAI,gBAAgB,CAAC,aAAa,CAAC,CAE/E"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { formatBytes, formatDuration, splitFile, removeFile, readFileAsBlob, BackupError } from '../../utils.js';
|
|
3
|
+
const DISCORD_MAX_FILE_SIZE = 25 * 1024 * 1024; // 25MB
|
|
4
|
+
const DiscordConfigSchema = z.object({
|
|
5
|
+
webhookUrl: z.string().url('Invalid Discord webhook URL'),
|
|
6
|
+
username: z.string().default('Backup Bot'),
|
|
7
|
+
avatarUrl: z.string().url().optional(),
|
|
8
|
+
threadId: z.string().optional(),
|
|
9
|
+
embedColor: z.number().default(0x5865f2),
|
|
10
|
+
includeMetadata: z.boolean().default(true),
|
|
11
|
+
});
|
|
12
|
+
export class DiscordDeliveryStrategy {
|
|
13
|
+
name = 'discord';
|
|
14
|
+
configSchema = DiscordConfigSchema;
|
|
15
|
+
maxFileSizeBytes = DISCORD_MAX_FILE_SIZE;
|
|
16
|
+
async deliver(config, backup) {
|
|
17
|
+
const validatedConfig = this.configSchema.parse(config);
|
|
18
|
+
try {
|
|
19
|
+
const chunks = await splitFile(backup.filePath, this.maxFileSizeBytes);
|
|
20
|
+
const isMultiPart = chunks.length > 1;
|
|
21
|
+
let messageId;
|
|
22
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
23
|
+
const chunkPath = chunks[i];
|
|
24
|
+
if (!chunkPath)
|
|
25
|
+
continue;
|
|
26
|
+
const embedOptions = isMultiPart
|
|
27
|
+
? { partNumber: i + 1, totalParts: chunks.length }
|
|
28
|
+
: {};
|
|
29
|
+
const embed = this.buildEmbed(validatedConfig, backup, embedOptions);
|
|
30
|
+
const response = await this.sendFile(validatedConfig, chunkPath, embed);
|
|
31
|
+
if (i === 0) {
|
|
32
|
+
messageId = response.id;
|
|
33
|
+
}
|
|
34
|
+
if (isMultiPart) {
|
|
35
|
+
await removeFile(chunkPath);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const result = {
|
|
39
|
+
success: true,
|
|
40
|
+
platform: 'discord',
|
|
41
|
+
deliveredAt: new Date(),
|
|
42
|
+
};
|
|
43
|
+
if (messageId !== undefined) {
|
|
44
|
+
return { ...result, messageId };
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
return {
|
|
50
|
+
success: false,
|
|
51
|
+
platform: 'discord',
|
|
52
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
53
|
+
deliveredAt: new Date(),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
buildEmbed(config, backup, options) {
|
|
58
|
+
const fields = [];
|
|
59
|
+
if (config.includeMetadata) {
|
|
60
|
+
fields.push({ name: 'Database', value: backup.database, inline: true }, { name: 'Size', value: formatBytes(backup.sizeBytes), inline: true }, { name: 'Compressed', value: backup.compressed ? 'Yes' : 'No', inline: true });
|
|
61
|
+
const duration = backup.metadata['duration'];
|
|
62
|
+
if (typeof duration === 'number') {
|
|
63
|
+
fields.push({ name: 'Duration', value: formatDuration(duration), inline: true });
|
|
64
|
+
}
|
|
65
|
+
const dbType = backup.metadata['type'];
|
|
66
|
+
if (typeof dbType === 'string') {
|
|
67
|
+
fields.push({ name: 'Type', value: dbType.toUpperCase(), inline: true });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
let title = `Database Backup: ${backup.database}`;
|
|
71
|
+
if (options.partNumber !== undefined && options.totalParts !== undefined) {
|
|
72
|
+
title += ` (Part ${options.partNumber}/${options.totalParts})`;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
title,
|
|
76
|
+
color: config.embedColor,
|
|
77
|
+
fields,
|
|
78
|
+
timestamp: backup.createdAt.toISOString(),
|
|
79
|
+
footer: { text: 'wbackup' },
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async sendFile(config, filePath, embed) {
|
|
83
|
+
const url = new URL(config.webhookUrl);
|
|
84
|
+
url.searchParams.set('wait', 'true');
|
|
85
|
+
if (config.threadId) {
|
|
86
|
+
url.searchParams.set('thread_id', config.threadId);
|
|
87
|
+
}
|
|
88
|
+
const { blob, fileName } = await readFileAsBlob(filePath);
|
|
89
|
+
const formData = new FormData();
|
|
90
|
+
const payload = {
|
|
91
|
+
username: config.username,
|
|
92
|
+
embeds: [embed],
|
|
93
|
+
};
|
|
94
|
+
if (config.avatarUrl) {
|
|
95
|
+
payload['avatar_url'] = config.avatarUrl;
|
|
96
|
+
}
|
|
97
|
+
formData.append('payload_json', JSON.stringify(payload));
|
|
98
|
+
formData.append('file', blob, fileName);
|
|
99
|
+
const response = await fetch(url.toString(), { method: 'POST', body: formData });
|
|
100
|
+
if (!response.ok) {
|
|
101
|
+
const errorBody = await response.text();
|
|
102
|
+
throw new BackupError(`Discord API error (${response.status}): ${errorBody}`, 'delivery');
|
|
103
|
+
}
|
|
104
|
+
return response.json();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export function createDiscordDeliveryStrategy() {
|
|
108
|
+
return new DiscordDeliveryStrategy();
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=discord.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord.js","sourceRoot":"","sources":["../../../src/strategies/delivery/discord.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { DiscordDeliveryStrategy, createDiscordDeliveryStrategy } from './discord.js';
|
|
2
|
+
export type { DiscordConfig } from './discord.js';
|
|
3
|
+
export { TelegramDeliveryStrategy, createTelegramDeliveryStrategy } from './telegram.js';
|
|
4
|
+
export type { TelegramConfig } from './telegram.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/strategies/delivery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AACtF,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAC;AACzF,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/strategies/delivery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAGtF,8CAA8C;AAC9C,OAAO,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram Delivery Strategy
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { registerDeliveryStrategy, createTelegramDeliveryStrategy } from 'wbackup';
|
|
7
|
+
*
|
|
8
|
+
* registerDeliveryStrategy('telegram', createTelegramDeliveryStrategy);
|
|
9
|
+
*
|
|
10
|
+
* const manager = new BackupManager()
|
|
11
|
+
* .database('mongodb', { connectionString: '...' })
|
|
12
|
+
* .delivery('telegram', {
|
|
13
|
+
* botToken: 'your-bot-token',
|
|
14
|
+
* chatId: 'your-chat-id',
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* await manager.run();
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
import { z } from 'zod';
|
|
21
|
+
import type { BackupResult, DeliveryResult, DeliveryStrategy } from '../../types.js';
|
|
22
|
+
declare const TelegramConfigSchema: z.ZodObject<{
|
|
23
|
+
botToken: z.ZodString;
|
|
24
|
+
chatId: z.ZodString;
|
|
25
|
+
parseMode: z.ZodDefault<z.ZodEnum<{
|
|
26
|
+
HTML: "HTML";
|
|
27
|
+
Markdown: "Markdown";
|
|
28
|
+
MarkdownV2: "MarkdownV2";
|
|
29
|
+
}>>;
|
|
30
|
+
disableNotification: z.ZodDefault<z.ZodBoolean>;
|
|
31
|
+
protectContent: z.ZodDefault<z.ZodBoolean>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
export type TelegramConfig = z.infer<typeof TelegramConfigSchema>;
|
|
34
|
+
export declare class TelegramDeliveryStrategy implements DeliveryStrategy<TelegramConfig> {
|
|
35
|
+
readonly name = "telegram";
|
|
36
|
+
readonly configSchema: z.ZodObject<{
|
|
37
|
+
botToken: z.ZodString;
|
|
38
|
+
chatId: z.ZodString;
|
|
39
|
+
parseMode: z.ZodDefault<z.ZodEnum<{
|
|
40
|
+
HTML: "HTML";
|
|
41
|
+
Markdown: "Markdown";
|
|
42
|
+
MarkdownV2: "MarkdownV2";
|
|
43
|
+
}>>;
|
|
44
|
+
disableNotification: z.ZodDefault<z.ZodBoolean>;
|
|
45
|
+
protectContent: z.ZodDefault<z.ZodBoolean>;
|
|
46
|
+
}, z.core.$strip>;
|
|
47
|
+
readonly maxFileSizeBytes: number;
|
|
48
|
+
deliver(config: TelegramConfig, backup: BackupResult): Promise<DeliveryResult>;
|
|
49
|
+
private buildCaption;
|
|
50
|
+
private sendDocument;
|
|
51
|
+
}
|
|
52
|
+
export declare function createTelegramDeliveryStrategy(): DeliveryStrategy<TelegramConfig>;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=telegram.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../../src/strategies/delivery/telegram.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAKrF,QAAA,MAAM,oBAAoB;;;;;;;;;;iBAMxB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,qBAAa,wBAAyB,YAAW,gBAAgB,CAAC,cAAc,CAAC;IAC/E,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,YAAY;;;;;;;;;;sBAAwB;IAC7C,QAAQ,CAAC,gBAAgB,SAA0B;IAE7C,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;IAgDpF,OAAO,CAAC,YAAY;YA8BN,YAAY;CA+B3B;AAED,wBAAgB,8BAA8B,IAAI,gBAAgB,CAAC,cAAc,CAAC,CAEjF"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram Delivery Strategy
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { registerDeliveryStrategy, createTelegramDeliveryStrategy } from 'wbackup';
|
|
7
|
+
*
|
|
8
|
+
* registerDeliveryStrategy('telegram', createTelegramDeliveryStrategy);
|
|
9
|
+
*
|
|
10
|
+
* const manager = new BackupManager()
|
|
11
|
+
* .database('mongodb', { connectionString: '...' })
|
|
12
|
+
* .delivery('telegram', {
|
|
13
|
+
* botToken: 'your-bot-token',
|
|
14
|
+
* chatId: 'your-chat-id',
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* await manager.run();
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
import { z } from 'zod';
|
|
21
|
+
import { formatBytes, formatDuration, splitFile, removeFile, readFileAsBlob, BackupError } from '../../utils.js';
|
|
22
|
+
const TELEGRAM_MAX_FILE_SIZE = 50 * 1024 * 1024; // 50MB
|
|
23
|
+
const TelegramConfigSchema = z.object({
|
|
24
|
+
botToken: z.string().min(1, 'Bot token is required'),
|
|
25
|
+
chatId: z.string().min(1, 'Chat ID is required'),
|
|
26
|
+
parseMode: z.enum(['HTML', 'Markdown', 'MarkdownV2']).default('HTML'),
|
|
27
|
+
disableNotification: z.boolean().default(false),
|
|
28
|
+
protectContent: z.boolean().default(false),
|
|
29
|
+
});
|
|
30
|
+
export class TelegramDeliveryStrategy {
|
|
31
|
+
name = 'telegram';
|
|
32
|
+
configSchema = TelegramConfigSchema;
|
|
33
|
+
maxFileSizeBytes = TELEGRAM_MAX_FILE_SIZE;
|
|
34
|
+
async deliver(config, backup) {
|
|
35
|
+
const validatedConfig = this.configSchema.parse(config);
|
|
36
|
+
try {
|
|
37
|
+
const chunks = await splitFile(backup.filePath, this.maxFileSizeBytes);
|
|
38
|
+
const isMultiPart = chunks.length > 1;
|
|
39
|
+
let messageId;
|
|
40
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
41
|
+
const chunkPath = chunks[i];
|
|
42
|
+
if (!chunkPath)
|
|
43
|
+
continue;
|
|
44
|
+
const captionOptions = isMultiPart
|
|
45
|
+
? { partNumber: i + 1, totalParts: chunks.length }
|
|
46
|
+
: {};
|
|
47
|
+
const caption = this.buildCaption(backup, captionOptions);
|
|
48
|
+
const response = await this.sendDocument(validatedConfig, chunkPath, caption);
|
|
49
|
+
if (i === 0) {
|
|
50
|
+
messageId = response.result.message_id.toString();
|
|
51
|
+
}
|
|
52
|
+
if (isMultiPart) {
|
|
53
|
+
await removeFile(chunkPath);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const result = {
|
|
57
|
+
success: true,
|
|
58
|
+
platform: 'telegram',
|
|
59
|
+
deliveredAt: new Date(),
|
|
60
|
+
};
|
|
61
|
+
if (messageId !== undefined) {
|
|
62
|
+
return { ...result, messageId };
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return {
|
|
68
|
+
success: false,
|
|
69
|
+
platform: 'telegram',
|
|
70
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
71
|
+
deliveredAt: new Date(),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
buildCaption(backup, options) {
|
|
76
|
+
const parts = [];
|
|
77
|
+
let title = `<b>Database Backup: ${backup.database}</b>`;
|
|
78
|
+
if (options.partNumber !== undefined && options.totalParts !== undefined) {
|
|
79
|
+
title += ` (Part ${options.partNumber}/${options.totalParts})`;
|
|
80
|
+
}
|
|
81
|
+
parts.push(title, '');
|
|
82
|
+
parts.push(`<b>Size:</b> ${formatBytes(backup.sizeBytes)}`);
|
|
83
|
+
parts.push(`<b>Compressed:</b> ${backup.compressed ? 'Yes' : 'No'}`);
|
|
84
|
+
const duration = backup.metadata['duration'];
|
|
85
|
+
if (typeof duration === 'number') {
|
|
86
|
+
parts.push(`<b>Duration:</b> ${formatDuration(duration)}`);
|
|
87
|
+
}
|
|
88
|
+
const dbType = backup.metadata['type'];
|
|
89
|
+
if (typeof dbType === 'string') {
|
|
90
|
+
parts.push(`<b>Type:</b> ${dbType.toUpperCase()}`);
|
|
91
|
+
}
|
|
92
|
+
parts.push('', `<i>${backup.createdAt.toISOString()}</i>`);
|
|
93
|
+
return parts.join('\n');
|
|
94
|
+
}
|
|
95
|
+
async sendDocument(config, filePath, caption) {
|
|
96
|
+
const url = `https://api.telegram.org/bot${config.botToken}/sendDocument`;
|
|
97
|
+
const { blob, fileName } = await readFileAsBlob(filePath);
|
|
98
|
+
const formData = new FormData();
|
|
99
|
+
formData.append('chat_id', config.chatId);
|
|
100
|
+
formData.append('caption', caption);
|
|
101
|
+
formData.append('parse_mode', config.parseMode);
|
|
102
|
+
formData.append('document', blob, fileName);
|
|
103
|
+
if (config.disableNotification) {
|
|
104
|
+
formData.append('disable_notification', 'true');
|
|
105
|
+
}
|
|
106
|
+
if (config.protectContent) {
|
|
107
|
+
formData.append('protect_content', 'true');
|
|
108
|
+
}
|
|
109
|
+
const response = await fetch(url, { method: 'POST', body: formData });
|
|
110
|
+
if (!response.ok) {
|
|
111
|
+
const errorBody = await response.text();
|
|
112
|
+
throw new BackupError(`Telegram API error (${response.status}): ${errorBody}`, 'delivery');
|
|
113
|
+
}
|
|
114
|
+
return response.json();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export function createTelegramDeliveryStrategy() {
|
|
118
|
+
return new TelegramDeliveryStrategy();
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=telegram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../src/strategies/delivery/telegram.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export interface BackupResult {
|
|
3
|
+
readonly filePath: string;
|
|
4
|
+
readonly fileName: string;
|
|
5
|
+
readonly sizeBytes: number;
|
|
6
|
+
readonly database: string;
|
|
7
|
+
readonly createdAt: Date;
|
|
8
|
+
readonly compressed: boolean;
|
|
9
|
+
readonly metadata: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export interface DeliveryResult {
|
|
12
|
+
readonly success: boolean;
|
|
13
|
+
readonly platform: string;
|
|
14
|
+
readonly messageId?: string;
|
|
15
|
+
readonly error?: string;
|
|
16
|
+
readonly deliveredAt: Date;
|
|
17
|
+
}
|
|
18
|
+
export interface BackupMetadata {
|
|
19
|
+
readonly database: string;
|
|
20
|
+
readonly host: string;
|
|
21
|
+
readonly timestamp: Date;
|
|
22
|
+
readonly sizeBytes: number;
|
|
23
|
+
readonly compressed: boolean;
|
|
24
|
+
readonly duration: number;
|
|
25
|
+
}
|
|
26
|
+
export interface BackupStrategy<TConfig = unknown> {
|
|
27
|
+
readonly name: string;
|
|
28
|
+
readonly configSchema: z.ZodType<TConfig>;
|
|
29
|
+
backup(config: TConfig): Promise<BackupResult>;
|
|
30
|
+
cleanup(filePath: string): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
export interface DeliveryStrategy<TConfig = unknown> {
|
|
33
|
+
readonly name: string;
|
|
34
|
+
readonly configSchema: z.ZodType<TConfig>;
|
|
35
|
+
readonly maxFileSizeBytes: number;
|
|
36
|
+
deliver(config: TConfig, backup: BackupResult): Promise<DeliveryResult>;
|
|
37
|
+
}
|
|
38
|
+
export type BackupStrategyFactory<TConfig = unknown> = () => BackupStrategy<TConfig>;
|
|
39
|
+
export type DeliveryStrategyFactory<TConfig = unknown> = () => DeliveryStrategy<TConfig>;
|
|
40
|
+
export interface BackupManagerConfig {
|
|
41
|
+
database: {
|
|
42
|
+
type: string;
|
|
43
|
+
config: unknown;
|
|
44
|
+
};
|
|
45
|
+
delivery: {
|
|
46
|
+
type: string;
|
|
47
|
+
config: unknown;
|
|
48
|
+
};
|
|
49
|
+
compress: boolean;
|
|
50
|
+
retainBackup: boolean;
|
|
51
|
+
tempDir?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface BackupManagerResult {
|
|
54
|
+
readonly backup: BackupResult;
|
|
55
|
+
readonly delivery: DeliveryResult;
|
|
56
|
+
readonly totalDuration: number;
|
|
57
|
+
}
|
|
58
|
+
export type OnSuccessCallback = (result: BackupManagerResult) => void | Promise<void>;
|
|
59
|
+
export type OnErrorCallback = (error: Error, phase: 'backup' | 'delivery' | 'cleanup') => void | Promise<void>;
|
|
60
|
+
export type OnProgressCallback = (phase: string, message: string) => void;
|
|
61
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare class BackupError extends Error {
|
|
2
|
+
readonly phase: 'backup' | 'delivery' | 'cleanup';
|
|
3
|
+
readonly cause?: unknown | undefined;
|
|
4
|
+
constructor(message: string, phase: 'backup' | 'delivery' | 'cleanup', cause?: unknown | undefined);
|
|
5
|
+
}
|
|
6
|
+
export declare function ensureDir(dir: string): Promise<void>;
|
|
7
|
+
export declare function removeFile(filePath: string): Promise<void>;
|
|
8
|
+
export declare function getFileSize(filePath: string): Promise<number>;
|
|
9
|
+
export declare function compressFile(inputPath: string): Promise<string>;
|
|
10
|
+
export declare function generateTempPath(prefix: string, extension: string): string;
|
|
11
|
+
export declare function formatBytes(bytes: number): string;
|
|
12
|
+
export declare function formatDuration(ms: number): string;
|
|
13
|
+
export declare function splitFile(filePath: string, maxSizeBytes: number): Promise<string[]>;
|
|
14
|
+
export interface RunCommandOptions {
|
|
15
|
+
command: string;
|
|
16
|
+
args: string[];
|
|
17
|
+
env?: NodeJS.ProcessEnv;
|
|
18
|
+
notFoundMessage: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function runCommand(options: RunCommandOptions): Promise<void>;
|
|
21
|
+
export declare function readFileAsBlob(filePath: string): Promise<{
|
|
22
|
+
blob: Blob;
|
|
23
|
+
fileName: string;
|
|
24
|
+
}>;
|
|
25
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AASA,qBAAa,WAAY,SAAQ,KAAK;aAGlB,KAAK,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS;aACxC,KAAK,CAAC,EAAE,OAAO;gBAF/B,OAAO,EAAE,MAAM,EACC,KAAK,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,EACxC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKlC;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhE;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnE;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUrE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAI1E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsBzF;AAGD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BpE;AAGD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAIhG"}
|