@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.
@@ -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 OssService as a, type OssBaseOptions as b, type ListObjectResult as c };
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
@@ -1,4 +1,4 @@
1
1
  import 'minio';
2
2
  import 'minio/dist/esm/internal/type.mjs';
3
3
  import 'stream';
4
- export { O as OssBase, b as OssBaseOptions } from './index-BNtwSChY.js';
4
+ export { O as OssBase, a as OssBaseOptions } from './index-CQoepWCw.js';
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.prefix;
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
- } else {
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
 
@@ -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.prefix;
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
- } else {
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
  }
@@ -1,5 +1,36 @@
1
- export { O as OssBase, b as OssBaseOptions } from '../index-BNtwSChY.js';
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
- import 'stream';
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 };
@@ -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.prefix;
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
- } else {
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
- OssBase
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.1",
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.4.7",
19
+ "dotenv": "^16.5.0",
20
20
  "minio": "^8.0.5",
21
21
  "tsup": "^8.4.0"
22
22
  },
23
23
  "exports": {
24
- "./*": "./dist/*.js",
25
- "./services": "./dist/services/index.js"
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"