sonamu 0.7.26 → 0.7.27

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.
@@ -7,6 +7,7 @@ export declare class UploadedFile {
7
7
  private _file;
8
8
  private _buffer?;
9
9
  private _url?;
10
+ private _signedUrl?;
10
11
  constructor(file: MultipartFile);
11
12
  /** 원본 파일명 */
12
13
  get filename(): string;
@@ -16,8 +17,10 @@ export declare class UploadedFile {
16
17
  get size(): number;
17
18
  /** 확장자 (점 제외) */
18
19
  get extname(): string | false;
19
- /** saveToDisk 후 저장된 URL */
20
+ /** saveToDisk 후 저장된 URL (Unsigned) */
20
21
  get url(): string | undefined;
22
+ /** saveToDisk 후 저장된 URL (Signed) */
23
+ get signedUrl(): string | undefined;
21
24
  /** Buffer로 변환 (캐싱됨) */
22
25
  toBuffer(): Promise<Buffer>;
23
26
  /** MD5 해시 계산 */
@@ -1 +1 @@
1
- {"version":3,"file":"uploaded-file.d.ts","sourceRoot":"","sources":["../../src/storage/uploaded-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,IAAI,CAAC,CAAS;gBAEV,IAAI,EAAE,aAAa;IAI/B,aAAa;IACb,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,cAAc;IACd,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,oBAAoB;IACpB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,iBAAiB;IACjB,IAAI,OAAO,IAAI,MAAM,GAAG,KAAK,CAE5B;IAED,2BAA2B;IAC3B,IAAI,GAAG,IAAI,MAAM,GAAG,SAAS,CAE5B;IAED,uBAAuB;IACjB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAOjC,gBAAgB;IACV,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;IAK5B;;;;;OAKG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAcpE,0BAA0B;IAC1B,IAAI,GAAG,IAAI,aAAa,CAEvB;CACF"}
1
+ {"version":3,"file":"uploaded-file.d.ts","sourceRoot":"","sources":["../../src/storage/uploaded-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,IAAI,CAAC,CAAS;IACtB,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,IAAI,EAAE,aAAa;IAI/B,aAAa;IACb,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,cAAc;IACd,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,oBAAoB;IACpB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,iBAAiB;IACjB,IAAI,OAAO,IAAI,MAAM,GAAG,KAAK,CAE5B;IAED,sCAAsC;IACtC,IAAI,GAAG,IAAI,MAAM,GAAG,SAAS,CAE5B;IAED,oCAAoC;IACpC,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,uBAAuB;IACjB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAOjC,gBAAgB;IACV,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;IAK5B;;;;;OAKG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBpE,0BAA0B;IAC1B,IAAI,GAAG,IAAI,aAAa,CAEvB;CACF"}
@@ -6,6 +6,7 @@ import mime from "mime-types";
6
6
  _file;
7
7
  _buffer;
8
8
  _url;
9
+ _signedUrl;
9
10
  constructor(file){
10
11
  this._file = file;
11
12
  }
@@ -21,9 +22,12 @@ import mime from "mime-types";
21
22
  /** 확장자 (점 제외) */ get extname() {
22
23
  return mime.extension(this._file.mimetype);
23
24
  }
24
- /** saveToDisk 후 저장된 URL */ get url() {
25
+ /** saveToDisk 후 저장된 URL (Unsigned) */ get url() {
25
26
  return this._url;
26
27
  }
28
+ /** saveToDisk 후 저장된 URL (Signed) */ get signedUrl() {
29
+ return this._signedUrl;
30
+ }
27
31
  /** Buffer로 변환 (캐싱됨) */ async toBuffer() {
28
32
  if (!this._buffer) {
29
33
  this._buffer = await this._file.toBuffer();
@@ -47,7 +51,9 @@ import mime from "mime-types";
47
51
  await disk.put(key, new Uint8Array(buffer), {
48
52
  contentType: this.mimetype
49
53
  });
50
- this._url = await disk.getSignedUrl(key);
54
+ this._url = await disk.getUrl(key);
55
+ this._signedUrl = await disk.getSignedUrl(key);
56
+ // signed url은 만료 시간이 있기 때문에, unsigned url을 반환합니다.
51
57
  return this._url;
52
58
  }
53
59
  /** 원본 MultipartFile 접근 */ get raw() {
@@ -55,4 +61,4 @@ import mime from "mime-types";
55
61
  }
56
62
  }
57
63
 
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlL3VwbG9hZGVkLWZpbGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBNdWx0aXBhcnRGaWxlIH0gZnJvbSBcIkBmYXN0aWZ5L211bHRpcGFydFwiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBtaW1lIGZyb20gXCJtaW1lLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IERyaXZlcktleSB9IGZyb20gXCIuL2RyaXZlcnNcIjtcblxuLyoqXG4gKiDsl4XroZzrk5zrkJwg7YyM7J28IOuemO2NvFxuICovXG5leHBvcnQgY2xhc3MgVXBsb2FkZWRGaWxlIHtcbiAgcHJpdmF0ZSBfZmlsZTogTXVsdGlwYXJ0RmlsZTtcbiAgcHJpdmF0ZSBfYnVmZmVyPzogQnVmZmVyO1xuICBwcml2YXRlIF91cmw/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZmlsZTogTXVsdGlwYXJ0RmlsZSkge1xuICAgIHRoaXMuX2ZpbGUgPSBmaWxlO1xuICB9XG5cbiAgLyoqIOybkOuzuCDtjIzsnbzrqoUgKi9cbiAgZ2V0IGZpbGVuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGUuZmlsZW5hbWU7XG4gIH1cblxuICAvKiogTUlNRSDtg4DsnoUgKi9cbiAgZ2V0IG1pbWV0eXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGUubWltZXR5cGU7XG4gIH1cblxuICAvKiog7YyM7J28IO2BrOq4sCAoYnl0ZXMpICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGUuZmlsZS5ieXRlc1JlYWQ7XG4gIH1cblxuICAvKiog7ZmV7J6l7J6QICjsoJAg7KCc7Jm4KSAqL1xuICBnZXQgZXh0bmFtZSgpOiBzdHJpbmcgfCBmYWxzZSB7XG4gICAgcmV0dXJuIG1pbWUuZXh0ZW5zaW9uKHRoaXMuX2ZpbGUubWltZXR5cGUpO1xuICB9XG5cbiAgLyoqIHNhdmVUb0Rpc2sg7ZuEIOyggOyepeuQnCBVUkwgKi9cbiAgZ2V0IHVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cblxuICAvKiogQnVmZmVy66GcIOuzgO2ZmCAo7LqQ7Iux65CoKSAqL1xuICBhc3luYyB0b0J1ZmZlcigpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGlmICghdGhpcy5fYnVmZmVyKSB7XG4gICAgICB0aGlzLl9idWZmZXIgPSBhd2FpdCB0aGlzLl9maWxlLnRvQnVmZmVyKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9idWZmZXI7XG4gIH1cblxuICAvKiogTUQ1IO2VtOyLnCDqs4TsgrAgKi9cbiAgYXN5bmMgbWQ1KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYnVmZmVyID0gYXdhaXQgdGhpcy50b0J1ZmZlcigpO1xuICAgIHJldHVybiBjcmVhdGVIYXNoKFwibWQ1XCIpLnVwZGF0ZShidWZmZXIpLmRpZ2VzdChcImhleFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtjIzsnbzsnYQg65SU7Iqk7YGs7JeQIOyggOyepVxuICAgKiBAcGFyYW0ga2V5IOyggOyepSDqsr3roZwgKOyYiDogJ3VwbG9hZHMvYXZhdGFyLnBuZycpXG4gICAqIEBwYXJhbSBkaXNrTmFtZSDrlJTsiqTtgawg7J2066aEICjquLDrs7g6IGRlZmF1bHQgZGlzaylcbiAgICogQHJldHVybnMg7KCA7J6l65CcIO2MjOydvOydmCBVUkxcbiAgICovXG4gIGFzeW5jIHNhdmVUb0Rpc2soa2V5OiBzdHJpbmcsIGRpc2tOYW1lPzogRHJpdmVyS2V5KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyDsiJztmZgg7J2Y7KG07ISxIOuwqeyngOulvCDsnITtlbQg64+Z7KCBIGltcG9ydFxuICAgIGNvbnN0IHsgU29uYW11IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9hcGkvc29uYW11XCIpO1xuICAgIGNvbnN0IGRpc2sgPSBTb25hbXUuc3RvcmFnZS51c2UoZGlza05hbWUpO1xuICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHRoaXMudG9CdWZmZXIoKTtcblxuICAgIGF3YWl0IGRpc2sucHV0KGtleSwgbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSwge1xuICAgICAgY29udGVudFR5cGU6IHRoaXMubWltZXR5cGUsXG4gICAgfSk7XG5cbiAgICB0aGlzLl91cmwgPSBhd2FpdCBkaXNrLmdldFNpZ25lZFVybChrZXkpO1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cblxuICAvKiog7JuQ67O4IE11bHRpcGFydEZpbGUg7KCR6re8ICovXG4gIGdldCByYXcoKTogTXVsdGlwYXJ0RmlsZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGU7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJjcmVhdGVIYXNoIiwibWltZSIsIlVwbG9hZGVkRmlsZSIsIl9maWxlIiwiX2J1ZmZlciIsIl91cmwiLCJmaWxlIiwiZmlsZW5hbWUiLCJtaW1ldHlwZSIsInNpemUiLCJieXRlc1JlYWQiLCJleHRuYW1lIiwiZXh0ZW5zaW9uIiwidXJsIiwidG9CdWZmZXIiLCJtZDUiLCJidWZmZXIiLCJ1cGRhdGUiLCJkaWdlc3QiLCJzYXZlVG9EaXNrIiwia2V5IiwiZGlza05hbWUiLCJTb25hbXUiLCJkaXNrIiwic3RvcmFnZSIsInVzZSIsInB1dCIsIlVpbnQ4QXJyYXkiLCJjb250ZW50VHlwZSIsImdldFNpZ25lZFVybCIsInJhdyJdLCJtYXBwaW5ncyI6IkFBQ0EsU0FBU0EsVUFBVSxRQUFRLFNBQVM7QUFDcEMsT0FBT0MsVUFBVSxhQUFhO0FBRzlCOztDQUVDLEdBQ0QsT0FBTyxNQUFNQztJQUNIQyxNQUFxQjtJQUNyQkMsUUFBaUI7SUFDakJDLEtBQWM7SUFFdEIsWUFBWUMsSUFBbUIsQ0FBRTtRQUMvQixJQUFJLENBQUNILEtBQUssR0FBR0c7SUFDZjtJQUVBLFdBQVcsR0FDWCxJQUFJQyxXQUFtQjtRQUNyQixPQUFPLElBQUksQ0FBQ0osS0FBSyxDQUFDSSxRQUFRO0lBQzVCO0lBRUEsWUFBWSxHQUNaLElBQUlDLFdBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDTCxLQUFLLENBQUNLLFFBQVE7SUFDNUI7SUFFQSxrQkFBa0IsR0FDbEIsSUFBSUMsT0FBZTtRQUNqQixPQUFPLElBQUksQ0FBQ04sS0FBSyxDQUFDRyxJQUFJLENBQUNJLFNBQVM7SUFDbEM7SUFFQSxlQUFlLEdBQ2YsSUFBSUMsVUFBMEI7UUFDNUIsT0FBT1YsS0FBS1csU0FBUyxDQUFDLElBQUksQ0FBQ1QsS0FBSyxDQUFDSyxRQUFRO0lBQzNDO0lBRUEseUJBQXlCLEdBQ3pCLElBQUlLLE1BQTBCO1FBQzVCLE9BQU8sSUFBSSxDQUFDUixJQUFJO0lBQ2xCO0lBRUEscUJBQXFCLEdBQ3JCLE1BQU1TLFdBQTRCO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUNWLE9BQU8sRUFBRTtZQUNqQixJQUFJLENBQUNBLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQ0QsS0FBSyxDQUFDVyxRQUFRO1FBQzFDO1FBQ0EsT0FBTyxJQUFJLENBQUNWLE9BQU87SUFDckI7SUFFQSxjQUFjLEdBQ2QsTUFBTVcsTUFBdUI7UUFDM0IsTUFBTUMsU0FBUyxNQUFNLElBQUksQ0FBQ0YsUUFBUTtRQUNsQyxPQUFPZCxXQUFXLE9BQU9pQixNQUFNLENBQUNELFFBQVFFLE1BQU0sQ0FBQztJQUNqRDtJQUVBOzs7OztHQUtDLEdBQ0QsTUFBTUMsV0FBV0MsR0FBVyxFQUFFQyxRQUFvQixFQUFtQjtRQUNuRSwwQkFBMEI7UUFDMUIsTUFBTSxFQUFFQyxNQUFNLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQztRQUNoQyxNQUFNQyxPQUFPRCxPQUFPRSxPQUFPLENBQUNDLEdBQUcsQ0FBQ0o7UUFDaEMsTUFBTUwsU0FBUyxNQUFNLElBQUksQ0FBQ0YsUUFBUTtRQUVsQyxNQUFNUyxLQUFLRyxHQUFHLENBQUNOLEtBQUssSUFBSU8sV0FBV1gsU0FBUztZQUMxQ1ksYUFBYSxJQUFJLENBQUNwQixRQUFRO1FBQzVCO1FBRUEsSUFBSSxDQUFDSCxJQUFJLEdBQUcsTUFBTWtCLEtBQUtNLFlBQVksQ0FBQ1Q7UUFDcEMsT0FBTyxJQUFJLENBQUNmLElBQUk7SUFDbEI7SUFFQSx3QkFBd0IsR0FDeEIsSUFBSXlCLE1BQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDM0IsS0FBSztJQUNuQjtBQUNGIn0=
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlL3VwbG9hZGVkLWZpbGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBNdWx0aXBhcnRGaWxlIH0gZnJvbSBcIkBmYXN0aWZ5L211bHRpcGFydFwiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBtaW1lIGZyb20gXCJtaW1lLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IERyaXZlcktleSB9IGZyb20gXCIuL2RyaXZlcnNcIjtcblxuLyoqXG4gKiDsl4XroZzrk5zrkJwg7YyM7J28IOuemO2NvFxuICovXG5leHBvcnQgY2xhc3MgVXBsb2FkZWRGaWxlIHtcbiAgcHJpdmF0ZSBfZmlsZTogTXVsdGlwYXJ0RmlsZTtcbiAgcHJpdmF0ZSBfYnVmZmVyPzogQnVmZmVyO1xuICBwcml2YXRlIF91cmw/OiBzdHJpbmc7XG4gIHByaXZhdGUgX3NpZ25lZFVybD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihmaWxlOiBNdWx0aXBhcnRGaWxlKSB7XG4gICAgdGhpcy5fZmlsZSA9IGZpbGU7XG4gIH1cblxuICAvKiog7JuQ67O4IO2MjOydvOuqhSAqL1xuICBnZXQgZmlsZW5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZS5maWxlbmFtZTtcbiAgfVxuXG4gIC8qKiBNSU1FIO2DgOyehSAqL1xuICBnZXQgbWltZXR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZS5taW1ldHlwZTtcbiAgfVxuXG4gIC8qKiDtjIzsnbwg7YGs6riwIChieXRlcykgKi9cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZS5maWxlLmJ5dGVzUmVhZDtcbiAgfVxuXG4gIC8qKiDtmZXsnqXsnpAgKOygkCDsoJzsmbgpICovXG4gIGdldCBleHRuYW1lKCk6IHN0cmluZyB8IGZhbHNlIHtcbiAgICByZXR1cm4gbWltZS5leHRlbnNpb24odGhpcy5fZmlsZS5taW1ldHlwZSk7XG4gIH1cblxuICAvKiogc2F2ZVRvRGlzayDtm4Qg7KCA7J6l65CcIFVSTCAoVW5zaWduZWQpICovXG4gIGdldCB1cmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsO1xuICB9XG5cbiAgLyoqIHNhdmVUb0Rpc2sg7ZuEIOyggOyepeuQnCBVUkwgKFNpZ25lZCkgKi9cbiAgZ2V0IHNpZ25lZFVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zaWduZWRVcmw7XG4gIH1cblxuICAvKiogQnVmZmVy66GcIOuzgO2ZmCAo7LqQ7Iux65CoKSAqL1xuICBhc3luYyB0b0J1ZmZlcigpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGlmICghdGhpcy5fYnVmZmVyKSB7XG4gICAgICB0aGlzLl9idWZmZXIgPSBhd2FpdCB0aGlzLl9maWxlLnRvQnVmZmVyKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9idWZmZXI7XG4gIH1cblxuICAvKiogTUQ1IO2VtOyLnCDqs4TsgrAgKi9cbiAgYXN5bmMgbWQ1KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYnVmZmVyID0gYXdhaXQgdGhpcy50b0J1ZmZlcigpO1xuICAgIHJldHVybiBjcmVhdGVIYXNoKFwibWQ1XCIpLnVwZGF0ZShidWZmZXIpLmRpZ2VzdChcImhleFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtjIzsnbzsnYQg65SU7Iqk7YGs7JeQIOyggOyepVxuICAgKiBAcGFyYW0ga2V5IOyggOyepSDqsr3roZwgKOyYiDogJ3VwbG9hZHMvYXZhdGFyLnBuZycpXG4gICAqIEBwYXJhbSBkaXNrTmFtZSDrlJTsiqTtgawg7J2066aEICjquLDrs7g6IGRlZmF1bHQgZGlzaylcbiAgICogQHJldHVybnMg7KCA7J6l65CcIO2MjOydvOydmCBVUkxcbiAgICovXG4gIGFzeW5jIHNhdmVUb0Rpc2soa2V5OiBzdHJpbmcsIGRpc2tOYW1lPzogRHJpdmVyS2V5KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyDsiJztmZgg7J2Y7KG07ISxIOuwqeyngOulvCDsnITtlbQg64+Z7KCBIGltcG9ydFxuICAgIGNvbnN0IHsgU29uYW11IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9hcGkvc29uYW11XCIpO1xuICAgIGNvbnN0IGRpc2sgPSBTb25hbXUuc3RvcmFnZS51c2UoZGlza05hbWUpO1xuICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHRoaXMudG9CdWZmZXIoKTtcblxuICAgIGF3YWl0IGRpc2sucHV0KGtleSwgbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSwge1xuICAgICAgY29udGVudFR5cGU6IHRoaXMubWltZXR5cGUsXG4gICAgfSk7XG5cbiAgICB0aGlzLl91cmwgPSBhd2FpdCBkaXNrLmdldFVybChrZXkpO1xuICAgIHRoaXMuX3NpZ25lZFVybCA9IGF3YWl0IGRpc2suZ2V0U2lnbmVkVXJsKGtleSk7XG5cbiAgICAvLyBzaWduZWQgdXJs7J2AIOunjOujjCDsi5zqsITsnbQg7J6I6riwIOuVjOusuOyXkCwgdW5zaWduZWQgdXJs7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcy5fdXJsO1xuICB9XG5cbiAgLyoqIOybkOuzuCBNdWx0aXBhcnRGaWxlIOygkeq3vCAqL1xuICBnZXQgcmF3KCk6IE11bHRpcGFydEZpbGUge1xuICAgIHJldHVybiB0aGlzLl9maWxlO1xuICB9XG59XG4iXSwibmFtZXMiOlsiY3JlYXRlSGFzaCIsIm1pbWUiLCJVcGxvYWRlZEZpbGUiLCJfZmlsZSIsIl9idWZmZXIiLCJfdXJsIiwiX3NpZ25lZFVybCIsImZpbGUiLCJmaWxlbmFtZSIsIm1pbWV0eXBlIiwic2l6ZSIsImJ5dGVzUmVhZCIsImV4dG5hbWUiLCJleHRlbnNpb24iLCJ1cmwiLCJzaWduZWRVcmwiLCJ0b0J1ZmZlciIsIm1kNSIsImJ1ZmZlciIsInVwZGF0ZSIsImRpZ2VzdCIsInNhdmVUb0Rpc2siLCJrZXkiLCJkaXNrTmFtZSIsIlNvbmFtdSIsImRpc2siLCJzdG9yYWdlIiwidXNlIiwicHV0IiwiVWludDhBcnJheSIsImNvbnRlbnRUeXBlIiwiZ2V0VXJsIiwiZ2V0U2lnbmVkVXJsIiwicmF3Il0sIm1hcHBpbmdzIjoiQUFDQSxTQUFTQSxVQUFVLFFBQVEsU0FBUztBQUNwQyxPQUFPQyxVQUFVLGFBQWE7QUFHOUI7O0NBRUMsR0FDRCxPQUFPLE1BQU1DO0lBQ0hDLE1BQXFCO0lBQ3JCQyxRQUFpQjtJQUNqQkMsS0FBYztJQUNkQyxXQUFvQjtJQUU1QixZQUFZQyxJQUFtQixDQUFFO1FBQy9CLElBQUksQ0FBQ0osS0FBSyxHQUFHSTtJQUNmO0lBRUEsV0FBVyxHQUNYLElBQUlDLFdBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDTCxLQUFLLENBQUNLLFFBQVE7SUFDNUI7SUFFQSxZQUFZLEdBQ1osSUFBSUMsV0FBbUI7UUFDckIsT0FBTyxJQUFJLENBQUNOLEtBQUssQ0FBQ00sUUFBUTtJQUM1QjtJQUVBLGtCQUFrQixHQUNsQixJQUFJQyxPQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDUCxLQUFLLENBQUNJLElBQUksQ0FBQ0ksU0FBUztJQUNsQztJQUVBLGVBQWUsR0FDZixJQUFJQyxVQUEwQjtRQUM1QixPQUFPWCxLQUFLWSxTQUFTLENBQUMsSUFBSSxDQUFDVixLQUFLLENBQUNNLFFBQVE7SUFDM0M7SUFFQSxvQ0FBb0MsR0FDcEMsSUFBSUssTUFBMEI7UUFDNUIsT0FBTyxJQUFJLENBQUNULElBQUk7SUFDbEI7SUFFQSxrQ0FBa0MsR0FDbEMsSUFBSVUsWUFBZ0M7UUFDbEMsT0FBTyxJQUFJLENBQUNULFVBQVU7SUFDeEI7SUFFQSxxQkFBcUIsR0FDckIsTUFBTVUsV0FBNEI7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQ1osT0FBTyxFQUFFO1lBQ2pCLElBQUksQ0FBQ0EsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDRCxLQUFLLENBQUNhLFFBQVE7UUFDMUM7UUFDQSxPQUFPLElBQUksQ0FBQ1osT0FBTztJQUNyQjtJQUVBLGNBQWMsR0FDZCxNQUFNYSxNQUF1QjtRQUMzQixNQUFNQyxTQUFTLE1BQU0sSUFBSSxDQUFDRixRQUFRO1FBQ2xDLE9BQU9oQixXQUFXLE9BQU9tQixNQUFNLENBQUNELFFBQVFFLE1BQU0sQ0FBQztJQUNqRDtJQUVBOzs7OztHQUtDLEdBQ0QsTUFBTUMsV0FBV0MsR0FBVyxFQUFFQyxRQUFvQixFQUFtQjtRQUNuRSwwQkFBMEI7UUFDMUIsTUFBTSxFQUFFQyxNQUFNLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQztRQUNoQyxNQUFNQyxPQUFPRCxPQUFPRSxPQUFPLENBQUNDLEdBQUcsQ0FBQ0o7UUFDaEMsTUFBTUwsU0FBUyxNQUFNLElBQUksQ0FBQ0YsUUFBUTtRQUVsQyxNQUFNUyxLQUFLRyxHQUFHLENBQUNOLEtBQUssSUFBSU8sV0FBV1gsU0FBUztZQUMxQ1ksYUFBYSxJQUFJLENBQUNyQixRQUFRO1FBQzVCO1FBRUEsSUFBSSxDQUFDSixJQUFJLEdBQUcsTUFBTW9CLEtBQUtNLE1BQU0sQ0FBQ1Q7UUFDOUIsSUFBSSxDQUFDaEIsVUFBVSxHQUFHLE1BQU1tQixLQUFLTyxZQUFZLENBQUNWO1FBRTFDLGtEQUFrRDtRQUNsRCxPQUFPLElBQUksQ0FBQ2pCLElBQUk7SUFDbEI7SUFFQSx3QkFBd0IsR0FDeEIsSUFBSTRCLE1BQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDOUIsS0FBSztJQUNuQjtBQUNGIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.7.26",
3
+ "version": "0.7.27",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "typescript",
@@ -106,10 +106,10 @@
106
106
  "vite": "7.3.0",
107
107
  "vitest": "^4.0.10",
108
108
  "zod": "^4.1.12",
109
- "@sonamu-kit/hmr-runner": "^0.1.1",
109
+ "@sonamu-kit/hmr-hook": "^0.4.1",
110
110
  "@sonamu-kit/tasks": "^0.1.2",
111
111
  "@sonamu-kit/ts-loader": "^2.1.3",
112
- "@sonamu-kit/hmr-hook": "^0.4.1"
112
+ "@sonamu-kit/hmr-runner": "^0.1.1"
113
113
  },
114
114
  "devDependencies": {
115
115
  "@biomejs/biome": "^2.3.10",
@@ -10,6 +10,7 @@ export class UploadedFile {
10
10
  private _file: MultipartFile;
11
11
  private _buffer?: Buffer;
12
12
  private _url?: string;
13
+ private _signedUrl?: string;
13
14
 
14
15
  constructor(file: MultipartFile) {
15
16
  this._file = file;
@@ -35,11 +36,16 @@ export class UploadedFile {
35
36
  return mime.extension(this._file.mimetype);
36
37
  }
37
38
 
38
- /** saveToDisk 후 저장된 URL */
39
+ /** saveToDisk 후 저장된 URL (Unsigned) */
39
40
  get url(): string | undefined {
40
41
  return this._url;
41
42
  }
42
43
 
44
+ /** saveToDisk 후 저장된 URL (Signed) */
45
+ get signedUrl(): string | undefined {
46
+ return this._signedUrl;
47
+ }
48
+
43
49
  /** Buffer로 변환 (캐싱됨) */
44
50
  async toBuffer(): Promise<Buffer> {
45
51
  if (!this._buffer) {
@@ -70,7 +76,10 @@ export class UploadedFile {
70
76
  contentType: this.mimetype,
71
77
  });
72
78
 
73
- this._url = await disk.getSignedUrl(key);
79
+ this._url = await disk.getUrl(key);
80
+ this._signedUrl = await disk.getSignedUrl(key);
81
+
82
+ // signed url은 만료 시간이 있기 때문에, unsigned url을 반환합니다.
74
83
  return this._url;
75
84
  }
76
85