@muhgholy/next-drive 4.23.1 → 4.23.2
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/README.md +14 -0
- package/dist/{chunk-MZFX6M44.js → chunk-R43JCXQB.js} +85 -10
- package/dist/chunk-R43JCXQB.js.map +1 -0
- package/dist/{chunk-BGCV4Y2V.cjs → chunk-RBLDH7CP.cjs} +86 -10
- package/dist/chunk-RBLDH7CP.cjs.map +1 -0
- package/dist/server/controllers/drive.d.ts +16 -0
- package/dist/server/controllers/drive.d.ts.map +1 -1
- package/dist/server/express.cjs +11 -11
- package/dist/server/express.js +2 -2
- package/dist/server/hono.cjs +11 -11
- package/dist/server/hono.js +2 -2
- package/dist/server/index.cjs +19 -15
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-BGCV4Y2V.cjs.map +0 -1
- package/dist/chunk-MZFX6M44.js.map +0 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var formidable = require('formidable');
|
|
4
4
|
var path = require('path');
|
|
5
5
|
var fs = require('fs');
|
|
6
|
-
var
|
|
6
|
+
var os2 = require('os');
|
|
7
7
|
var crypto2 = require('crypto');
|
|
8
8
|
var mongoose = require('mongoose');
|
|
9
9
|
var sharp2 = require('sharp');
|
|
@@ -16,7 +16,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
16
16
|
var formidable__default = /*#__PURE__*/_interopDefault(formidable);
|
|
17
17
|
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
18
18
|
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
19
|
-
var
|
|
19
|
+
var os2__default = /*#__PURE__*/_interopDefault(os2);
|
|
20
20
|
var crypto2__default = /*#__PURE__*/_interopDefault(crypto2);
|
|
21
21
|
var mongoose__default = /*#__PURE__*/_interopDefault(mongoose);
|
|
22
22
|
var sharp2__default = /*#__PURE__*/_interopDefault(sharp2);
|
|
@@ -273,7 +273,7 @@ var driveConfiguration = async (config) => {
|
|
|
273
273
|
if (g.migrationPromise) await g.migrationPromise;
|
|
274
274
|
return g.config;
|
|
275
275
|
}
|
|
276
|
-
const resolvedPath = config.storage?.path || path__default.default.join(
|
|
276
|
+
const resolvedPath = config.storage?.path || path__default.default.join(os2__default.default.tmpdir(), "next-drive-data");
|
|
277
277
|
const mode = config.mode || "NORMAL";
|
|
278
278
|
if (mode === "ROOT") {
|
|
279
279
|
g.config = {
|
|
@@ -1607,7 +1607,7 @@ var driveUpload = async (source, key, options) => {
|
|
|
1607
1607
|
const stats = fs__default.default.statSync(source);
|
|
1608
1608
|
fileSize = stats.size;
|
|
1609
1609
|
} else if (Buffer.isBuffer(source)) {
|
|
1610
|
-
const tempDir = path__default.default.join(
|
|
1610
|
+
const tempDir = path__default.default.join(os2__default.default.tmpdir(), "next-drive-uploads");
|
|
1611
1611
|
if (!fs__default.default.existsSync(tempDir)) {
|
|
1612
1612
|
fs__default.default.mkdirSync(tempDir, { recursive: true });
|
|
1613
1613
|
}
|
|
@@ -1616,7 +1616,7 @@ var driveUpload = async (source, key, options) => {
|
|
|
1616
1616
|
sourceFilePath = tempFilePath;
|
|
1617
1617
|
fileSize = source.length;
|
|
1618
1618
|
} else {
|
|
1619
|
-
const tempDir = path__default.default.join(
|
|
1619
|
+
const tempDir = path__default.default.join(os2__default.default.tmpdir(), "next-drive-uploads");
|
|
1620
1620
|
if (!fs__default.default.existsSync(tempDir)) {
|
|
1621
1621
|
fs__default.default.mkdirSync(tempDir, { recursive: true });
|
|
1622
1622
|
}
|
|
@@ -1716,6 +1716,81 @@ var driveUpload = async (source, key, options) => {
|
|
|
1716
1716
|
}
|
|
1717
1717
|
}
|
|
1718
1718
|
};
|
|
1719
|
+
var driveCleanup = async () => {
|
|
1720
|
+
const config = getDriveConfig();
|
|
1721
|
+
const fileDir = path__default.default.join(config.storage.path, "file");
|
|
1722
|
+
if (!fs__default.default.existsSync(fileDir)) {
|
|
1723
|
+
return { removed: [], totalFreedInBytes: 0 };
|
|
1724
|
+
}
|
|
1725
|
+
const folderNames = fs__default.default.readdirSync(fileDir).filter((name) => {
|
|
1726
|
+
const fullPath = path__default.default.join(fileDir, name);
|
|
1727
|
+
return fs__default.default.statSync(fullPath).isDirectory();
|
|
1728
|
+
});
|
|
1729
|
+
if (folderNames.length === 0) {
|
|
1730
|
+
return { removed: [], totalFreedInBytes: 0 };
|
|
1731
|
+
}
|
|
1732
|
+
const getDirSize = (dirPath) => {
|
|
1733
|
+
let size = 0;
|
|
1734
|
+
try {
|
|
1735
|
+
const entries = fs__default.default.readdirSync(dirPath, { withFileTypes: true });
|
|
1736
|
+
for (const entry of entries) {
|
|
1737
|
+
const entryPath = path__default.default.join(dirPath, entry.name);
|
|
1738
|
+
if (entry.isFile()) {
|
|
1739
|
+
size += fs__default.default.statSync(entryPath).size;
|
|
1740
|
+
} else if (entry.isDirectory()) {
|
|
1741
|
+
size += getDirSize(entryPath);
|
|
1742
|
+
}
|
|
1743
|
+
}
|
|
1744
|
+
} catch {
|
|
1745
|
+
}
|
|
1746
|
+
return size;
|
|
1747
|
+
};
|
|
1748
|
+
const BATCH_SIZE = 500;
|
|
1749
|
+
const existingIds = /* @__PURE__ */ new Set();
|
|
1750
|
+
for (let i = 0; i < folderNames.length; i += BATCH_SIZE) {
|
|
1751
|
+
const batch = folderNames.slice(i, i + BATCH_SIZE);
|
|
1752
|
+
const docs = await drive_default.find(
|
|
1753
|
+
{ _id: { $in: batch } },
|
|
1754
|
+
{ _id: 1 }
|
|
1755
|
+
).lean();
|
|
1756
|
+
for (const doc of docs) {
|
|
1757
|
+
existingIds.add(doc._id.toString());
|
|
1758
|
+
}
|
|
1759
|
+
}
|
|
1760
|
+
const removed = [];
|
|
1761
|
+
let totalFreedInBytes = 0;
|
|
1762
|
+
for (const name of folderNames) {
|
|
1763
|
+
if (!existingIds.has(name)) {
|
|
1764
|
+
const dirPath = path__default.default.join(fileDir, name);
|
|
1765
|
+
try {
|
|
1766
|
+
totalFreedInBytes += getDirSize(dirPath);
|
|
1767
|
+
fs__default.default.rmSync(dirPath, { recursive: true, force: true });
|
|
1768
|
+
removed.push(name);
|
|
1769
|
+
} catch (e) {
|
|
1770
|
+
console.error(`[next-drive] Failed to remove orphaned folder ${name}:`, e);
|
|
1771
|
+
}
|
|
1772
|
+
}
|
|
1773
|
+
}
|
|
1774
|
+
const tempDir = path__default.default.join(config.storage.path, "temp");
|
|
1775
|
+
if (fs__default.default.existsSync(tempDir)) {
|
|
1776
|
+
try {
|
|
1777
|
+
totalFreedInBytes += getDirSize(tempDir);
|
|
1778
|
+
fs__default.default.rmSync(tempDir, { recursive: true, force: true });
|
|
1779
|
+
} catch (e) {
|
|
1780
|
+
console.error("[next-drive] Failed to remove temp directory:", e);
|
|
1781
|
+
}
|
|
1782
|
+
}
|
|
1783
|
+
const systemTmpDir = path__default.default.join(os2__default.default.tmpdir(), "next-drive-uploads");
|
|
1784
|
+
if (fs__default.default.existsSync(systemTmpDir)) {
|
|
1785
|
+
try {
|
|
1786
|
+
totalFreedInBytes += getDirSize(systemTmpDir);
|
|
1787
|
+
fs__default.default.rmSync(systemTmpDir, { recursive: true, force: true });
|
|
1788
|
+
} catch (e) {
|
|
1789
|
+
console.error("[next-drive] Failed to remove system temp directory:", e);
|
|
1790
|
+
}
|
|
1791
|
+
}
|
|
1792
|
+
return { removed, totalFreedInBytes };
|
|
1793
|
+
};
|
|
1719
1794
|
|
|
1720
1795
|
// src/server/index.ts
|
|
1721
1796
|
var getProvider = async (req, owner) => {
|
|
@@ -2133,7 +2208,7 @@ var driveAPIHandler = async (req, res) => {
|
|
|
2133
2208
|
// ** 3. UPLOAD **
|
|
2134
2209
|
case "upload": {
|
|
2135
2210
|
if (req.method !== "POST") return res.status(405).json({ status: 405, message: "Only POST allowed" });
|
|
2136
|
-
const systemTmpDir = path__default.default.join(
|
|
2211
|
+
const systemTmpDir = path__default.default.join(os2__default.default.tmpdir(), "next-drive-uploads");
|
|
2137
2212
|
if (!fs__default.default.existsSync(systemTmpDir)) fs__default.default.mkdirSync(systemTmpDir, { recursive: true });
|
|
2138
2213
|
const form = formidable__default.default({
|
|
2139
2214
|
multiples: false,
|
|
@@ -2169,7 +2244,7 @@ var driveAPIHandler = async (req, res) => {
|
|
|
2169
2244
|
}
|
|
2170
2245
|
const { chunkIndex, totalChunks, driveId, fileName, fileSize: fileSizeInBytes, fileType, folderId } = uploadData.data;
|
|
2171
2246
|
let currentUploadId = driveId;
|
|
2172
|
-
const tempBaseDir = path__default.default.join(
|
|
2247
|
+
const tempBaseDir = path__default.default.join(os2__default.default.tmpdir(), "next-drive-uploads");
|
|
2173
2248
|
if (!currentUploadId) {
|
|
2174
2249
|
if (chunkIndex !== 0) return res.status(400).json({ message: "Missing upload ID for non-zero chunk" });
|
|
2175
2250
|
if (fileType && config.security) {
|
|
@@ -2317,7 +2392,7 @@ var driveAPIHandler = async (req, res) => {
|
|
|
2317
2392
|
const cancelData = cancelQuerySchema.safeParse(req.query);
|
|
2318
2393
|
if (!cancelData.success) return res.status(400).json({ status: 400, message: "Invalid ID" });
|
|
2319
2394
|
const { id } = cancelData.data;
|
|
2320
|
-
const tempUploadDir = path__default.default.join(
|
|
2395
|
+
const tempUploadDir = path__default.default.join(os2__default.default.tmpdir(), "next-drive-uploads", id);
|
|
2321
2396
|
if (fs__default.default.existsSync(tempUploadDir)) {
|
|
2322
2397
|
try {
|
|
2323
2398
|
fs__default.default.rmSync(tempUploadDir, { recursive: true, force: true });
|
|
@@ -2463,6 +2538,7 @@ var driveAPIHandler = async (req, res) => {
|
|
|
2463
2538
|
};
|
|
2464
2539
|
|
|
2465
2540
|
exports.driveAPIHandler = driveAPIHandler;
|
|
2541
|
+
exports.driveCleanup = driveCleanup;
|
|
2466
2542
|
exports.driveConfiguration = driveConfiguration;
|
|
2467
2543
|
exports.driveDelete = driveDelete;
|
|
2468
2544
|
exports.driveFilePath = driveFilePath;
|
|
@@ -2476,5 +2552,5 @@ exports.driveUpload = driveUpload;
|
|
|
2476
2552
|
exports.drive_default = drive_default;
|
|
2477
2553
|
exports.getDriveConfig = getDriveConfig;
|
|
2478
2554
|
exports.getDriveInformation = getDriveInformation;
|
|
2479
|
-
//# sourceMappingURL=chunk-
|
|
2480
|
-
//# sourceMappingURL=chunk-
|
|
2555
|
+
//# sourceMappingURL=chunk-RBLDH7CP.cjs.map
|
|
2556
|
+
//# sourceMappingURL=chunk-RBLDH7CP.cjs.map
|