@lhy-meta-server/meta-oss 0.0.0-stage → 0.0.1
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/LICENSE +21 -0
- package/README.md +378 -3
- package/dist/ali-oss/client.d.ts +185 -0
- package/dist/ali-oss/client.d.ts.map +1 -0
- package/dist/ali-oss/driver.d.ts +156 -0
- package/dist/ali-oss/driver.d.ts.map +1 -0
- package/dist/ali-oss/index.d.ts +11 -0
- package/dist/ali-oss/index.d.ts.map +1 -0
- package/dist/ali-oss/index.js +3 -0
- package/dist/ali-oss/index.js.map +11 -0
- package/dist/ali-oss/mapping.d.ts +25 -0
- package/dist/ali-oss/mapping.d.ts.map +1 -0
- package/dist/core/driver.d.ts +194 -0
- package/dist/core/driver.d.ts.map +1 -0
- package/dist/core/errors.d.ts +106 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/execution.d.ts +130 -0
- package/dist/core/execution.d.ts.map +1 -0
- package/dist/core/keys.d.ts +34 -0
- package/dist/core/keys.d.ts.map +1 -0
- package/dist/core/mime.d.ts +35 -0
- package/dist/core/mime.d.ts.map +1 -0
- package/dist/core/observability.d.ts +224 -0
- package/dist/core/observability.d.ts.map +1 -0
- package/dist/core/payload.d.ts +81 -0
- package/dist/core/payload.d.ts.map +1 -0
- package/dist/core/policy.d.ts +31 -0
- package/dist/core/policy.d.ts.map +1 -0
- package/dist/core/storage.d.ts +344 -0
- package/dist/core/storage.d.ts.map +1 -0
- package/dist/core/types.d.ts +301 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/validation.d.ts +73 -0
- package/dist/core/validation.d.ts.map +1 -0
- package/dist/elysia/index.d.ts +81 -0
- package/dist/elysia/index.d.ts.map +1 -0
- package/dist/elysia/index.js +3 -0
- package/dist/elysia/index.js.map +10 -0
- package/dist/filesystem/driver.d.ts +242 -0
- package/dist/filesystem/driver.d.ts.map +1 -0
- package/dist/filesystem/durability.d.ts +28 -0
- package/dist/filesystem/durability.d.ts.map +1 -0
- package/dist/filesystem/index.d.ts +11 -0
- package/dist/filesystem/index.d.ts.map +1 -0
- package/dist/filesystem/index.js +4 -0
- package/dist/filesystem/index.js.map +14 -0
- package/dist/filesystem/metadata.d.ts +56 -0
- package/dist/filesystem/metadata.d.ts.map +1 -0
- package/dist/filesystem/paths.d.ts +48 -0
- package/dist/filesystem/paths.d.ts.map +1 -0
- package/dist/filesystem/signer.d.ts +58 -0
- package/dist/filesystem/signer.d.ts.map +1 -0
- package/dist/index-5w45sfp6.js +4 -0
- package/dist/index-5w45sfp6.js.map +10 -0
- package/dist/index-7dpmhwry.js +4 -0
- package/dist/index-7dpmhwry.js.map +11 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +16 -0
- package/package.json +81 -6
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { StorageError } from './errors';
|
|
2
|
+
/**
|
|
3
|
+
* 重试退避配置。
|
|
4
|
+
*/
|
|
5
|
+
export interface RetryOptions {
|
|
6
|
+
/**
|
|
7
|
+
* 首次失败后的最大重试次数,默认为 2。
|
|
8
|
+
*/
|
|
9
|
+
retries?: number;
|
|
10
|
+
/**
|
|
11
|
+
* 第一次重试前的等待毫秒数,默认为 100。
|
|
12
|
+
*/
|
|
13
|
+
baseDelay?: number;
|
|
14
|
+
/**
|
|
15
|
+
* 单次等待的上限毫秒数,默认为 2000。
|
|
16
|
+
*/
|
|
17
|
+
maxDelay?: number;
|
|
18
|
+
/**
|
|
19
|
+
* 是否在指数退避上叠加随机抖动,默认为 `true`。
|
|
20
|
+
*/
|
|
21
|
+
jitter?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* 自定义可重试判定;默认仅重试 `retryable` 为 `true` 的错误。
|
|
24
|
+
*/
|
|
25
|
+
shouldRetry?(error: unknown, attempt: number): boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 计算指数退避等待时间。
|
|
29
|
+
*
|
|
30
|
+
* @param attempt 已失败的尝试次数,从 1 开始。
|
|
31
|
+
* @param baseDelay 基础等待毫秒数。
|
|
32
|
+
* @param maxDelay 等待上限毫秒数。
|
|
33
|
+
* @param jitter 是否叠加 0 到 50% 的随机抖动。
|
|
34
|
+
* @param random 随机数来源,便于测试注入。
|
|
35
|
+
* @returns 等待毫秒数。
|
|
36
|
+
*/
|
|
37
|
+
export declare function backoff(attempt: number, baseDelay: number, maxDelay: number, jitter: boolean, random?: () => number): number;
|
|
38
|
+
/**
|
|
39
|
+
* 默认可重试判定:只有被标记为 `retryable` 的存储错误才会重试。
|
|
40
|
+
*
|
|
41
|
+
* @param error 失败原因。
|
|
42
|
+
* @returns 是否允许重试。
|
|
43
|
+
*/
|
|
44
|
+
export declare function isRetryable(error: unknown): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* 单次尝试的受控执行范围,合并调用方取消与超时。
|
|
47
|
+
*/
|
|
48
|
+
export interface AttemptScope {
|
|
49
|
+
/**
|
|
50
|
+
* 传给适配器的合并信号。
|
|
51
|
+
*/
|
|
52
|
+
readonly signal: AbortSignal;
|
|
53
|
+
/**
|
|
54
|
+
* 释放定时器与监听器。
|
|
55
|
+
*/
|
|
56
|
+
dispose(): void;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 创建一次尝试的取消范围。
|
|
60
|
+
*
|
|
61
|
+
* @param timeout 超时毫秒数;`0` 表示不限制。
|
|
62
|
+
* @param parent 调用方取消信号。
|
|
63
|
+
* @returns 合并后的执行范围。
|
|
64
|
+
*/
|
|
65
|
+
export declare function createScope(timeout: number, parent?: AbortSignal): AttemptScope;
|
|
66
|
+
/**
|
|
67
|
+
* 在信号中止时立即拒绝,即使底层操作未响应信号。
|
|
68
|
+
*
|
|
69
|
+
* @param task 实际执行的异步任务。
|
|
70
|
+
* @param signal 合并信号。
|
|
71
|
+
* @returns 任务结果。
|
|
72
|
+
*/
|
|
73
|
+
export declare function race<T>(task: Promise<T>, signal: AbortSignal): Promise<T>;
|
|
74
|
+
/**
|
|
75
|
+
* 将信号的中止原因转换为存储错误;超时原因保持 `TIMEOUT`,其余视为 `ABORTED`。
|
|
76
|
+
*
|
|
77
|
+
* @param signal 已中止的信号。
|
|
78
|
+
* @returns 对应的存储错误。
|
|
79
|
+
*/
|
|
80
|
+
export declare function abortReason(signal: AbortSignal): StorageError;
|
|
81
|
+
/**
|
|
82
|
+
* 可被取消的等待。
|
|
83
|
+
*
|
|
84
|
+
* @param milliseconds 等待毫秒数。
|
|
85
|
+
* @param signal 调用方取消信号。
|
|
86
|
+
* @throws {@link StorageError} 等待期间被取消时抛出 `ABORTED`。
|
|
87
|
+
*/
|
|
88
|
+
export declare function sleep(milliseconds: number, signal?: AbortSignal): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* 公平的异步信号量,用于限制对后端的并发请求数。
|
|
91
|
+
*/
|
|
92
|
+
export declare class Semaphore {
|
|
93
|
+
private readonly limit;
|
|
94
|
+
private active;
|
|
95
|
+
private readonly queue;
|
|
96
|
+
/**
|
|
97
|
+
* 创建信号量。
|
|
98
|
+
*
|
|
99
|
+
* @param limit 最大并发数。
|
|
100
|
+
*/
|
|
101
|
+
constructor(limit: number);
|
|
102
|
+
/**
|
|
103
|
+
* 在获得许可后执行任务,并确保任务结束后释放许可。
|
|
104
|
+
*
|
|
105
|
+
* @param task 要执行的任务。
|
|
106
|
+
* @returns 任务结果。
|
|
107
|
+
*/
|
|
108
|
+
run<T>(task: () => Promise<T>): Promise<T>;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 以受控并发映射数组,结果顺序与输入一致;任一任务失败时整体拒绝。
|
|
112
|
+
*
|
|
113
|
+
* @param items 输入数组。
|
|
114
|
+
* @param concurrency 最大并发数。
|
|
115
|
+
* @param mapper 映射函数。
|
|
116
|
+
* @returns 与输入顺序一致的结果数组。
|
|
117
|
+
*/
|
|
118
|
+
export declare function mapLimit<T, R>(items: readonly T[], concurrency: number, mapper: (item: T, index: number) => Promise<R>): Promise<R[]>;
|
|
119
|
+
/**
|
|
120
|
+
* 等待任务结束(成功或失败均可),最长等待 `grace` 毫秒;任务的结果与错误都会被吞掉。
|
|
121
|
+
*
|
|
122
|
+
* 用于在超时或取消后让底层操作有机会响应信号并释放资源,同时避免不响应取消的任务
|
|
123
|
+
* 无限期阻塞调用方。
|
|
124
|
+
*
|
|
125
|
+
* @param task 正在执行的任务。
|
|
126
|
+
* @param grace 最长等待毫秒数;`0` 表示不等待。
|
|
127
|
+
* @returns 任务是否在宽限期内结束。
|
|
128
|
+
*/
|
|
129
|
+
export declare function settle(task: Promise<unknown>, grace: number): Promise<boolean>;
|
|
130
|
+
//# sourceMappingURL=execution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/core/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,YAAY,EAAE,MAAM,UAAU,CAAA;AAEvD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;OAEG;IACH,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAA;CACvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,MAAM,GAAE,MAAM,MAAoB,GACjC,MAAM,CAGR;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B;;OAEG;IACH,OAAO,IAAI,IAAI,CAAA;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,YAAY,CAsB/E;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAgBzE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAI7D;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAa/E;AAED;;GAEG;AACH,qBAAa,SAAS;IASD,OAAO,CAAC,QAAQ,CAAC,KAAK;IARzC,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAE9C;;;;OAIG;IACH,YAAoC,KAAK,EAAE,MAAM,EAAI;IAErD;;;;;OAKG;IACU,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAUtD;CACF;AAED;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,CAAC,EACjC,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC7C,OAAO,CAAC,CAAC,EAAE,CAAC,CAYd;AAED;;;;;;;;;GASG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAepF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 根据原始文件名生成对象键的函数。
|
|
3
|
+
*/
|
|
4
|
+
export type KeyGenerator = (filename: string) => string;
|
|
5
|
+
/**
|
|
6
|
+
* 默认对象键生成器的选项。
|
|
7
|
+
*/
|
|
8
|
+
export interface CreateObjectKeyOptions {
|
|
9
|
+
/**
|
|
10
|
+
* 生成键的目录前缀,例如 `avatars`。
|
|
11
|
+
*/
|
|
12
|
+
directory?: string;
|
|
13
|
+
/**
|
|
14
|
+
* 用于日期目录的时间,默认为当前时间。
|
|
15
|
+
*/
|
|
16
|
+
date?: Date;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 生成形如 `yyyy/mm/dd/<uuid>.<ext>` 的不可预测对象键。
|
|
20
|
+
*
|
|
21
|
+
* 原始文件名只用于提取扩展名,扩展名仅保留字母与数字,避免用户输入污染路径。
|
|
22
|
+
*
|
|
23
|
+
* @param filename 原始文件名,例如 `头像.PNG`。
|
|
24
|
+
* @param options 目录前缀与日期。
|
|
25
|
+
* @returns 新的对象键,例如 `avatars/2026/10/13/<uuid>.png`。
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* createObjectKey('report.pdf', { directory: 'docs' })
|
|
30
|
+
* // docs/2026/10/13/3b1f...e2.pdf
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function createObjectKey(filename: string, options?: CreateObjectKeyOptions): string;
|
|
34
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/core/keys.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;AAEvD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,MAAM,CAW9F"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 未知扩展名时采用的默认 MIME 类型。
|
|
3
|
+
*/
|
|
4
|
+
export declare const DEFAULT_CONTENT_TYPE = "application/octet-stream";
|
|
5
|
+
/**
|
|
6
|
+
* 读取对象键的小写扩展名,不含点号。
|
|
7
|
+
*
|
|
8
|
+
* @param key 对象键。
|
|
9
|
+
* @returns 扩展名;无扩展名时返回空字符串。
|
|
10
|
+
*/
|
|
11
|
+
export declare function extensionOf(key: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* 按对象键扩展名推断 MIME 类型。
|
|
14
|
+
*
|
|
15
|
+
* @param key 对象键。
|
|
16
|
+
* @param overrides 自定义扩展名映射,优先于内置映射,键为不含点号的小写扩展名。
|
|
17
|
+
* @returns 推断出的 MIME 类型;无法识别时返回 `application/octet-stream`。
|
|
18
|
+
*/
|
|
19
|
+
export declare function lookupContentType(key: string, overrides?: Readonly<Record<string, string>>): string;
|
|
20
|
+
/**
|
|
21
|
+
* 去除 MIME 类型的参数部分并转换为小写,用于比较。
|
|
22
|
+
*
|
|
23
|
+
* @param contentType 完整 MIME 类型,例如 `text/plain; charset=utf-8`。
|
|
24
|
+
* @returns 基础 MIME 类型,例如 `text/plain`。
|
|
25
|
+
*/
|
|
26
|
+
export declare function essenceOf(contentType: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* 判断 MIME 类型是否命中允许列表,支持 `image/*` 形式的通配。
|
|
29
|
+
*
|
|
30
|
+
* @param contentType 待判断的 MIME 类型。
|
|
31
|
+
* @param patterns 允许列表。
|
|
32
|
+
* @returns 是否命中。
|
|
33
|
+
*/
|
|
34
|
+
export declare function matchContentType(contentType: string, patterns: readonly string[]): boolean;
|
|
35
|
+
//# sourceMappingURL=mime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mime.d.ts","sourceRoot":"","sources":["../../src/core/mime.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,oBAAoB,6BAA6B,CAAA;AA4C9D;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GAAG,MAAM,CAGvG;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAM1F"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import type { StorageError, StorageErrorCode } from './errors';
|
|
2
|
+
/**
|
|
3
|
+
* 可观测的对象存储操作名称。
|
|
4
|
+
*/
|
|
5
|
+
export type StorageOperation = 'put' | 'get' | 'head' | 'exists' | 'delete' | 'deleteMany' | 'list' | 'copy' | 'move' | 'signUrl' | 'createMultipart' | 'uploadPart' | 'completeMultipart' | 'abortMultipart' | 'close';
|
|
6
|
+
/**
|
|
7
|
+
* 操作结果分类。
|
|
8
|
+
*/
|
|
9
|
+
export type StorageOutcome = 'success' | 'error';
|
|
10
|
+
/**
|
|
11
|
+
* 单次操作完成后产生的结构化事件。
|
|
12
|
+
*
|
|
13
|
+
* 事件不会包含凭据、签名或签名 URL;`key` 为业务可见键,不含服务级前缀。
|
|
14
|
+
*/
|
|
15
|
+
export interface StorageEvent {
|
|
16
|
+
/**
|
|
17
|
+
* 操作名称。
|
|
18
|
+
*/
|
|
19
|
+
readonly operation: StorageOperation;
|
|
20
|
+
/**
|
|
21
|
+
* 操作结果。
|
|
22
|
+
*/
|
|
23
|
+
readonly outcome: StorageOutcome;
|
|
24
|
+
/**
|
|
25
|
+
* 适配器名称。
|
|
26
|
+
*/
|
|
27
|
+
readonly driver: string;
|
|
28
|
+
/**
|
|
29
|
+
* 关联的对象键;批量或列举操作时省略。
|
|
30
|
+
*/
|
|
31
|
+
readonly key?: string;
|
|
32
|
+
/**
|
|
33
|
+
* 包含重试在内的总耗时毫秒数。
|
|
34
|
+
*/
|
|
35
|
+
readonly duration: number;
|
|
36
|
+
/**
|
|
37
|
+
* 实际尝试次数,首次执行计为 1。
|
|
38
|
+
*/
|
|
39
|
+
readonly attempts: number;
|
|
40
|
+
/**
|
|
41
|
+
* 写入或读取的已知字节数。
|
|
42
|
+
*/
|
|
43
|
+
readonly bytes?: number;
|
|
44
|
+
/**
|
|
45
|
+
* 失败时的稳定错误码。
|
|
46
|
+
*/
|
|
47
|
+
readonly errorCode?: StorageErrorCode;
|
|
48
|
+
/**
|
|
49
|
+
* 失败时的脱敏错误摘要,可直接写入日志。
|
|
50
|
+
*/
|
|
51
|
+
readonly error?: StorageErrorSummary;
|
|
52
|
+
/**
|
|
53
|
+
* 事件产生时的 Unix 毫秒时间戳。
|
|
54
|
+
*/
|
|
55
|
+
readonly timestamp: number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 写入可观测事件的脱敏错误摘要。
|
|
59
|
+
*
|
|
60
|
+
* 只保留分类与排障所需的少量字段,不包含原始错误对象:SDK 错误通常携带请求参数、
|
|
61
|
+
* 请求头或签名信息,直接记录存在泄露凭据的风险。需要完整错误时请在业务调用处捕获。
|
|
62
|
+
*/
|
|
63
|
+
export interface StorageErrorSummary {
|
|
64
|
+
/**
|
|
65
|
+
* 稳定错误码。
|
|
66
|
+
*/
|
|
67
|
+
readonly code: StorageErrorCode;
|
|
68
|
+
/**
|
|
69
|
+
* 存储错误消息;底层原始消息不会出现在此处。
|
|
70
|
+
*/
|
|
71
|
+
readonly message: string;
|
|
72
|
+
/**
|
|
73
|
+
* 是否可重试。
|
|
74
|
+
*/
|
|
75
|
+
readonly retryable: boolean;
|
|
76
|
+
/**
|
|
77
|
+
* 底层错误的 HTTP 状态码。
|
|
78
|
+
*/
|
|
79
|
+
readonly status?: number;
|
|
80
|
+
/**
|
|
81
|
+
* 底层错误的字符串错误码,例如 `NoSuchKey`、`ECONNRESET`。
|
|
82
|
+
*/
|
|
83
|
+
readonly causeCode?: string;
|
|
84
|
+
/**
|
|
85
|
+
* 底层错误携带的请求 ID,便于向云厂商排障。
|
|
86
|
+
*/
|
|
87
|
+
readonly requestId?: string;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 每次重试前产生的事件。
|
|
91
|
+
*/
|
|
92
|
+
export interface StorageRetryEvent {
|
|
93
|
+
/**
|
|
94
|
+
* 操作名称。
|
|
95
|
+
*/
|
|
96
|
+
readonly operation: StorageOperation;
|
|
97
|
+
/**
|
|
98
|
+
* 适配器名称。
|
|
99
|
+
*/
|
|
100
|
+
readonly driver: string;
|
|
101
|
+
/**
|
|
102
|
+
* 关联的对象键。
|
|
103
|
+
*/
|
|
104
|
+
readonly key?: string;
|
|
105
|
+
/**
|
|
106
|
+
* 即将开始的尝试序号。
|
|
107
|
+
*/
|
|
108
|
+
readonly attempt: number;
|
|
109
|
+
/**
|
|
110
|
+
* 本次重试前的等待毫秒数。
|
|
111
|
+
*/
|
|
112
|
+
readonly delay: number;
|
|
113
|
+
/**
|
|
114
|
+
* 触发重试的脱敏错误摘要。
|
|
115
|
+
*/
|
|
116
|
+
readonly error: StorageErrorSummary;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 结构化事件观察器。
|
|
120
|
+
*
|
|
121
|
+
* 回调应快速返回并把耗时上报放入自身队列;回调抛出的异常会被服务隔离,
|
|
122
|
+
* 不会影响业务请求。
|
|
123
|
+
*/
|
|
124
|
+
export interface StorageObserver {
|
|
125
|
+
/**
|
|
126
|
+
* 每次操作完成(成功或失败)后调用。
|
|
127
|
+
*/
|
|
128
|
+
onOperation?(event: StorageEvent): void;
|
|
129
|
+
/**
|
|
130
|
+
* 每次重试等待前调用。
|
|
131
|
+
*/
|
|
132
|
+
onRetry?(event: StorageRetryEvent): void;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 进程内累计指标快照。
|
|
136
|
+
*/
|
|
137
|
+
export interface StorageMetricsSnapshot {
|
|
138
|
+
/**
|
|
139
|
+
* 已完成的操作数量。
|
|
140
|
+
*/
|
|
141
|
+
readonly operations: number;
|
|
142
|
+
/**
|
|
143
|
+
* 失败的操作数量。
|
|
144
|
+
*/
|
|
145
|
+
readonly errors: number;
|
|
146
|
+
/**
|
|
147
|
+
* 重试次数。
|
|
148
|
+
*/
|
|
149
|
+
readonly retries: number;
|
|
150
|
+
/**
|
|
151
|
+
* 当前执行中的操作数量。
|
|
152
|
+
*/
|
|
153
|
+
readonly inFlight: number;
|
|
154
|
+
/**
|
|
155
|
+
* 成功写入的已知字节数。
|
|
156
|
+
*/
|
|
157
|
+
readonly bytesWritten: number;
|
|
158
|
+
/**
|
|
159
|
+
* 所有操作累计耗时毫秒数。
|
|
160
|
+
*/
|
|
161
|
+
readonly totalDuration: number;
|
|
162
|
+
/**
|
|
163
|
+
* 按操作名称累计的调用数量。
|
|
164
|
+
*/
|
|
165
|
+
readonly byOperation: Readonly<Partial<Record<StorageOperation, number>>>;
|
|
166
|
+
/**
|
|
167
|
+
* 按错误码累计的失败数量。
|
|
168
|
+
*/
|
|
169
|
+
readonly byErrorCode: Readonly<Partial<Record<StorageErrorCode, number>>>;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 低开销的进程内对象存储指标收集器。
|
|
173
|
+
*
|
|
174
|
+
* 可在多个 `ObjectStorage` 实例间共享,用于汇总同一进程的指标。
|
|
175
|
+
*/
|
|
176
|
+
export declare class StorageMetrics {
|
|
177
|
+
private operations;
|
|
178
|
+
private errors;
|
|
179
|
+
private retries;
|
|
180
|
+
private inFlight;
|
|
181
|
+
private bytesWritten;
|
|
182
|
+
private totalDuration;
|
|
183
|
+
private byOperation;
|
|
184
|
+
private byErrorCode;
|
|
185
|
+
/**
|
|
186
|
+
* 创建空的指标收集器。
|
|
187
|
+
*/
|
|
188
|
+
constructor();
|
|
189
|
+
/**
|
|
190
|
+
* 标记一个操作开始执行。
|
|
191
|
+
*/
|
|
192
|
+
start(): void;
|
|
193
|
+
/**
|
|
194
|
+
* 记录一个已完成操作。
|
|
195
|
+
*
|
|
196
|
+
* @param event 操作完成事件。
|
|
197
|
+
*/
|
|
198
|
+
record(event: StorageEvent): void;
|
|
199
|
+
/**
|
|
200
|
+
* 记录一次重试。
|
|
201
|
+
*/
|
|
202
|
+
retry(): void;
|
|
203
|
+
/**
|
|
204
|
+
* 返回当前累计指标的冻结快照。
|
|
205
|
+
*
|
|
206
|
+
* @returns 与后续更新隔离的只读快照。
|
|
207
|
+
*/
|
|
208
|
+
snapshot(): StorageMetricsSnapshot;
|
|
209
|
+
/**
|
|
210
|
+
* 将累计指标清零;执行中的操作数保持不变。
|
|
211
|
+
*/
|
|
212
|
+
reset(): void;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* 生成存储错误的脱敏摘要。
|
|
216
|
+
*
|
|
217
|
+
* 由服务层生成的错误消息只包含固定文本、操作名与配置值;`BACKEND` 错误的消息可能来自
|
|
218
|
+
* 底层 SDK,因此统一替换为固定文本。
|
|
219
|
+
*
|
|
220
|
+
* @param error 存储错误。
|
|
221
|
+
* @returns 可安全记录的错误摘要。
|
|
222
|
+
*/
|
|
223
|
+
export declare function summarizeError(error: StorageError): StorageErrorSummary;
|
|
224
|
+
//# sourceMappingURL=observability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../src/core/observability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Readable } from 'node:stream';
|
|
2
|
+
import type { ObjectBody } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* 统一后的上传内容,由服务层创建并交给适配器消费。
|
|
5
|
+
*
|
|
6
|
+
* 适配器无需关心原始输入是字符串、`Blob` 还是 Node.js 流,只需按需调用
|
|
7
|
+
* {@link StoragePayload.stream} 或 {@link StoragePayload.bytes}。
|
|
8
|
+
*/
|
|
9
|
+
export interface StoragePayload {
|
|
10
|
+
/**
|
|
11
|
+
* 已知的内容字节数;流式输入在读取前无法确定时为 `undefined`。
|
|
12
|
+
*/
|
|
13
|
+
readonly size: number | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* 内容能否被重复读取;不可重复读取的内容不会被自动重试。
|
|
16
|
+
*/
|
|
17
|
+
readonly replayable: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* 打开内容的 Web 标准可读流。
|
|
20
|
+
*
|
|
21
|
+
* 可重复读取的内容每次调用都返回新的流;不可重复读取的内容只能调用一次。
|
|
22
|
+
*
|
|
23
|
+
* @throws {@link StorageError} 不可重复读取的内容被二次打开时抛出 `INVALID_OPTION`。
|
|
24
|
+
*/
|
|
25
|
+
stream(): ReadableStream<Uint8Array>;
|
|
26
|
+
/**
|
|
27
|
+
* 将全部内容读取为连续字节数组。
|
|
28
|
+
*/
|
|
29
|
+
bytes(): Promise<Uint8Array>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 将任意分块统一转换为字节数组。
|
|
33
|
+
*
|
|
34
|
+
* @param chunk 流或异步迭代器产生的分块。
|
|
35
|
+
* @returns 对应的字节视图,不复制底层内存。
|
|
36
|
+
* @throws {@link StorageError} 分块类型不受支持时抛出 `INVALID_OPTION`。
|
|
37
|
+
*/
|
|
38
|
+
export declare function toBytes(chunk: unknown): Uint8Array;
|
|
39
|
+
/**
|
|
40
|
+
* 将可读流完整读取为连续字节数组。
|
|
41
|
+
*
|
|
42
|
+
* @param stream Web 标准可读流。
|
|
43
|
+
* @returns 合并后的字节数组。
|
|
44
|
+
*/
|
|
45
|
+
export declare function readAll(stream: ReadableStream<Uint8Array>): Promise<Uint8Array>;
|
|
46
|
+
/**
|
|
47
|
+
* 以异步迭代方式逐块读取 Web 可读流,并在提前退出时释放读取锁。
|
|
48
|
+
*
|
|
49
|
+
* @param stream Web 标准可读流。
|
|
50
|
+
* @returns 逐块产生字节的异步迭代器。
|
|
51
|
+
*/
|
|
52
|
+
export declare function iterate(stream: ReadableStream<Uint8Array>): AsyncGenerator<Uint8Array>;
|
|
53
|
+
/**
|
|
54
|
+
* 将业务输入统一为 {@link StoragePayload}。
|
|
55
|
+
*
|
|
56
|
+
* 字符串、二进制与 `Blob` 是可重复读取的;Web 流、Node.js 流与异步迭代器
|
|
57
|
+
* 只能被消费一次。Node.js 流按异步迭代器读取,因此对象模式下产生的字符串
|
|
58
|
+
* 或 Buffer 分块同样会被正确转换。
|
|
59
|
+
*
|
|
60
|
+
* @param body 业务提供的对象内容。
|
|
61
|
+
* @returns 统一后的上传内容。
|
|
62
|
+
* @throws {@link StorageError} 输入类型不受支持时抛出 `INVALID_OPTION`。
|
|
63
|
+
*/
|
|
64
|
+
export declare function createPayload(body: ObjectBody): StoragePayload;
|
|
65
|
+
/**
|
|
66
|
+
* 为上传内容附加字节数上限,超限时以 `UPLOAD_REJECTED` 终止读取。
|
|
67
|
+
*
|
|
68
|
+
* @param payload 原始上传内容。
|
|
69
|
+
* @param maxSize 允许的最大字节数。
|
|
70
|
+
* @returns 带上限检查的上传内容。
|
|
71
|
+
* @throws {@link StorageError} 已知大小超过上限时立即抛出 `UPLOAD_REJECTED`。
|
|
72
|
+
*/
|
|
73
|
+
export declare function limitPayload(payload: StoragePayload, maxSize: number): StoragePayload;
|
|
74
|
+
/**
|
|
75
|
+
* 将 Web 可读流转换为 Node.js 可读流,供只接受 Node.js 流的 SDK 使用。
|
|
76
|
+
*
|
|
77
|
+
* @param stream Web 标准可读流。
|
|
78
|
+
* @returns Node.js 可读流。
|
|
79
|
+
*/
|
|
80
|
+
export declare function toNodeReadable(stream: ReadableStream<Uint8Array>): Readable;
|
|
81
|
+
//# sourceMappingURL=payload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../src/core/payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAGtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAIzC;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B;;;;;;OAMG;IACH,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC,CAAA;IACpC;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,CAAA;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAMlD;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAcrF;AAED;;;;;GAKG;AACH,wBAAuB,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAW7F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAmB9D;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAOrF;AA6DD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,QAAQ,CAE3E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 上传限制策略,同时作用于普通上传、分片上传与 `PUT` 签名 URL。
|
|
3
|
+
*/
|
|
4
|
+
export interface UploadPolicy {
|
|
5
|
+
/**
|
|
6
|
+
* 单个对象允许的最大字节数。`PUT` 签名 URL 无法在服务端强制该限制。
|
|
7
|
+
*/
|
|
8
|
+
maxSize?: number;
|
|
9
|
+
/**
|
|
10
|
+
* 允许的 MIME 类型,支持 `image/*` 通配;省略时不限制。
|
|
11
|
+
*/
|
|
12
|
+
allowedContentTypes?: readonly string[];
|
|
13
|
+
/**
|
|
14
|
+
* 允许的扩展名(不含点号,大小写不敏感);省略时不限制。
|
|
15
|
+
*/
|
|
16
|
+
allowedExtensions?: readonly string[];
|
|
17
|
+
/**
|
|
18
|
+
* 禁止的扩展名(不含点号,大小写不敏感),优先于允许列表。
|
|
19
|
+
*/
|
|
20
|
+
deniedExtensions?: readonly string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 按策略校验对象键扩展名与 MIME 类型。
|
|
24
|
+
*
|
|
25
|
+
* @param policy 上传策略。
|
|
26
|
+
* @param key 业务对象键。
|
|
27
|
+
* @param contentType 最终采用的 MIME 类型。
|
|
28
|
+
* @throws {@link StorageError} 不满足策略时抛出 `UPLOAD_REJECTED`。
|
|
29
|
+
*/
|
|
30
|
+
export declare function checkUploadPolicy(policy: UploadPolicy, key: string, contentType: string): void;
|
|
31
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/core/policy.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACvC;;OAEG;IACH,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC;;OAEG;IACH,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAY9F"}
|