@blocklet/uploader-server 0.1.79 → 0.1.81
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 +1 -1
- package/es/middlewares/companion.d.ts +4 -1
- package/es/middlewares/companion.js +5 -5
- package/es/middlewares/local-storage.d.ts +2 -1
- package/es/middlewares/local-storage.js +10 -10
- package/es/middlewares/static-resource.js +8 -8
- package/es/utils.js +3 -2
- package/lib/middlewares/companion.d.ts +4 -1
- package/lib/middlewares/companion.js +9 -8
- package/lib/middlewares/local-storage.d.ts +2 -1
- package/lib/middlewares/local-storage.js +50 -59
- package/lib/middlewares/static-resource.js +26 -36
- package/lib/utils.js +3 -2
- package/package.json +16 -2
package/README.md
CHANGED
|
@@ -42,7 +42,7 @@ pnpm run dev
|
|
|
42
42
|
## Backend Example
|
|
43
43
|
|
|
44
44
|
```javascript
|
|
45
|
-
|
|
45
|
+
import { initLocalStorageServer, initCompanion } from '@blocklet/uploader-server';
|
|
46
46
|
|
|
47
47
|
// init uploader server
|
|
48
48
|
const localStorageServer = initLocalStorageServer({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { app as companionAppLib } from "@uppy/companion";
|
|
2
|
+
import bodyParser from "body-parser";
|
|
3
|
+
import session from "express-session";
|
|
4
|
+
import crypto from "crypto";
|
|
5
5
|
const secret = crypto.randomBytes(32).toString("hex");
|
|
6
6
|
export function initCompanion({
|
|
7
7
|
path,
|
|
@@ -29,7 +29,7 @@ export function initCompanion({
|
|
|
29
29
|
metrics: false,
|
|
30
30
|
...restProps
|
|
31
31
|
};
|
|
32
|
-
const newCompanion =
|
|
32
|
+
const newCompanion = companionAppLib(companionOptions);
|
|
33
33
|
const { app: companionApp } = newCompanion;
|
|
34
34
|
app.all(
|
|
35
35
|
"*",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type ServerOptions } from '@tus/server';
|
|
2
|
+
import { Server } from '@tus/server';
|
|
2
3
|
export declare function initLocalStorageServer({ path: _path, onUploadFinish: _onUploadFinish, onUploadCreate: _onUploadCreate, express, expiredUploadTime, // default 3 days expire
|
|
3
4
|
...restProps }: ServerOptions & {
|
|
4
5
|
path: string;
|
|
@@ -6,7 +7,7 @@ export declare function initLocalStorageServer({ path: _path, onUploadFinish: _o
|
|
|
6
7
|
onUploadCreate?: Function;
|
|
7
8
|
express: Function;
|
|
8
9
|
expiredUploadTime?: Number;
|
|
9
|
-
}):
|
|
10
|
+
}): Server;
|
|
10
11
|
export declare const getFileName: (req: any) => any;
|
|
11
12
|
export declare function getFileNameParam(req: any, res: any, { isRequired }?: {
|
|
12
13
|
isRequired: boolean;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import { Server, EVENTS } from "@tus/server";
|
|
2
|
+
import { FileStore } from "@tus/file-store";
|
|
3
|
+
import cron from "@abtnode/cron";
|
|
4
|
+
import { promises as fs } from "fs";
|
|
5
|
+
import path from "path";
|
|
6
|
+
import crypto from "crypto";
|
|
7
|
+
import mime from "mime-types";
|
|
8
|
+
import joinUrlLib from "url-join";
|
|
9
|
+
import queue from "p-queue";
|
|
10
|
+
import { setPDFDownloadHeader, logger } from "../utils.js";
|
|
11
11
|
const validFilePathInDirPath = (dirPath, filePath) => {
|
|
12
12
|
const fileName = path.basename(filePath);
|
|
13
13
|
if (!filePath.startsWith(dirPath) || path.join(dirPath, fileName) !== filePath) {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { existsSync } from "fs";
|
|
2
|
+
import { join, basename } from "path";
|
|
3
|
+
import config from "@blocklet/sdk/lib/config";
|
|
4
|
+
import { getResources } from "@blocklet/sdk/lib/component";
|
|
5
|
+
import joinUrl from "url-join";
|
|
6
|
+
import component from "@blocklet/sdk/lib/component";
|
|
7
|
+
import { setPDFDownloadHeader, logger } from "../utils.js";
|
|
8
|
+
import { ImageBinDid } from "../constants.js";
|
|
9
9
|
const ImgResourceType = "imgpack";
|
|
10
10
|
let skipRunningCheck = false;
|
|
11
11
|
let resourceTypes = [
|
package/es/utils.js
CHANGED
|
@@ -11,8 +11,9 @@ import FormData from "form-data";
|
|
|
11
11
|
import omit from "lodash/omit";
|
|
12
12
|
export let logger = console;
|
|
13
13
|
if (process.env.BLOCKLET_LOG_DIR) {
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
import("@blocklet/logger").then((initLogger) => {
|
|
15
|
+
logger = initLogger("uploader-server");
|
|
16
|
+
});
|
|
16
17
|
}
|
|
17
18
|
const DEFAULT_TTL = 5 * 60 * 1e3;
|
|
18
19
|
const appUrl = process.env.BLOCKLET_APP_URL || "";
|
|
@@ -4,11 +4,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.initCompanion = initCompanion;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
var _companion = require("@uppy/companion");
|
|
8
|
+
var _bodyParser = _interopRequireDefault(require("body-parser"));
|
|
9
|
+
var _expressSession = _interopRequireDefault(require("express-session"));
|
|
10
|
+
var _crypto = _interopRequireDefault(require("crypto"));
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
const secret = _crypto.default.randomBytes(32).toString("hex");
|
|
12
13
|
function initCompanion({
|
|
13
14
|
path,
|
|
14
15
|
express,
|
|
@@ -16,8 +17,8 @@ function initCompanion({
|
|
|
16
17
|
...restProps
|
|
17
18
|
}) {
|
|
18
19
|
const app = express();
|
|
19
|
-
app.use(
|
|
20
|
-
app.use(
|
|
20
|
+
app.use(_bodyParser.default.json());
|
|
21
|
+
app.use((0, _expressSession.default)({
|
|
21
22
|
secret
|
|
22
23
|
}));
|
|
23
24
|
let dynamicProviderOptions = providerOptions;
|
|
@@ -37,7 +38,7 @@ function initCompanion({
|
|
|
37
38
|
metrics: false,
|
|
38
39
|
...restProps
|
|
39
40
|
};
|
|
40
|
-
const newCompanion =
|
|
41
|
+
const newCompanion = (0, _companion.app)(companionOptions);
|
|
41
42
|
const {
|
|
42
43
|
app: companionApp
|
|
43
44
|
} = newCompanion;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type ServerOptions } from '@tus/server';
|
|
2
|
+
import { Server } from '@tus/server';
|
|
2
3
|
export declare function initLocalStorageServer({ path: _path, onUploadFinish: _onUploadFinish, onUploadCreate: _onUploadCreate, express, expiredUploadTime, // default 3 days expire
|
|
3
4
|
...restProps }: ServerOptions & {
|
|
4
5
|
path: string;
|
|
@@ -6,7 +7,7 @@ export declare function initLocalStorageServer({ path: _path, onUploadFinish: _o
|
|
|
6
7
|
onUploadCreate?: Function;
|
|
7
8
|
express: Function;
|
|
8
9
|
expiredUploadTime?: Number;
|
|
9
|
-
}):
|
|
10
|
+
}): Server;
|
|
10
11
|
export declare const getFileName: (req: any) => any;
|
|
11
12
|
export declare function getFileNameParam(req: any, res: any, { isRequired }?: {
|
|
12
13
|
isRequired: boolean;
|
|
@@ -11,30 +11,21 @@ exports.getMetaDataByFilePath = getMetaDataByFilePath;
|
|
|
11
11
|
exports.initLocalStorageServer = initLocalStorageServer;
|
|
12
12
|
exports.joinUrl = joinUrl;
|
|
13
13
|
exports.setHeaders = setHeaders;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const mime = require("mime-types");
|
|
26
|
-
const joinUrlLib = require("url-join");
|
|
27
|
-
const {
|
|
28
|
-
default: queue
|
|
29
|
-
} = require("p-queue");
|
|
30
|
-
const {
|
|
31
|
-
setPDFDownloadHeader,
|
|
32
|
-
logger
|
|
33
|
-
} = require("../utils");
|
|
14
|
+
var _server = require("@tus/server");
|
|
15
|
+
var _fileStore = require("@tus/file-store");
|
|
16
|
+
var _cron = _interopRequireDefault(require("@abtnode/cron"));
|
|
17
|
+
var _fs = require("fs");
|
|
18
|
+
var _path2 = _interopRequireDefault(require("path"));
|
|
19
|
+
var _crypto = _interopRequireDefault(require("crypto"));
|
|
20
|
+
var _mimeTypes = _interopRequireDefault(require("mime-types"));
|
|
21
|
+
var _urlJoin = _interopRequireDefault(require("url-join"));
|
|
22
|
+
var _pQueue = _interopRequireDefault(require("p-queue"));
|
|
23
|
+
var _utils = require("../utils");
|
|
24
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
34
25
|
const validFilePathInDirPath = (dirPath, filePath) => {
|
|
35
|
-
const fileName =
|
|
36
|
-
if (!filePath.startsWith(dirPath) ||
|
|
37
|
-
logger.error("Invalid file path: ", filePath);
|
|
26
|
+
const fileName = _path2.default.basename(filePath);
|
|
27
|
+
if (!filePath.startsWith(dirPath) || _path2.default.join(dirPath, fileName) !== filePath) {
|
|
28
|
+
_utils.logger.error("Invalid file path: ", filePath);
|
|
38
29
|
throw new Error("Invalid file path");
|
|
39
30
|
}
|
|
40
31
|
return true;
|
|
@@ -71,7 +62,7 @@ function initLocalStorageServer({
|
|
|
71
62
|
} = cloneUploadMetadata;
|
|
72
63
|
cloneUploadMetadata.runtime = {
|
|
73
64
|
relativePath: metadata?.relativePath,
|
|
74
|
-
absolutePath:
|
|
65
|
+
absolutePath: _path2.default.join(_path, id),
|
|
75
66
|
size,
|
|
76
67
|
hashFileName: id,
|
|
77
68
|
originFileName: metadata?.filename,
|
|
@@ -119,7 +110,7 @@ function initLocalStorageServer({
|
|
|
119
110
|
const result = await _onUploadFinish(req, res, uploadMetadata);
|
|
120
111
|
return result;
|
|
121
112
|
} catch (err) {
|
|
122
|
-
logger.error("@blocklet/uploader: onUploadFinish error: ", err);
|
|
113
|
+
_utils.logger.error("@blocklet/uploader: onUploadFinish error: ", err);
|
|
123
114
|
newServer.delete(uploadMetadata.id);
|
|
124
115
|
res.setHeader("x-uploader-file-exist", false);
|
|
125
116
|
throw err;
|
|
@@ -127,14 +118,14 @@ function initLocalStorageServer({
|
|
|
127
118
|
}
|
|
128
119
|
return res;
|
|
129
120
|
};
|
|
130
|
-
const newServer = new Server({
|
|
121
|
+
const newServer = new _server.Server({
|
|
131
122
|
path: "/",
|
|
132
123
|
// UNUSED
|
|
133
124
|
relativeLocation: true,
|
|
134
125
|
// respectForwardedHeaders: true,
|
|
135
126
|
namingFunction: req => {
|
|
136
127
|
const fileName = getFileName(req);
|
|
137
|
-
const filePath =
|
|
128
|
+
const filePath = _path2.default.join(_path, fileName);
|
|
138
129
|
validFilePathInDirPath(_path, filePath);
|
|
139
130
|
return fileName;
|
|
140
131
|
},
|
|
@@ -163,7 +154,7 @@ function initLocalStorageServer({
|
|
|
163
154
|
};
|
|
164
155
|
next();
|
|
165
156
|
});
|
|
166
|
-
|
|
157
|
+
_cron.default.init({
|
|
167
158
|
context: {},
|
|
168
159
|
jobs: [{
|
|
169
160
|
name: "auto-cleanup-expired-uploads",
|
|
@@ -172,12 +163,12 @@ function initLocalStorageServer({
|
|
|
172
163
|
fn: () => {
|
|
173
164
|
try {
|
|
174
165
|
newServer.cleanUpExpiredUploads().then(count => {
|
|
175
|
-
logger.info(`@blocklet/uploader: cleanup expired uploads done: ${count}`);
|
|
166
|
+
_utils.logger.info(`@blocklet/uploader: cleanup expired uploads done: ${count}`);
|
|
176
167
|
}).catch(err => {
|
|
177
|
-
logger.error(`@blocklet/uploader: cleanup expired uploads error`, err);
|
|
168
|
+
_utils.logger.error(`@blocklet/uploader: cleanup expired uploads error`, err);
|
|
178
169
|
});
|
|
179
170
|
} catch (err) {
|
|
180
|
-
logger.error(`@blocklet/uploader: cleanup expired uploads error`, err);
|
|
171
|
+
_utils.logger.error(`@blocklet/uploader: cleanup expired uploads error`, err);
|
|
181
172
|
}
|
|
182
173
|
},
|
|
183
174
|
options: {
|
|
@@ -185,7 +176,7 @@ function initLocalStorageServer({
|
|
|
185
176
|
}
|
|
186
177
|
}],
|
|
187
178
|
onError: err => {
|
|
188
|
-
logger.error("@blocklet/uploader: cleanup job failed", err);
|
|
179
|
+
_utils.logger.error("@blocklet/uploader: cleanup job failed", err);
|
|
189
180
|
}
|
|
190
181
|
});
|
|
191
182
|
newServer.delete = async key => {
|
|
@@ -193,10 +184,10 @@ function initLocalStorageServer({
|
|
|
193
184
|
await configstore.delete(key);
|
|
194
185
|
await configstore.delete(key, false);
|
|
195
186
|
} catch (err) {
|
|
196
|
-
logger.error("@blocklet/uploader: delete error: ", err);
|
|
187
|
+
_utils.logger.error("@blocklet/uploader: delete error: ", err);
|
|
197
188
|
}
|
|
198
189
|
};
|
|
199
|
-
newServer.on(EVENTS.POST_RECEIVE, async (req, res, uploadMetadata) => {
|
|
190
|
+
newServer.on(_server.EVENTS.POST_RECEIVE, async (req, res, uploadMetadata) => {
|
|
200
191
|
uploadMetadata = formatMetadata(uploadMetadata);
|
|
201
192
|
await rewriteMetaDataFile(uploadMetadata);
|
|
202
193
|
});
|
|
@@ -206,7 +197,7 @@ function initLocalStorageServer({
|
|
|
206
197
|
}
|
|
207
198
|
const getFileName = req => {
|
|
208
199
|
const ext = req.headers["x-uploader-file-ext"];
|
|
209
|
-
const randomName = `${
|
|
200
|
+
const randomName = `${_crypto.default.randomBytes(16).toString("hex")}${ext ? `.${ext}` : ""}`;
|
|
210
201
|
return req.headers["x-uploader-file-name"] || randomName;
|
|
211
202
|
};
|
|
212
203
|
exports.getFileName = getFileName;
|
|
@@ -232,9 +223,9 @@ function getLocalStorageFile({
|
|
|
232
223
|
}) {
|
|
233
224
|
return async (req, res, next) => {
|
|
234
225
|
const fileName = getFileNameParam(req, res);
|
|
235
|
-
const filePath =
|
|
226
|
+
const filePath = _path2.default.join(server.datastore.directory, fileName);
|
|
236
227
|
validFilePathInDirPath(server.datastore.directory, filePath);
|
|
237
|
-
const fileExists = await
|
|
228
|
+
const fileExists = await _fs.promises.stat(filePath).catch(() => false);
|
|
238
229
|
if (!fileExists) {
|
|
239
230
|
res.status(404).json({
|
|
240
231
|
error: "file not found"
|
|
@@ -242,7 +233,7 @@ function getLocalStorageFile({
|
|
|
242
233
|
return;
|
|
243
234
|
}
|
|
244
235
|
setHeaders(req, res);
|
|
245
|
-
const file = await
|
|
236
|
+
const file = await _fs.promises.readFile(filePath);
|
|
246
237
|
res.send(file);
|
|
247
238
|
next?.();
|
|
248
239
|
};
|
|
@@ -267,11 +258,11 @@ function setHeaders(req, res, next) {
|
|
|
267
258
|
req.baseUrl = req.headers["x-uploader-base-url"];
|
|
268
259
|
}
|
|
269
260
|
if (method === "GET" && fileName) {
|
|
270
|
-
const contentType =
|
|
261
|
+
const contentType = _mimeTypes.default.lookup(fileName);
|
|
271
262
|
if (contentType) {
|
|
272
263
|
res.setHeader("Content-Type", contentType);
|
|
273
264
|
}
|
|
274
|
-
setPDFDownloadHeader(req, res);
|
|
265
|
+
(0, _utils.setPDFDownloadHeader)(req, res);
|
|
275
266
|
}
|
|
276
267
|
next?.();
|
|
277
268
|
}
|
|
@@ -284,9 +275,9 @@ async function fileExistBeforeUpload(req, res, next) {
|
|
|
284
275
|
if (["PATCH", "POST"].includes(method)) {
|
|
285
276
|
const _path = uploaderProps.server.datastore.directory;
|
|
286
277
|
const fileName = getFileName(req);
|
|
287
|
-
const filePath =
|
|
278
|
+
const filePath = _path2.default.join(_path, fileName);
|
|
288
279
|
validFilePathInDirPath(_path, filePath);
|
|
289
|
-
const isExist = await
|
|
280
|
+
const isExist = await _fs.promises.stat(filePath).catch(() => false);
|
|
290
281
|
if (isExist) {
|
|
291
282
|
const metaData = await getMetaDataByFilePath(filePath);
|
|
292
283
|
if (isExist?.size >= 0 && isExist?.size === metaData?.size) {
|
|
@@ -310,7 +301,7 @@ async function fileExistBeforeUpload(req, res, next) {
|
|
|
310
301
|
...realMetaData
|
|
311
302
|
};
|
|
312
303
|
} catch (err) {
|
|
313
|
-
logger.error("@blocklet/uploader: parse metadata error: ", err);
|
|
304
|
+
_utils.logger.error("@blocklet/uploader: parse metadata error: ", err);
|
|
314
305
|
}
|
|
315
306
|
}
|
|
316
307
|
const uploadResult = await uploaderProps.onUploadFinish(req, res, metaData);
|
|
@@ -323,14 +314,14 @@ async function fileExistBeforeUpload(req, res, next) {
|
|
|
323
314
|
}
|
|
324
315
|
async function getMetaDataByFilePath(filePath) {
|
|
325
316
|
const metaDataPath = `${filePath}.json`;
|
|
326
|
-
const isExist = await
|
|
317
|
+
const isExist = await _fs.promises.stat(filePath).catch(() => false);
|
|
327
318
|
if (isExist) {
|
|
328
319
|
try {
|
|
329
|
-
const metaData = await
|
|
320
|
+
const metaData = await _fs.promises.readFile(metaDataPath, "utf-8");
|
|
330
321
|
const metaDataJson = JSON.parse(metaData);
|
|
331
322
|
return metaDataJson;
|
|
332
323
|
} catch (err) {
|
|
333
|
-
logger.error("@blocklet/uploader: getMetaDataByPath error: ", err);
|
|
324
|
+
_utils.logger.error("@blocklet/uploader: getMetaDataByPath error: ", err);
|
|
334
325
|
}
|
|
335
326
|
}
|
|
336
327
|
return null;
|
|
@@ -342,23 +333,23 @@ function joinUrl(...args) {
|
|
|
342
333
|
}
|
|
343
334
|
return item;
|
|
344
335
|
});
|
|
345
|
-
return
|
|
336
|
+
return (0, _urlJoin.default)(...realArgs);
|
|
346
337
|
}
|
|
347
338
|
class RewriteFileConfigstore {
|
|
348
339
|
directory;
|
|
349
340
|
queue;
|
|
350
341
|
constructor(path2) {
|
|
351
342
|
this.directory = path2;
|
|
352
|
-
this.queue = new
|
|
343
|
+
this.queue = new _pQueue.default({
|
|
353
344
|
concurrency: 1
|
|
354
345
|
});
|
|
355
346
|
}
|
|
356
347
|
async get(key) {
|
|
357
348
|
try {
|
|
358
|
-
const buffer = await this.queue.add(() =>
|
|
349
|
+
const buffer = await this.queue.add(() => _fs.promises.readFile(this.resolve(key), "utf8"));
|
|
359
350
|
const metadata = JSON.parse(buffer);
|
|
360
351
|
if (metadata.offset !== metadata.size) {
|
|
361
|
-
const info = await
|
|
352
|
+
const info = await _fs.promises.stat(this.resolve(key, false)).catch(() => false);
|
|
362
353
|
if (info?.size !== metadata?.offset) {
|
|
363
354
|
metadata.offset = info.size;
|
|
364
355
|
this.set(key, metadata);
|
|
@@ -376,31 +367,31 @@ class RewriteFileConfigstore {
|
|
|
376
367
|
if (value?.metadata?.runtime) {
|
|
377
368
|
delete value.metadata.runtime;
|
|
378
369
|
}
|
|
379
|
-
await this.queue.add(() =>
|
|
370
|
+
await this.queue.add(() => _fs.promises.writeFile(this.resolve(key), JSON.stringify(value)));
|
|
380
371
|
}
|
|
381
372
|
async safeDeleteFile(filePath) {
|
|
382
373
|
validFilePathInDirPath(this.directory, filePath);
|
|
383
374
|
try {
|
|
384
|
-
const isExist = await
|
|
375
|
+
const isExist = await _fs.promises.stat(filePath).catch(() => false);
|
|
385
376
|
if (isExist) {
|
|
386
|
-
await
|
|
377
|
+
await _fs.promises.rm(filePath);
|
|
387
378
|
} else {
|
|
388
|
-
logger.log("Can not remove file, the file not exist: ", filePath);
|
|
379
|
+
_utils.logger.log("Can not remove file, the file not exist: ", filePath);
|
|
389
380
|
}
|
|
390
381
|
} catch (err) {
|
|
391
|
-
logger.error("@blocklet/uploader: safeDeleteFile error: ", err);
|
|
382
|
+
_utils.logger.error("@blocklet/uploader: safeDeleteFile error: ", err);
|
|
392
383
|
}
|
|
393
384
|
}
|
|
394
385
|
async delete(key, isMetadata = true) {
|
|
395
386
|
try {
|
|
396
387
|
await this.queue.add(() => this.safeDeleteFile(this.resolve(key, isMetadata)));
|
|
397
388
|
} catch (err) {
|
|
398
|
-
logger.error("@blocklet/uploader: delete error: ", err);
|
|
389
|
+
_utils.logger.error("@blocklet/uploader: delete error: ", err);
|
|
399
390
|
}
|
|
400
391
|
}
|
|
401
392
|
async list() {
|
|
402
393
|
return this.queue.add(async () => {
|
|
403
|
-
const files = await
|
|
394
|
+
const files = await _fs.promises.readdir(this.directory, {
|
|
404
395
|
withFileTypes: true
|
|
405
396
|
});
|
|
406
397
|
const promises = files.filter(file => file.isFile() && file.name.endsWith(".json")).map(file => {
|
|
@@ -414,10 +405,10 @@ class RewriteFileConfigstore {
|
|
|
414
405
|
if (isMetadata) {
|
|
415
406
|
fileKey = `${key}.json`;
|
|
416
407
|
}
|
|
417
|
-
return
|
|
408
|
+
return _path2.default.join(this.directory, fileKey);
|
|
418
409
|
}
|
|
419
410
|
}
|
|
420
|
-
class RewriteFileStore extends FileStore {
|
|
411
|
+
class RewriteFileStore extends _fileStore.FileStore {
|
|
421
412
|
constructor(options) {
|
|
422
413
|
super(options);
|
|
423
414
|
}
|
|
@@ -4,38 +4,28 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.mappingResource = exports.initStaticResourceMiddleware = exports.initProxyToMediaKitUploadsMiddleware = exports.getCanUseResources = void 0;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
} = require("@blocklet/sdk/lib/component");
|
|
18
|
-
const joinUrl = require("url-join");
|
|
19
|
-
const component = require("@blocklet/sdk/lib/component");
|
|
20
|
-
const {
|
|
21
|
-
setPDFDownloadHeader,
|
|
22
|
-
logger
|
|
23
|
-
} = require("../utils");
|
|
24
|
-
const {
|
|
25
|
-
ImageBinDid
|
|
26
|
-
} = require("../constants");
|
|
7
|
+
var _fs = require("fs");
|
|
8
|
+
var _path = require("path");
|
|
9
|
+
var _config = _interopRequireDefault(require("@blocklet/sdk/lib/config"));
|
|
10
|
+
var _component = _interopRequireWildcard(require("@blocklet/sdk/lib/component"));
|
|
11
|
+
var _urlJoin = _interopRequireDefault(require("url-join"));
|
|
12
|
+
var _utils = require("../utils");
|
|
13
|
+
var _constants = require("../constants");
|
|
14
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
15
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
16
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
27
17
|
const ImgResourceType = "imgpack";
|
|
28
18
|
let skipRunningCheck = false;
|
|
29
19
|
let resourceTypes = [{
|
|
30
20
|
type: ImgResourceType,
|
|
31
|
-
did: ImageBinDid,
|
|
21
|
+
did: _constants.ImageBinDid,
|
|
32
22
|
folder: ""
|
|
33
23
|
// can be string or string[]
|
|
34
24
|
}];
|
|
35
25
|
let canUseResources = [];
|
|
36
26
|
const mappingResource = async () => {
|
|
37
27
|
try {
|
|
38
|
-
const resources = getResources({
|
|
28
|
+
const resources = (0, _component.getResources)({
|
|
39
29
|
types: resourceTypes,
|
|
40
30
|
skipRunningCheck
|
|
41
31
|
});
|
|
@@ -44,24 +34,24 @@ const mappingResource = async () => {
|
|
|
44
34
|
const resourceType = resourceTypes.find(({
|
|
45
35
|
type
|
|
46
36
|
}) => originDir.endsWith(type));
|
|
47
|
-
if (!existsSync(originDir) || !resourceType) {
|
|
37
|
+
if (!(0, _fs.existsSync)(originDir) || !resourceType) {
|
|
48
38
|
return false;
|
|
49
39
|
}
|
|
50
40
|
const folders = Array.isArray(resourceType.folder) ? resourceType.folder : [resourceType.folder || ""];
|
|
51
41
|
return folders.map(folder => ({
|
|
52
42
|
originDir,
|
|
53
|
-
dir: join(originDir, folder),
|
|
43
|
+
dir: (0, _path.join)(originDir, folder),
|
|
54
44
|
blockletInfo: resource,
|
|
55
45
|
whitelist: resourceType.whitelist,
|
|
56
46
|
blacklist: resourceType.blacklist
|
|
57
47
|
}));
|
|
58
48
|
}).filter(Boolean).flat();
|
|
59
|
-
logger.info("Mapping can use resources count: ", canUseResources.length
|
|
49
|
+
_utils.logger.info("Mapping can use resources count: ", canUseResources.length
|
|
60
50
|
// canUseResources
|
|
61
51
|
);
|
|
62
52
|
return canUseResources;
|
|
63
53
|
} catch (error) {
|
|
64
|
-
logger.error(error);
|
|
54
|
+
_utils.logger.error(error);
|
|
65
55
|
}
|
|
66
56
|
return false;
|
|
67
57
|
};
|
|
@@ -69,7 +59,7 @@ exports.mappingResource = mappingResource;
|
|
|
69
59
|
const {
|
|
70
60
|
events,
|
|
71
61
|
Events
|
|
72
|
-
} =
|
|
62
|
+
} = _config.default;
|
|
73
63
|
events.on(Events.componentAdded, () => mappingResource());
|
|
74
64
|
events.on(Events.componentRemoved, () => mappingResource());
|
|
75
65
|
events.on(Events.componentStarted, () => mappingResource());
|
|
@@ -87,7 +77,7 @@ const initStaticResourceMiddleware = ({
|
|
|
87
77
|
if (typeof item === "string") {
|
|
88
78
|
return {
|
|
89
79
|
type: item,
|
|
90
|
-
did: ImageBinDid,
|
|
80
|
+
did: _constants.ImageBinDid,
|
|
91
81
|
// not set did, default is ImageBinDid
|
|
92
82
|
folder: ""
|
|
93
83
|
// not set folder, default is root
|
|
@@ -98,13 +88,13 @@ const initStaticResourceMiddleware = ({
|
|
|
98
88
|
}
|
|
99
89
|
mappingResource();
|
|
100
90
|
return (req, res, next) => {
|
|
101
|
-
const fileName = basename(req.url);
|
|
91
|
+
const fileName = (0, _path.basename)(req.url);
|
|
102
92
|
const matchCanUseResourceItem = canUseResources.find(item => {
|
|
103
|
-
const normalizedPath = join(item.dir, fileName);
|
|
93
|
+
const normalizedPath = (0, _path.join)(item.dir, fileName);
|
|
104
94
|
if (!normalizedPath.startsWith(item.dir)) {
|
|
105
95
|
return false;
|
|
106
96
|
}
|
|
107
|
-
if (!existsSync(normalizedPath)) {
|
|
97
|
+
if (!(0, _fs.existsSync)(normalizedPath)) {
|
|
108
98
|
return false;
|
|
109
99
|
}
|
|
110
100
|
const {
|
|
@@ -139,18 +129,18 @@ const initProxyToMediaKitUploadsMiddleware = ({
|
|
|
139
129
|
express
|
|
140
130
|
} = {}) => {
|
|
141
131
|
return async (req, res, next) => {
|
|
142
|
-
if (!
|
|
132
|
+
if (!_component.default.getComponentWebEndpoint(_constants.ImageBinDid)) {
|
|
143
133
|
return next();
|
|
144
134
|
}
|
|
145
|
-
setPDFDownloadHeader(req, res);
|
|
135
|
+
(0, _utils.setPDFDownloadHeader)(req, res);
|
|
146
136
|
try {
|
|
147
137
|
const {
|
|
148
138
|
data,
|
|
149
139
|
status,
|
|
150
140
|
headers
|
|
151
|
-
} = await
|
|
152
|
-
name: ImageBinDid,
|
|
153
|
-
path:
|
|
141
|
+
} = await _component.default.call({
|
|
142
|
+
name: _constants.ImageBinDid,
|
|
143
|
+
path: (0, _urlJoin.default)("/uploads", (0, _path.basename)(req.url)),
|
|
154
144
|
responseType: "stream",
|
|
155
145
|
method: "GET"
|
|
156
146
|
});
|
package/lib/utils.js
CHANGED
|
@@ -25,8 +25,9 @@ var _omit = _interopRequireDefault(require("lodash/omit"));
|
|
|
25
25
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
26
26
|
let logger = exports.logger = console;
|
|
27
27
|
if (process.env.BLOCKLET_LOG_DIR) {
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
Promise.resolve().then(() => require("@blocklet/logger")).then(initLogger => {
|
|
29
|
+
exports.logger = logger = initLogger("uploader-server");
|
|
30
|
+
});
|
|
30
31
|
}
|
|
31
32
|
const DEFAULT_TTL = 5 * 60 * 1e3;
|
|
32
33
|
const appUrl = process.env.BLOCKLET_APP_URL || "";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blocklet/uploader-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.81",
|
|
4
4
|
"description": "blocklet upload server",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -18,6 +18,18 @@
|
|
|
18
18
|
"types": "./lib/middlewares.d.ts"
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
|
+
"typesVersions": {
|
|
22
|
+
"*": {
|
|
23
|
+
"*": [
|
|
24
|
+
"./es/*.d.ts"
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
"middlewares": {
|
|
28
|
+
"*": [
|
|
29
|
+
"./es/middlewares.d.ts"
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
},
|
|
21
33
|
"files": [
|
|
22
34
|
"lib",
|
|
23
35
|
"es",
|
|
@@ -33,7 +45,8 @@
|
|
|
33
45
|
"peerDependencies": {
|
|
34
46
|
"@tus/file-store": "1.0.0",
|
|
35
47
|
"@tus/server": "1.0.0",
|
|
36
|
-
"@uppy/companion": "4.15.1"
|
|
48
|
+
"@uppy/companion": "4.15.1",
|
|
49
|
+
"axios": "^1.7.8"
|
|
37
50
|
},
|
|
38
51
|
"dependencies": {
|
|
39
52
|
"@abtnode/cron": "^1.16.38",
|
|
@@ -55,6 +68,7 @@
|
|
|
55
68
|
"devDependencies": {
|
|
56
69
|
"@arcblock/eslint-config-ts": "^0.2.4",
|
|
57
70
|
"@types/express": "^4.17.21",
|
|
71
|
+
"@types/express-session": "^1.18.1",
|
|
58
72
|
"@types/mime-types": "^2.1.4",
|
|
59
73
|
"@types/node": "^20.17.9",
|
|
60
74
|
"@types/url-join": "^4.0.3",
|