@kevisual/oss 0.0.1 → 0.0.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/dist/{index-BNtwSChY.d.ts → index-CQoepWCw.d.ts} +4 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +26 -4
- package/dist/services/config.d.ts +1 -1
- package/dist/services/config.js +26 -4
- package/dist/services/index.d.ts +33 -2
- package/dist/services/index.js +89 -5
- package/package.json +14 -4
|
@@ -123,6 +123,9 @@ declare class OssBase implements OssBaseOperation {
|
|
|
123
123
|
fPutObject(objectName: string, filePath: string, metaData?: ItemBucketMetadata): Promise<any>;
|
|
124
124
|
statObject(objectName: string): Promise<minio.BucketItemStat>;
|
|
125
125
|
copyObject(sourceObject: any, targetObject: any): Promise<minio_dist_esm_internal_type_mjs.CopyObjectResult>;
|
|
126
|
+
replaceObject(objectName: string, meta: {
|
|
127
|
+
[key: string]: string;
|
|
128
|
+
}): Promise<minio_dist_esm_internal_type_mjs.CopyObjectResult>;
|
|
126
129
|
static create<T extends OssBase, U>(this: new (opts: OssBaseOptions<U>) => T, opts: OssBaseOptions<U>): T;
|
|
127
130
|
static fromBase<T extends OssBase, U>(this: new (opts: OssBaseOptions<U>) => T, createOpts: {
|
|
128
131
|
oss: OssBase;
|
|
@@ -130,4 +133,4 @@ declare class OssBase implements OssBaseOperation {
|
|
|
130
133
|
}): T;
|
|
131
134
|
}
|
|
132
135
|
|
|
133
|
-
export { type ListFileObject as L, OssBase as O, type
|
|
136
|
+
export { type ListFileObject as L, OssBase as O, type OssBaseOptions as a, type OssService as b, type ListObjectResult as c };
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/util/hash.ts
|
|
2
|
-
import crypto from "crypto";
|
|
2
|
+
import crypto from "node:crypto";
|
|
3
3
|
var hash = (str) => {
|
|
4
4
|
let hashStr;
|
|
5
5
|
if (typeof str === "object") {
|
|
@@ -10,6 +10,22 @@ var hash = (str) => {
|
|
|
10
10
|
return crypto.createHash("md5").update(hashStr).digest("hex");
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
+
// src/core/copy-object.ts
|
|
14
|
+
import { CopyDestinationOptions, CopySourceOptions } from "minio";
|
|
15
|
+
var copyObject = async ({ bucketName, newMetadata, objectName, client }) => {
|
|
16
|
+
const source = new CopySourceOptions({ Bucket: bucketName, Object: objectName });
|
|
17
|
+
const stat = await client.statObject(bucketName, objectName);
|
|
18
|
+
const sourceMetadata = stat.metaData;
|
|
19
|
+
const destination = new CopyDestinationOptions({
|
|
20
|
+
Bucket: bucketName,
|
|
21
|
+
Object: objectName,
|
|
22
|
+
UserMetadata: { ...sourceMetadata, ...newMetadata },
|
|
23
|
+
MetadataDirective: "REPLACE"
|
|
24
|
+
});
|
|
25
|
+
const copyResult = await client.copyObject(source, destination);
|
|
26
|
+
return copyResult;
|
|
27
|
+
};
|
|
28
|
+
|
|
13
29
|
// src/index.ts
|
|
14
30
|
var OssBase = class {
|
|
15
31
|
client;
|
|
@@ -25,7 +41,7 @@ var OssBase = class {
|
|
|
25
41
|
}
|
|
26
42
|
this.bucketName = opts.bucketName;
|
|
27
43
|
this.client = opts.client;
|
|
28
|
-
this.prefix = opts
|
|
44
|
+
this.prefix = opts?.prefix ?? "";
|
|
29
45
|
}
|
|
30
46
|
setPrefix(prefix) {
|
|
31
47
|
this.prefix = prefix;
|
|
@@ -57,12 +73,14 @@ var OssBase = class {
|
|
|
57
73
|
}
|
|
58
74
|
async putObject(objectName, data, metaData) {
|
|
59
75
|
let putData;
|
|
76
|
+
let size;
|
|
60
77
|
if (typeof data === "object") {
|
|
61
78
|
putData = JSON.stringify(data);
|
|
62
|
-
|
|
79
|
+
size = putData.length;
|
|
80
|
+
} else if (typeof data === "string") {
|
|
63
81
|
putData = data;
|
|
82
|
+
size = putData.length;
|
|
64
83
|
}
|
|
65
|
-
const size = putData.length;
|
|
66
84
|
const bucketName = this.bucketName;
|
|
67
85
|
const obj = await this.client.putObject(bucketName, `${this.prefix}${objectName}`, putData, size, metaData);
|
|
68
86
|
return obj;
|
|
@@ -116,6 +134,10 @@ var OssBase = class {
|
|
|
116
134
|
const obj = await this.client.copyObject(bucketName, sourceObject, targetObject);
|
|
117
135
|
return obj;
|
|
118
136
|
}
|
|
137
|
+
async replaceObject(objectName, meta) {
|
|
138
|
+
const { bucketName, client } = this;
|
|
139
|
+
return copyObject({ bucketName, client, objectName: `${this.prefix}${objectName}`, newMetadata: meta });
|
|
140
|
+
}
|
|
119
141
|
static create(opts) {
|
|
120
142
|
return new this(opts);
|
|
121
143
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { O as OssBase, a as OssService, b as OssBaseOptions, L as ListFileObject, c as ListObjectResult } from '../index-BNtwSChY.js';
|
|
2
1
|
import * as minio_dist_esm_internal_type_mjs from 'minio/dist/esm/internal/type.mjs';
|
|
2
|
+
import { O as OssBase, b as OssService, a as OssBaseOptions, L as ListFileObject, c as ListObjectResult } from '../index-CQoepWCw.js';
|
|
3
3
|
import 'minio';
|
|
4
4
|
import 'stream';
|
|
5
5
|
|
package/dist/services/config.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/util/hash.ts
|
|
2
|
-
import crypto from "crypto";
|
|
2
|
+
import crypto from "node:crypto";
|
|
3
3
|
var hash = (str) => {
|
|
4
4
|
let hashStr;
|
|
5
5
|
if (typeof str === "object") {
|
|
@@ -13,6 +13,22 @@ var hashSringify = (str) => {
|
|
|
13
13
|
return JSON.stringify(str, null, 2);
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
+
// src/core/copy-object.ts
|
|
17
|
+
import { CopyDestinationOptions, CopySourceOptions } from "minio";
|
|
18
|
+
var copyObject = async ({ bucketName, newMetadata, objectName, client }) => {
|
|
19
|
+
const source = new CopySourceOptions({ Bucket: bucketName, Object: objectName });
|
|
20
|
+
const stat = await client.statObject(bucketName, objectName);
|
|
21
|
+
const sourceMetadata = stat.metaData;
|
|
22
|
+
const destination = new CopyDestinationOptions({
|
|
23
|
+
Bucket: bucketName,
|
|
24
|
+
Object: objectName,
|
|
25
|
+
UserMetadata: { ...sourceMetadata, ...newMetadata },
|
|
26
|
+
MetadataDirective: "REPLACE"
|
|
27
|
+
});
|
|
28
|
+
const copyResult = await client.copyObject(source, destination);
|
|
29
|
+
return copyResult;
|
|
30
|
+
};
|
|
31
|
+
|
|
16
32
|
// src/index.ts
|
|
17
33
|
var OssBase = class {
|
|
18
34
|
client;
|
|
@@ -28,7 +44,7 @@ var OssBase = class {
|
|
|
28
44
|
}
|
|
29
45
|
this.bucketName = opts.bucketName;
|
|
30
46
|
this.client = opts.client;
|
|
31
|
-
this.prefix = opts
|
|
47
|
+
this.prefix = opts?.prefix ?? "";
|
|
32
48
|
}
|
|
33
49
|
setPrefix(prefix) {
|
|
34
50
|
this.prefix = prefix;
|
|
@@ -60,12 +76,14 @@ var OssBase = class {
|
|
|
60
76
|
}
|
|
61
77
|
async putObject(objectName, data, metaData) {
|
|
62
78
|
let putData;
|
|
79
|
+
let size;
|
|
63
80
|
if (typeof data === "object") {
|
|
64
81
|
putData = JSON.stringify(data);
|
|
65
|
-
|
|
82
|
+
size = putData.length;
|
|
83
|
+
} else if (typeof data === "string") {
|
|
66
84
|
putData = data;
|
|
85
|
+
size = putData.length;
|
|
67
86
|
}
|
|
68
|
-
const size = putData.length;
|
|
69
87
|
const bucketName = this.bucketName;
|
|
70
88
|
const obj = await this.client.putObject(bucketName, `${this.prefix}${objectName}`, putData, size, metaData);
|
|
71
89
|
return obj;
|
|
@@ -119,6 +137,10 @@ var OssBase = class {
|
|
|
119
137
|
const obj = await this.client.copyObject(bucketName, sourceObject, targetObject);
|
|
120
138
|
return obj;
|
|
121
139
|
}
|
|
140
|
+
async replaceObject(objectName, meta) {
|
|
141
|
+
const { bucketName, client } = this;
|
|
142
|
+
return copyObject({ bucketName, client, objectName: `${this.prefix}${objectName}`, newMetadata: meta });
|
|
143
|
+
}
|
|
122
144
|
static create(opts) {
|
|
123
145
|
return new this(opts);
|
|
124
146
|
}
|
package/dist/services/index.d.ts
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
|
-
|
|
1
|
+
import { O as OssBase } from '../index-CQoepWCw.js';
|
|
2
|
+
export { a as OssBaseOptions } from '../index-CQoepWCw.js';
|
|
2
3
|
export { ConfigOssService } from './config.js';
|
|
4
|
+
import * as stream from 'stream';
|
|
5
|
+
import { ServerResponse } from 'node:http';
|
|
3
6
|
import 'minio';
|
|
4
7
|
import 'minio/dist/esm/internal/type.mjs';
|
|
5
|
-
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 过滤 metaData 中的 key, 去除 password, accesskey, secretkey,
|
|
11
|
+
* 并返回过滤后的 metaData
|
|
12
|
+
* @param metaData
|
|
13
|
+
* @returns
|
|
14
|
+
*/
|
|
15
|
+
declare const filterMetaDataKeys: (metaData: Record<string, string>, clearKeys?: string[]) => Record<string, string>;
|
|
16
|
+
type SendObjectOptions = {
|
|
17
|
+
res: ServerResponse;
|
|
18
|
+
client: OssBase;
|
|
19
|
+
objectName: string;
|
|
20
|
+
isDownload?: boolean;
|
|
21
|
+
};
|
|
22
|
+
declare const NotFoundFile: (res: ServerResponse, msg?: string, code?: number) => void;
|
|
23
|
+
declare const sendObject: ({ res, objectName, client, isDownload }: SendObjectOptions) => Promise<void>;
|
|
24
|
+
declare const downloadObject: ({ objectName, client, filePath }: Pick<SendObjectOptions, "objectName" | "client"> & {
|
|
25
|
+
filePath: string;
|
|
26
|
+
}) => Promise<stream.Readable>;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 计算字符串的md5值
|
|
30
|
+
* @param str
|
|
31
|
+
* @returns
|
|
32
|
+
*/
|
|
33
|
+
declare const hash: (str: string | Buffer | Object) => string;
|
|
34
|
+
declare const hashSringify: (str: Object) => string;
|
|
35
|
+
|
|
36
|
+
export { NotFoundFile, OssBase, downloadObject, filterMetaDataKeys, hash, hashSringify, sendObject };
|
package/dist/services/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/util/hash.ts
|
|
2
|
-
import crypto from "crypto";
|
|
2
|
+
import crypto from "node:crypto";
|
|
3
3
|
var hash = (str) => {
|
|
4
4
|
let hashStr;
|
|
5
5
|
if (typeof str === "object") {
|
|
@@ -13,6 +13,22 @@ var hashSringify = (str) => {
|
|
|
13
13
|
return JSON.stringify(str, null, 2);
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
+
// src/core/copy-object.ts
|
|
17
|
+
import { CopyDestinationOptions, CopySourceOptions } from "minio";
|
|
18
|
+
var copyObject = async ({ bucketName, newMetadata, objectName, client }) => {
|
|
19
|
+
const source = new CopySourceOptions({ Bucket: bucketName, Object: objectName });
|
|
20
|
+
const stat = await client.statObject(bucketName, objectName);
|
|
21
|
+
const sourceMetadata = stat.metaData;
|
|
22
|
+
const destination = new CopyDestinationOptions({
|
|
23
|
+
Bucket: bucketName,
|
|
24
|
+
Object: objectName,
|
|
25
|
+
UserMetadata: { ...sourceMetadata, ...newMetadata },
|
|
26
|
+
MetadataDirective: "REPLACE"
|
|
27
|
+
});
|
|
28
|
+
const copyResult = await client.copyObject(source, destination);
|
|
29
|
+
return copyResult;
|
|
30
|
+
};
|
|
31
|
+
|
|
16
32
|
// src/index.ts
|
|
17
33
|
var OssBase = class {
|
|
18
34
|
client;
|
|
@@ -28,7 +44,7 @@ var OssBase = class {
|
|
|
28
44
|
}
|
|
29
45
|
this.bucketName = opts.bucketName;
|
|
30
46
|
this.client = opts.client;
|
|
31
|
-
this.prefix = opts
|
|
47
|
+
this.prefix = opts?.prefix ?? "";
|
|
32
48
|
}
|
|
33
49
|
setPrefix(prefix) {
|
|
34
50
|
this.prefix = prefix;
|
|
@@ -60,12 +76,14 @@ var OssBase = class {
|
|
|
60
76
|
}
|
|
61
77
|
async putObject(objectName, data, metaData) {
|
|
62
78
|
let putData;
|
|
79
|
+
let size;
|
|
63
80
|
if (typeof data === "object") {
|
|
64
81
|
putData = JSON.stringify(data);
|
|
65
|
-
|
|
82
|
+
size = putData.length;
|
|
83
|
+
} else if (typeof data === "string") {
|
|
66
84
|
putData = data;
|
|
85
|
+
size = putData.length;
|
|
67
86
|
}
|
|
68
|
-
const size = putData.length;
|
|
69
87
|
const bucketName = this.bucketName;
|
|
70
88
|
const obj = await this.client.putObject(bucketName, `${this.prefix}${objectName}`, putData, size, metaData);
|
|
71
89
|
return obj;
|
|
@@ -119,6 +137,10 @@ var OssBase = class {
|
|
|
119
137
|
const obj = await this.client.copyObject(bucketName, sourceObject, targetObject);
|
|
120
138
|
return obj;
|
|
121
139
|
}
|
|
140
|
+
async replaceObject(objectName, meta) {
|
|
141
|
+
const { bucketName, client } = this;
|
|
142
|
+
return copyObject({ bucketName, client, objectName: `${this.prefix}${objectName}`, newMetadata: meta });
|
|
143
|
+
}
|
|
122
144
|
static create(opts) {
|
|
123
145
|
return new this(opts);
|
|
124
146
|
}
|
|
@@ -193,7 +215,69 @@ var ConfigOssService = class extends OssBase {
|
|
|
193
215
|
return { list: listKeys, keys, keyEtagMap };
|
|
194
216
|
}
|
|
195
217
|
};
|
|
218
|
+
|
|
219
|
+
// src/util/download.ts
|
|
220
|
+
import fs from "node:fs";
|
|
221
|
+
import path from "node:path";
|
|
222
|
+
var viewableExtensions = ["jpg", "jpeg", "png", "gif", "svg", "webp", "mp4", "webm", "mp3", "wav", "ogg", "pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx"];
|
|
223
|
+
var filterMetaDataKeys = (metaData, clearKeys = []) => {
|
|
224
|
+
const keys = Object.keys(metaData);
|
|
225
|
+
const removeKeys = ["password", "accesskey", "secretkey", ...clearKeys];
|
|
226
|
+
const filteredKeys = keys.filter((key) => !removeKeys.includes(key));
|
|
227
|
+
return filteredKeys.reduce((acc, key) => {
|
|
228
|
+
acc[key] = metaData[key];
|
|
229
|
+
return acc;
|
|
230
|
+
}, {});
|
|
231
|
+
};
|
|
232
|
+
var NotFoundFile = (res, msg, code = 404) => {
|
|
233
|
+
res.writeHead(code, { "Content-Type": "text/plain" });
|
|
234
|
+
res.end(msg || "Not Found File");
|
|
235
|
+
return;
|
|
236
|
+
};
|
|
237
|
+
var sendObject = async ({ res, objectName, client, isDownload = false }) => {
|
|
238
|
+
let stat;
|
|
239
|
+
try {
|
|
240
|
+
stat = await client.statObject(objectName);
|
|
241
|
+
} catch (e) {
|
|
242
|
+
} finally {
|
|
243
|
+
if (!stat || stat.size === 0) {
|
|
244
|
+
return NotFoundFile(res);
|
|
245
|
+
}
|
|
246
|
+
const contentLength = stat.size;
|
|
247
|
+
const etag = stat.etag;
|
|
248
|
+
const lastModified = stat.lastModified.toISOString();
|
|
249
|
+
const filename = objectName.split("/").pop() || "no-file-name-download";
|
|
250
|
+
const fileExtension = filename.split(".").pop()?.toLowerCase() || "";
|
|
251
|
+
const filteredMetaData = filterMetaDataKeys(stat.metaData, ["size", "etag", "last-modified"]);
|
|
252
|
+
const contentDisposition = viewableExtensions.includes(fileExtension) && !isDownload ? "inline" : `attachment; filename="${filename}"`;
|
|
253
|
+
res.writeHead(200, {
|
|
254
|
+
"Content-Length": contentLength,
|
|
255
|
+
etag,
|
|
256
|
+
"last-modified": lastModified,
|
|
257
|
+
"Content-Disposition": contentDisposition,
|
|
258
|
+
"file-name": filename,
|
|
259
|
+
...filteredMetaData
|
|
260
|
+
});
|
|
261
|
+
const objectStream = await client.getObject(objectName);
|
|
262
|
+
objectStream.pipe(res, { end: true });
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
var downloadObject = async ({ objectName, client, filePath }) => {
|
|
266
|
+
const objectStream = await client.getObject(objectName);
|
|
267
|
+
const dir = path.dirname(filePath);
|
|
268
|
+
if (!fs.existsSync(dir)) {
|
|
269
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
270
|
+
}
|
|
271
|
+
objectStream.pipe(fs.createWriteStream(filePath));
|
|
272
|
+
return objectStream;
|
|
273
|
+
};
|
|
196
274
|
export {
|
|
197
275
|
ConfigOssService,
|
|
198
|
-
|
|
276
|
+
NotFoundFile,
|
|
277
|
+
OssBase,
|
|
278
|
+
downloadObject,
|
|
279
|
+
filterMetaDataKeys,
|
|
280
|
+
hash,
|
|
281
|
+
hashSringify,
|
|
282
|
+
sendObject
|
|
199
283
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kevisual/oss",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -16,13 +16,23 @@
|
|
|
16
16
|
"license": "MIT",
|
|
17
17
|
"type": "module",
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"dotenv": "^16.
|
|
19
|
+
"dotenv": "^16.5.0",
|
|
20
20
|
"minio": "^8.0.5",
|
|
21
21
|
"tsup": "^8.4.0"
|
|
22
22
|
},
|
|
23
23
|
"exports": {
|
|
24
|
-
"
|
|
25
|
-
|
|
24
|
+
".": {
|
|
25
|
+
"import": "./dist/index.js",
|
|
26
|
+
"types": "./dist/index.d.ts"
|
|
27
|
+
},
|
|
28
|
+
"./config": {
|
|
29
|
+
"import": "./dist/services/config.js",
|
|
30
|
+
"types": "./dist/services/config.d.ts"
|
|
31
|
+
},
|
|
32
|
+
"./services": {
|
|
33
|
+
"import": "./dist/services/index.js",
|
|
34
|
+
"types": "./dist/services/index.d.ts"
|
|
35
|
+
}
|
|
26
36
|
},
|
|
27
37
|
"publishConfig": {
|
|
28
38
|
"access": "public"
|