@exabugs/dynamodb-client 1.5.1 → 1.5.3
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/CHANGELOG.md +32 -0
- package/dist/server/handler.cjs +10866 -6882
- package/dist/server/handler.cjs.map +4 -4
- package/dist/server/media/magicBytes.d.ts +25 -0
- package/dist/server/media/magicBytes.d.ts.map +1 -0
- package/dist/server/media/magicBytes.js +50 -0
- package/dist/server/media/magicBytes.js.map +1 -0
- package/dist/server/media/media-handler.d.ts +13 -0
- package/dist/server/media/media-handler.d.ts.map +1 -0
- package/dist/server/media/media-handler.js +143 -0
- package/dist/server/media/media-handler.js.map +1 -0
- package/dist/server/media/presign.d.ts +9 -0
- package/dist/server/media/presign.d.ts.map +1 -0
- package/dist/server/media/presign.js +73 -0
- package/dist/server/media/presign.js.map +1 -0
- package/dist/server/media/process-handler-dlq.d.ts +16 -0
- package/dist/server/media/process-handler-dlq.d.ts.map +1 -0
- package/dist/server/media/process-handler-dlq.js +52 -0
- package/dist/server/media/process-handler-dlq.js.map +1 -0
- package/dist/server/media/process-handler.d.ts +12 -0
- package/dist/server/media/process-handler.d.ts.map +1 -0
- package/dist/server/media/process-handler.js +138 -0
- package/dist/server/media/process-handler.js.map +1 -0
- package/dist/server/media/sign.d.ts +11 -0
- package/dist/server/media/sign.d.ts.map +1 -0
- package/dist/server/media/sign.js +49 -0
- package/dist/server/media/sign.js.map +1 -0
- package/dist/server/media/ssmParams.d.ts +29 -0
- package/dist/server/media/ssmParams.d.ts.map +1 -0
- package/dist/server/media/ssmParams.js +74 -0
- package/dist/server/media/ssmParams.js.map +1 -0
- package/dist/server/media/types.d.ts +109 -0
- package/dist/server/media/types.d.ts.map +1 -0
- package/dist/server/media/types.js +2 -0
- package/dist/server/media/types.js.map +1 -0
- package/dist/server/media-handler.cjs +57450 -0
- package/dist/server/media-handler.cjs.map +7 -0
- package/dist/server/media-process-handler-dlq.cjs +36195 -0
- package/dist/server/media-process-handler-dlq.cjs.map +7 -0
- package/dist/server/media-process-handler.cjs +60568 -0
- package/dist/server/media-process-handler.cjs.map +7 -0
- package/dist/server/utils/authHandler.d.ts +40 -1
- package/dist/server/utils/authHandler.d.ts.map +1 -1
- package/dist/server/utils/authHandler.js +14 -33
- package/dist/server/utils/authHandler.js.map +1 -1
- package/dist/sharp-layer.zip +0 -0
- package/package.json +34 -3
- package/terraform/main.tf +36 -2
- package/terraform/media/README.md +64 -0
- package/terraform/media/main.tf +718 -0
- package/terraform/media/outputs.tf +66 -0
- package/terraform/media/variables.tf +84 -0
- package/terraform/modules/parameter-store/main.tf +26 -1
- package/terraform/modules/parameter-store/variables.tf +7 -1
- package/terraform/outputs.tf +10 -0
- package/terraform/variables.tf +6 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* メディア配信用の署名付きURL生成(CloudFront Canned Policy)
|
|
3
|
+
*
|
|
4
|
+
* 「誰に署名URLを発行するか」の判断はこの関数の責務外(呼び出し側アプリが担う)。
|
|
5
|
+
* この関数は「有効なリクエストになら署名する」機構のみを提供する(詳細: docs/media-design.md)。
|
|
6
|
+
*/
|
|
7
|
+
import { getSignedUrl } from '@aws-sdk/cloudfront-signer';
|
|
8
|
+
/**
|
|
9
|
+
* Expires(epoch seconds)を計算する。
|
|
10
|
+
*
|
|
11
|
+
* 生の「現在時刻+TTL」をそのまま使うと、署名APIを呼ぶたびに毎回異なる署名URLになり
|
|
12
|
+
* クライアント側のブラウザキャッシュが効かない。TTL単位の境界に切り上げることで、
|
|
13
|
+
* 同じ時間帯内は同一URLになりブラウザキャッシュも活用できる。
|
|
14
|
+
*
|
|
15
|
+
* 必ず「現在時刻+TTLを切り上げる」のであって、「現在時刻を切り上げる」のではない
|
|
16
|
+
* ことに注意する。後者だと、TTL境界の直前に発行した場合に有効期間がTTLよりずっと
|
|
17
|
+
* 短くなってしまう(例: TTL=3600秒で境界の1秒前に発行すると有効期間は1秒になる)。
|
|
18
|
+
* この実装は常に [TTL, 2*TTL) の範囲の有効期間を保証する。
|
|
19
|
+
*/
|
|
20
|
+
function computeExpiry(nowSeconds, ttlSeconds) {
|
|
21
|
+
const target = nowSeconds + ttlSeconds;
|
|
22
|
+
return Math.ceil(target / ttlSeconds) * ttlSeconds;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* メディア配信用の署名付きURLを生成する。
|
|
26
|
+
*
|
|
27
|
+
* width指定時は /resize/{fileId}?width=N、省略時は /master/{fileId} に署名する
|
|
28
|
+
* (呼び出し元が具体的な幅を決めてから呼ぶこと。ワイルドカード署名はしない)。
|
|
29
|
+
*
|
|
30
|
+
* 秘密鍵の取得はこの関数の責務外(引数で受け取るだけ)。
|
|
31
|
+
*/
|
|
32
|
+
export function signMediaUrl(params) {
|
|
33
|
+
const { fileId, width, keyPairId, privateKey, baseUrl, expiresInSeconds } = params;
|
|
34
|
+
if (width !== undefined && width < 1) {
|
|
35
|
+
throw new Error(`Invalid width: ${width}`);
|
|
36
|
+
}
|
|
37
|
+
const path = width !== undefined ? `/resize/${fileId}?width=${width}` : `/master/${fileId}`;
|
|
38
|
+
const targetUrl = `${baseUrl.replace(/\/$/, '')}${path}`;
|
|
39
|
+
const nowSeconds = Math.floor(Date.now() / 1000);
|
|
40
|
+
const expiresAt = computeExpiry(nowSeconds, expiresInSeconds);
|
|
41
|
+
const url = getSignedUrl({
|
|
42
|
+
url: targetUrl,
|
|
43
|
+
dateLessThan: new Date(expiresAt * 1000).toISOString(),
|
|
44
|
+
keyPairId,
|
|
45
|
+
privateKey,
|
|
46
|
+
});
|
|
47
|
+
return { fileId, width, url, expiresAt };
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=sign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign.js","sourceRoot":"","sources":["../../../src/server/media/sign.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAI1D;;;;;;;;;;;GAWG;AACH,SAAS,aAAa,CAAC,UAAkB,EAAE,UAAkB;IAC3D,MAAM,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;AACrD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,MAA0B;IACrD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;IAEnF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,MAAM,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,CAAC;IAC5F,MAAM,SAAS,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;IAEzD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IAE9D,MAAM,GAAG,GAAG,YAAY,CAAC;QACvB,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;QACtD,SAAS;QACT,UAAU;KACX,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* image policy・署名鍵をParameter Storeから取得する共通ロジック
|
|
3
|
+
*
|
|
4
|
+
* モジュールスコープにキャッシュし、コールドスタートごとに再取得する
|
|
5
|
+
* (詳細: docs/media-design.md「image policyの管理」)。
|
|
6
|
+
*
|
|
7
|
+
* 取得失敗時(未登録・不正なJSON)はfail-closedとする(例外を投げる)。
|
|
8
|
+
* 「取得できない=無制限を許可」になる実装ミスを避けるため、呼び出し側は
|
|
9
|
+
* この例外をそのままリクエスト拒否として扱うこと。
|
|
10
|
+
*/
|
|
11
|
+
import { type SSMClient } from '@aws-sdk/client-ssm';
|
|
12
|
+
import type { ImagePolicy } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* image policyをParameter Storeから取得する(モジュールスコープにキャッシュ)。
|
|
15
|
+
*
|
|
16
|
+
* @throws パラメータが未登録、または値が不正なJSON/スキーマの場合
|
|
17
|
+
*/
|
|
18
|
+
export declare function getImagePolicy(ssmClient: SSMClient, paramName: string): Promise<ImagePolicy>;
|
|
19
|
+
/**
|
|
20
|
+
* 署名用秘密鍵をParameter Storeから取得する(モジュールスコープにキャッシュ)。
|
|
21
|
+
*
|
|
22
|
+
* @throws パラメータが未登録の場合
|
|
23
|
+
*/
|
|
24
|
+
export declare function getSigningPrivateKey(ssmClient: SSMClient, paramName: string): Promise<string>;
|
|
25
|
+
/**
|
|
26
|
+
* キャッシュをクリアする(テスト専用)。
|
|
27
|
+
*/
|
|
28
|
+
export declare function clearSsmParamsCache(): void;
|
|
29
|
+
//# sourceMappingURL=ssmParams.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssmParams.d.ts","sourceRoot":"","sources":["../../../src/server/media/ssmParams.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAkB9C;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC,CAsBtB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAajB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* image policy・署名鍵をParameter Storeから取得する共通ロジック
|
|
3
|
+
*
|
|
4
|
+
* モジュールスコープにキャッシュし、コールドスタートごとに再取得する
|
|
5
|
+
* (詳細: docs/media-design.md「image policyの管理」)。
|
|
6
|
+
*
|
|
7
|
+
* 取得失敗時(未登録・不正なJSON)はfail-closedとする(例外を投げる)。
|
|
8
|
+
* 「取得できない=無制限を許可」になる実装ミスを避けるため、呼び出し側は
|
|
9
|
+
* この例外をそのままリクエスト拒否として扱うこと。
|
|
10
|
+
*/
|
|
11
|
+
import { GetParameterCommand } from '@aws-sdk/client-ssm';
|
|
12
|
+
let cachedImagePolicy;
|
|
13
|
+
let cachedSigningPrivateKey;
|
|
14
|
+
function isValidImagePolicy(value) {
|
|
15
|
+
if (typeof value !== 'object' || value === null)
|
|
16
|
+
return false;
|
|
17
|
+
const v = value;
|
|
18
|
+
return (typeof v.masterMaxDimension === 'number' &&
|
|
19
|
+
v.masterMaxDimension > 0 &&
|
|
20
|
+
Array.isArray(v.allowedContentTypes) &&
|
|
21
|
+
v.allowedContentTypes.every((t) => typeof t === 'string') &&
|
|
22
|
+
typeof v.maxUploadSize === 'number' &&
|
|
23
|
+
v.maxUploadSize > 0);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* image policyをParameter Storeから取得する(モジュールスコープにキャッシュ)。
|
|
27
|
+
*
|
|
28
|
+
* @throws パラメータが未登録、または値が不正なJSON/スキーマの場合
|
|
29
|
+
*/
|
|
30
|
+
export async function getImagePolicy(ssmClient, paramName) {
|
|
31
|
+
if (cachedImagePolicy)
|
|
32
|
+
return cachedImagePolicy;
|
|
33
|
+
const result = await ssmClient.send(new GetParameterCommand({ Name: paramName }));
|
|
34
|
+
const rawValue = result.Parameter?.Value;
|
|
35
|
+
if (!rawValue) {
|
|
36
|
+
throw new Error(`Image policy parameter not found: ${paramName}`);
|
|
37
|
+
}
|
|
38
|
+
let parsed;
|
|
39
|
+
try {
|
|
40
|
+
parsed = JSON.parse(rawValue);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
throw new Error(`Image policy parameter is not valid JSON: ${paramName}`);
|
|
44
|
+
}
|
|
45
|
+
if (!isValidImagePolicy(parsed)) {
|
|
46
|
+
throw new Error(`Image policy parameter has invalid shape: ${paramName}`);
|
|
47
|
+
}
|
|
48
|
+
cachedImagePolicy = parsed;
|
|
49
|
+
return parsed;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 署名用秘密鍵をParameter Storeから取得する(モジュールスコープにキャッシュ)。
|
|
53
|
+
*
|
|
54
|
+
* @throws パラメータが未登録の場合
|
|
55
|
+
*/
|
|
56
|
+
export async function getSigningPrivateKey(ssmClient, paramName) {
|
|
57
|
+
if (cachedSigningPrivateKey)
|
|
58
|
+
return cachedSigningPrivateKey;
|
|
59
|
+
const result = await ssmClient.send(new GetParameterCommand({ Name: paramName, WithDecryption: true }));
|
|
60
|
+
const value = result.Parameter?.Value;
|
|
61
|
+
if (!value) {
|
|
62
|
+
throw new Error(`Signing private key parameter not found: ${paramName}`);
|
|
63
|
+
}
|
|
64
|
+
cachedSigningPrivateKey = value;
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* キャッシュをクリアする(テスト専用)。
|
|
69
|
+
*/
|
|
70
|
+
export function clearSsmParamsCache() {
|
|
71
|
+
cachedImagePolicy = undefined;
|
|
72
|
+
cachedSigningPrivateKey = undefined;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=ssmParams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssmParams.js","sourceRoot":"","sources":["../../../src/server/media/ssmParams.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,mBAAmB,EAAkB,MAAM,qBAAqB,CAAC;AAI1E,IAAI,iBAA0C,CAAC;AAC/C,IAAI,uBAA2C,CAAC;AAEhD,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,OAAO,CACL,OAAO,CAAC,CAAC,kBAAkB,KAAK,QAAQ;QACxC,CAAC,CAAC,kBAAkB,GAAG,CAAC;QACxB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACpC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;QACzD,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ;QACnC,CAAC,CAAC,aAAa,GAAG,CAAC,CACpB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAoB,EACpB,SAAiB;IAEjB,IAAI,iBAAiB;QAAE,OAAO,iBAAiB,CAAC;IAEhD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC;IACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,6CAA6C,SAAS,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,6CAA6C,SAAS,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,iBAAiB,GAAG,MAAM,CAAC;IAC3B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAoB,EACpB,SAAiB;IAEjB,IAAI,uBAAuB;QAAE,OAAO,uBAAuB,CAAC;IAE5D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CACjC,IAAI,mBAAmB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CACnE,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,4CAA4C,SAAS,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,uBAAuB,GAAG,KAAK,CAAC;IAChC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,iBAAiB,GAAG,SAAS,CAAC;IAC9B,uBAAuB,GAAG,SAAS,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* メディア機能の型定義
|
|
3
|
+
*
|
|
4
|
+
* 詳細設計: docs/media-design.md
|
|
5
|
+
*/
|
|
6
|
+
import type { S3Client } from '@aws-sdk/client-s3';
|
|
7
|
+
/**
|
|
8
|
+
* メディアレコードの処理状態
|
|
9
|
+
*
|
|
10
|
+
* `pending`は存在しない。レコードが無ければ処理中を意味する
|
|
11
|
+
* (presign発行時点ではDynamoDBに触れない設計のため)。
|
|
12
|
+
*/
|
|
13
|
+
export type MediaStatus = 'completed' | 'failed';
|
|
14
|
+
/**
|
|
15
|
+
* メディアレコード(共通フィールドのみ)
|
|
16
|
+
*
|
|
17
|
+
* アプリ固有の追加フィールドは、process-handlerがS3オブジェクトメタデータから
|
|
18
|
+
* 読み取った値をそのまま書き込む(本型はフィールド名を規定しない)。
|
|
19
|
+
*/
|
|
20
|
+
export interface MediaRecord {
|
|
21
|
+
/** fileId(ULID) */
|
|
22
|
+
id: string;
|
|
23
|
+
status: MediaStatus;
|
|
24
|
+
/** アップロード時に申告され、実バイトと照合済みのMIMEタイプ */
|
|
25
|
+
contentType: string;
|
|
26
|
+
/**
|
|
27
|
+
* masterとして実際に保存される形式(画像なら'image/jpeg'、それ以外はcontentTypeと同じ)。
|
|
28
|
+
* contentTypeとの不一致を明示的に区別する
|
|
29
|
+
*/
|
|
30
|
+
outputContentType: string;
|
|
31
|
+
originalFilename?: string;
|
|
32
|
+
/** master(画像の場合のみ)の寸法 */
|
|
33
|
+
dimensions?: {
|
|
34
|
+
width: number;
|
|
35
|
+
height: number;
|
|
36
|
+
};
|
|
37
|
+
/** masterのファイルサイズ(バイト) */
|
|
38
|
+
size?: number;
|
|
39
|
+
error?: string;
|
|
40
|
+
createdAt: string;
|
|
41
|
+
updatedAt: string;
|
|
42
|
+
[key: string]: unknown;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* image policy(Parameter Store経由で実行時取得するJSON)
|
|
46
|
+
*
|
|
47
|
+
* 呼び出し側のpresign発行処理(allowedContentTypes/maxUploadSize)、
|
|
48
|
+
* process-handler(masterMaxDimension)、
|
|
49
|
+
* media-handler(widthの健全性チェック上限として masterMaxDimension を流用)が参照する。
|
|
50
|
+
*
|
|
51
|
+
* 下限は固定 `1`(独立フィールドは持たない。署名付きURL必須のため、
|
|
52
|
+
* 健全性チェック以外の制約は不要という設計判断。詳細: docs/media-design.md)。
|
|
53
|
+
*/
|
|
54
|
+
export interface ImagePolicy {
|
|
55
|
+
/** process-handlerがmaster生成時に使う長辺上限。media-handlerのwidth上限チェックにも流用する */
|
|
56
|
+
masterMaxDimension: number;
|
|
57
|
+
/** presign発行時に使う許可MIMEタイプ */
|
|
58
|
+
allowedContentTypes: string[];
|
|
59
|
+
/** presign発行時に使う最大アップロードサイズ(バイト) */
|
|
60
|
+
maxUploadSize: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* generatePresignedUpload の引数
|
|
64
|
+
*/
|
|
65
|
+
export interface PresignedUploadParams {
|
|
66
|
+
s3Client: S3Client;
|
|
67
|
+
bucket: string;
|
|
68
|
+
contentType: string;
|
|
69
|
+
originalFilename?: string;
|
|
70
|
+
fileSize: number;
|
|
71
|
+
allowedContentTypes: string[];
|
|
72
|
+
maxUploadSize: number;
|
|
73
|
+
/** x-amz-meta-{key} としてpolicyのeq条件に固定するアプリ固有メタデータ */
|
|
74
|
+
metadata: Record<string, string>;
|
|
75
|
+
/** presigned POSTの有効期限(秒)。省略時は300秒 */
|
|
76
|
+
expiresInSeconds?: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* generatePresignedUpload の戻り値
|
|
80
|
+
*/
|
|
81
|
+
export interface PresignedUploadResult {
|
|
82
|
+
fileId: string;
|
|
83
|
+
uploadUrl: string;
|
|
84
|
+
fields: Record<string, string>;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* signMediaUrl の引数
|
|
88
|
+
*/
|
|
89
|
+
export interface SignMediaUrlParams {
|
|
90
|
+
fileId: string;
|
|
91
|
+
/** 指定時は /resize/{fileId}?width=N、省略時は /master/{fileId} に署名する */
|
|
92
|
+
width?: number;
|
|
93
|
+
keyPairId: string;
|
|
94
|
+
privateKey: string;
|
|
95
|
+
baseUrl: string;
|
|
96
|
+
/** 有効期限(秒)。Expiresはこの粒度に切り上げてから署名する */
|
|
97
|
+
expiresInSeconds: number;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* signMediaUrl の戻り値
|
|
101
|
+
*/
|
|
102
|
+
export interface SignMediaUrlResult {
|
|
103
|
+
fileId: string;
|
|
104
|
+
width?: number;
|
|
105
|
+
url: string;
|
|
106
|
+
/** 署名に使ったExpires(epoch seconds、丸め込み後) */
|
|
107
|
+
expiresAt: number;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/server/media/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,mBAAmB;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,6BAA6B;IAC7B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,sCAAsC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/server/media/types.ts"],"names":[],"mappings":""}
|