@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
package/dist/utils.js
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { createReadStream, createWriteStream } from 'node:fs';
|
|
2
|
+
import { mkdir, rm, stat, readFile } from 'node:fs/promises';
|
|
3
|
+
import { createGzip } from 'node:zlib';
|
|
4
|
+
import { pipeline } from 'node:stream/promises';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { join, basename } from 'node:path';
|
|
7
|
+
import { randomBytes } from 'node:crypto';
|
|
8
|
+
import { spawn } from 'node:child_process';
|
|
9
|
+
export class BackupError extends Error {
|
|
10
|
+
phase;
|
|
11
|
+
cause;
|
|
12
|
+
constructor(message, phase, cause) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.phase = phase;
|
|
15
|
+
this.cause = cause;
|
|
16
|
+
this.name = 'BackupError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export async function ensureDir(dir) {
|
|
20
|
+
await mkdir(dir, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
export async function removeFile(filePath) {
|
|
23
|
+
await rm(filePath, { force: true }).catch(() => { });
|
|
24
|
+
}
|
|
25
|
+
export async function getFileSize(filePath) {
|
|
26
|
+
const stats = await stat(filePath);
|
|
27
|
+
return stats.size;
|
|
28
|
+
}
|
|
29
|
+
export async function compressFile(inputPath) {
|
|
30
|
+
const outputPath = `${inputPath}.gz`;
|
|
31
|
+
const gzip = createGzip({ level: 9 });
|
|
32
|
+
const source = createReadStream(inputPath);
|
|
33
|
+
const destination = createWriteStream(outputPath);
|
|
34
|
+
await pipeline(source, gzip, destination);
|
|
35
|
+
await removeFile(inputPath);
|
|
36
|
+
return outputPath;
|
|
37
|
+
}
|
|
38
|
+
export function generateTempPath(prefix, extension) {
|
|
39
|
+
const id = randomBytes(8).toString('hex');
|
|
40
|
+
const timestamp = Date.now();
|
|
41
|
+
return join(tmpdir(), `${prefix}-${timestamp}-${id}${extension}`);
|
|
42
|
+
}
|
|
43
|
+
export function formatBytes(bytes) {
|
|
44
|
+
if (bytes === 0)
|
|
45
|
+
return '0 B';
|
|
46
|
+
const k = 1024;
|
|
47
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
48
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
49
|
+
const size = sizes[i];
|
|
50
|
+
if (!size)
|
|
51
|
+
return `${bytes} B`;
|
|
52
|
+
return `${(bytes / Math.pow(k, i)).toFixed(2)} ${size}`;
|
|
53
|
+
}
|
|
54
|
+
export function formatDuration(ms) {
|
|
55
|
+
if (ms < 1000)
|
|
56
|
+
return `${ms}ms`;
|
|
57
|
+
if (ms < 60000)
|
|
58
|
+
return `${(ms / 1000).toFixed(2)}s`;
|
|
59
|
+
return `${(ms / 60000).toFixed(2)}m`;
|
|
60
|
+
}
|
|
61
|
+
export async function splitFile(filePath, maxSizeBytes) {
|
|
62
|
+
const fileSize = await getFileSize(filePath);
|
|
63
|
+
if (fileSize <= maxSizeBytes) {
|
|
64
|
+
return [filePath];
|
|
65
|
+
}
|
|
66
|
+
const chunks = [];
|
|
67
|
+
const numChunks = Math.ceil(fileSize / maxSizeBytes);
|
|
68
|
+
const { writeFile } = await import('node:fs/promises');
|
|
69
|
+
const buffer = await readFile(filePath);
|
|
70
|
+
for (let i = 0; i < numChunks; i++) {
|
|
71
|
+
const start = i * maxSizeBytes;
|
|
72
|
+
const end = Math.min(start + maxSizeBytes, fileSize);
|
|
73
|
+
const chunk = buffer.subarray(start, end);
|
|
74
|
+
const chunkPath = `${filePath}.part${i + 1}`;
|
|
75
|
+
await writeFile(chunkPath, chunk);
|
|
76
|
+
chunks.push(chunkPath);
|
|
77
|
+
}
|
|
78
|
+
return chunks;
|
|
79
|
+
}
|
|
80
|
+
export function runCommand(options) {
|
|
81
|
+
return new Promise((resolve, reject) => {
|
|
82
|
+
const child = spawn(options.command, options.args, {
|
|
83
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
84
|
+
env: options.env ?? process.env,
|
|
85
|
+
});
|
|
86
|
+
let stderr = '';
|
|
87
|
+
child.stderr.on('data', (data) => {
|
|
88
|
+
stderr += data.toString();
|
|
89
|
+
});
|
|
90
|
+
child.on('error', (error) => {
|
|
91
|
+
if (error.code === 'ENOENT') {
|
|
92
|
+
reject(new BackupError(options.notFoundMessage, 'backup', error));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
reject(new BackupError(`Failed to spawn ${options.command}: ${error.message}`, 'backup', error));
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
child.on('close', (code) => {
|
|
99
|
+
if (code === 0) {
|
|
100
|
+
resolve();
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
reject(new BackupError(`${options.command} exited with code ${code}: ${stderr}`, 'backup'));
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// Shared utility for reading a file as a Blob (used by delivery strategies)
|
|
109
|
+
export async function readFileAsBlob(filePath) {
|
|
110
|
+
const fileBuffer = await readFile(filePath);
|
|
111
|
+
const fileName = basename(filePath);
|
|
112
|
+
return { blob: new Blob([fileBuffer]), fileName };
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@byigitt/wbackup",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Database backup package with webhook delivery support",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"typecheck": "tsc --noEmit",
|
|
20
|
+
"prepublishOnly": "pnpm run build"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"backup",
|
|
24
|
+
"database",
|
|
25
|
+
"mongodb",
|
|
26
|
+
"postgresql",
|
|
27
|
+
"mysql",
|
|
28
|
+
"discord",
|
|
29
|
+
"telegram",
|
|
30
|
+
"webhook",
|
|
31
|
+
"dump",
|
|
32
|
+
"mongodump",
|
|
33
|
+
"pg_dump"
|
|
34
|
+
],
|
|
35
|
+
"author": "byigitt",
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "git+https://github.com/byigitt/wbackup.git"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/byigitt/wbackup#readme",
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/byigitt/wbackup/issues"
|
|
44
|
+
},
|
|
45
|
+
"packageManager": "pnpm@10.11.0",
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=18.0.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^25.0.3",
|
|
51
|
+
"typescript": "^5.9.3"
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"zod": "^4.3.5"
|
|
55
|
+
}
|
|
56
|
+
}
|