module-develop-kit 1.1.0 → 1.2.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.
Files changed (45) hide show
  1. package/dist/commonjs-virtual-dir/browser.js +5 -2
  2. package/dist/commonjs-virtual-dir/browser2.js +4 -0
  3. package/dist/commonjs-virtual-dir/index2.js +5 -3
  4. package/dist/commonjs-virtual-dir/index3.js +3 -5
  5. package/dist/commonjs-virtual-dir/index4.js +2 -4
  6. package/dist/commonjs-virtual-dir/index5.js +2 -2
  7. package/dist/commonjs-virtual-dir/index6.js +2 -2
  8. package/dist/commonjs-virtual-dir/index7.js +4 -0
  9. package/dist/commonjs-virtual-dir/index8.js +4 -0
  10. package/dist/main.d.ts +140 -29
  11. package/dist/main.js +34 -22
  12. package/dist/src/outside-call/utils.js +1 -1
  13. package/dist/src/shield/crypto/sm4.js +1 -1
  14. package/dist/src/shield/file-detection.js +143 -0
  15. package/dist/vendor/@borewit/text-codec/lib/index.js +181 -0
  16. package/dist/vendor/@tokenizer/inflate/lib/GzipHandler.js +21 -0
  17. package/dist/vendor/@tokenizer/inflate/lib/ZipHandler.js +156 -0
  18. package/dist/vendor/@tokenizer/inflate/lib/ZipToken.js +71 -0
  19. package/dist/vendor/base64-js/index.js +1 -1
  20. package/dist/vendor/debug/src/browser.js +1 -1
  21. package/dist/vendor/file-type/source/detectors/asf.js +74 -0
  22. package/dist/vendor/file-type/source/detectors/ebml.js +61 -0
  23. package/dist/vendor/file-type/source/detectors/png.js +64 -0
  24. package/dist/vendor/file-type/source/detectors/zip.js +344 -0
  25. package/dist/vendor/file-type/source/index.js +1135 -0
  26. package/dist/vendor/file-type/source/parser.js +49 -0
  27. package/dist/vendor/file-type/source/supported.js +372 -0
  28. package/dist/vendor/file-type/source/tokens.js +40 -0
  29. package/dist/vendor/ieee754/index.js +30 -0
  30. package/dist/vendor/jsbn/index.js +1 -1
  31. package/dist/vendor/sdp-transform/lib/index.js +1 -1
  32. package/dist/vendor/strtok3/lib/AbstractTokenizer.js +92 -0
  33. package/dist/vendor/strtok3/lib/BlobTokenizer.js +48 -0
  34. package/dist/vendor/strtok3/lib/BufferTokenizer.js +47 -0
  35. package/dist/vendor/strtok3/lib/ReadStreamTokenizer.js +91 -0
  36. package/dist/vendor/strtok3/lib/core.js +22 -0
  37. package/dist/vendor/strtok3/lib/stream/AbstractStreamReader.js +51 -0
  38. package/dist/vendor/strtok3/lib/stream/Errors.js +16 -0
  39. package/dist/vendor/strtok3/lib/stream/WebStreamByobReader.js +18 -0
  40. package/dist/vendor/strtok3/lib/stream/WebStreamDefaultReader.js +45 -0
  41. package/dist/vendor/strtok3/lib/stream/WebStreamReader.js +15 -0
  42. package/dist/vendor/strtok3/lib/stream/WebStreamReaderFactory.js +15 -0
  43. package/dist/vendor/token-types/lib/index.js +81 -0
  44. package/dist/vendor/uint8array-extras/index.js +45 -0
  45. package/package.json +2 -1
@@ -1,4 +1,7 @@
1
- var r = { exports: {} };
1
+ import { getDefaultExportFromCjs as r } from "./_commonjsHelpers.js";
2
+ import { __require as e } from "../vendor/debug/src/browser.js";
3
+ var o = e();
4
+ const i = /* @__PURE__ */ r(o);
2
5
  export {
3
- r as __module
6
+ i as default
4
7
  };
@@ -0,0 +1,4 @@
1
+ var r = { exports: {} };
2
+ export {
3
+ r as __module
4
+ };
@@ -1,5 +1,7 @@
1
- import { __require as r } from "../vendor/gm-crypt/index.js";
2
- var p = r();
1
+ import { getDefaultExportFromCjs as r } from "./_commonjsHelpers.js";
2
+ import { __require as o } from "../vendor/sdp-transform/lib/index.js";
3
+ var t = o();
4
+ const a = /* @__PURE__ */ r(t);
3
5
  export {
4
- p as g
6
+ a as default
5
7
  };
@@ -1,7 +1,5 @@
1
- import { getDefaultExportFromCjs as r } from "./_commonjsHelpers.js";
2
- import { __require as o } from "../vendor/sdp-transform/lib/index.js";
3
- var t = o();
4
- const a = /* @__PURE__ */ r(t);
1
+ import { __require as r } from "../vendor/gm-crypt/index.js";
2
+ var p = r();
5
3
  export {
6
- a as default
4
+ p as g
7
5
  };
@@ -1,4 +1,2 @@
1
- var r = {};
2
- export {
3
- r as __exports
4
- };
1
+ import { __require as e } from "../vendor/ieee754/index.js";
2
+ e();
@@ -1,4 +1,4 @@
1
- var e = { exports: {} };
1
+ var r = {};
2
2
  export {
3
- e as __module
3
+ r as __exports
4
4
  };
@@ -1,4 +1,4 @@
1
- var s = {};
1
+ var e = { exports: {} };
2
2
  export {
3
- s as __exports
3
+ e as __module
4
4
  };
@@ -0,0 +1,4 @@
1
+ var e = {};
2
+ export {
3
+ e as __exports
4
+ };
@@ -0,0 +1,4 @@
1
+ var s = {};
2
+ export {
3
+ s as __exports
4
+ };
package/dist/main.d.ts CHANGED
@@ -1,4 +1,20 @@
1
1
  import { Ref } from 'vue';
2
+ import { supportedExtensions } from 'file-type';
3
+ import { supportedMimeTypes } from 'file-type';
4
+
5
+ /**
6
+ * 支持的文件类型配置
7
+ * 基于 file-type 库的 supportedMimeTypes 动态生成
8
+ */
9
+ export declare const ALLOWED_FILE_TYPES: {
10
+ readonly image: Set<string>;
11
+ readonly document: Set<string>;
12
+ readonly video: Set<string>;
13
+ readonly audio: Set<string>;
14
+ readonly archive: Set<string>;
15
+ readonly font: Set<string>;
16
+ readonly model: Set<string>;
17
+ };
2
18
 
3
19
  /**
4
20
  * 防重放攻击策略
@@ -23,6 +39,46 @@ export declare const CallLogger: {
23
39
  error(message: unknown, ...args: unknown[]): void;
24
40
  };
25
41
 
42
+ /**
43
+ * 检测文件真实类型并验证扩展名
44
+ *
45
+ * @param file 要检测的文件
46
+ * @param _allowedExtensions 允许的扩展名列表(不含点),如 ['jpg', 'png'],或者 'jpg,png' 或者 'jpg'
47
+ * @param options 检测选项
48
+ * @returns 检测结果
49
+ */
50
+ export declare function detectFileByExtension(file: File, _allowedExtensions: TMaybeArray<string>, options?: IFileDetectionOptions): Promise<IFileDetectionResult>;
51
+
52
+ /**
53
+ * 检测文件真实类型并验证 MIME 类型
54
+ *
55
+ * @param file 要检测的文件
56
+ * @param _allowedMimes 允许的MIME类型列表 支持单个或者数组。单个支持使用,分割
57
+ * @param options 检测选项
58
+ * @returns 检测结果
59
+ */
60
+ export declare function detectFileByMime(file: File, _allowedMimes: TMaybeArray<string>, options?: IFileDetectionOptions): Promise<IFileDetectionResult>;
61
+
62
+ /**
63
+ * 批量检测文件扩展名
64
+ *
65
+ * @param files 要检测的文件列表
66
+ * @param allowedExtensions 允许的扩展名列表
67
+ * @param options 检测选项
68
+ * @returns 检测结果列表
69
+ */
70
+ export declare function detectionFilesByExtension(files: File[], allowedExtensions: TMaybeArray<string>, options?: IFileDetectionOptions): Promise<IFileDetectionResult[]>;
71
+
72
+ /**
73
+ * 批量检测文件 MIME 类型
74
+ *
75
+ * @param files 要检测的文件列表
76
+ * @param allowedMimes 允许的MIME类型列表
77
+ * @param options 检测选项
78
+ * @returns 检测结果列表
79
+ */
80
+ export declare function detectionFilesByMime(files: File[], allowedMimes: TMaybeArray<string>, options?: IFileDetectionOptions): Promise<IFileDetectionResult[]>;
81
+
26
82
  export declare enum ECallStatus {
27
83
  /**
28
84
  * 正在接听中
@@ -215,6 +271,40 @@ export declare interface ICallOptions {
215
271
  call: string;
216
272
  }
217
273
 
274
+ export declare interface IFileDetectionOptions {
275
+ /**
276
+ * 最大文件大小(字节)
277
+ */
278
+ maxSize?: number;
279
+ }
280
+
281
+ export declare interface IFileDetectionResult {
282
+ /**
283
+ * 是否通过检测
284
+ */
285
+ valid: boolean;
286
+ /**
287
+ * 检测到的真实MIME类型
288
+ */
289
+ detectedMime?: string;
290
+ /**
291
+ * 检测到的文件扩展名
292
+ */
293
+ detectedExt?: string;
294
+ /**
295
+ * 错误信息
296
+ */
297
+ error?: string;
298
+ /**
299
+ * 文件声称的MIME类型(来自File对象)
300
+ */
301
+ claimedMime?: string;
302
+ /**
303
+ * MIME类型是否匹配(真实vs声称)
304
+ */
305
+ mimeMatches?: boolean;
306
+ }
307
+
218
308
  export declare interface IResponseDataEncryptionStep {
219
309
  data: string;
220
310
  headers: Record<EHeaderKey, string>;
@@ -237,7 +327,48 @@ export declare interface ISm4Params {
237
327
  * @param options - 配置选项
238
328
  * @returns 是否安全
239
329
  */
240
- export declare function isUrlSafe(url: unknown, options?: UrlSanitizeOptions): boolean;
330
+ export declare function isUrlSafe(url: unknown, options?: IUrlSanitizeOptions): boolean;
331
+
332
+ /**
333
+ * 便捷方法: 检测是否为文档文件(基于 MIME 类型)
334
+ */
335
+ export declare function isValidDocument(file: File, maxSize?: number): Promise<IFileDetectionResult>;
336
+
337
+ /**
338
+ * 便捷方法: 检测是否为图片文件(基于 MIME 类型)
339
+ */
340
+ export declare function isValidImage(file: File, maxSize?: number): Promise<IFileDetectionResult>;
341
+
342
+ /**
343
+ * 便捷方法: 检测是否为视频文件(基于 MIME 类型)
344
+ */
345
+ export declare function isValidVideo(file: File, maxSize?: number): Promise<IFileDetectionResult>;
346
+
347
+ /**
348
+ * URL XSS 防护工具
349
+ * 用于检测和拦截包含 XSS 攻击的 URL
350
+ */
351
+ /**
352
+ * URL 消毒选项
353
+ */
354
+ export declare interface IUrlSanitizeOptions {
355
+ /**
356
+ * 是否允许相对路径 URL,默认 true
357
+ */
358
+ allowRelative?: boolean;
359
+ /**
360
+ * 额外的安全协议
361
+ */
362
+ extraSafeProtocols?: string[];
363
+ /**
364
+ * 当检测到 XSS 时的替代 URL,默认 '#'
365
+ */
366
+ fallbackUrl?: string;
367
+ /**
368
+ * 是否严格模式,严格模式下只允许 http/https,默认 false
369
+ */
370
+ strictMode?: boolean;
371
+ }
241
372
 
242
373
  /**
243
374
  * 请求数据加密
@@ -268,7 +399,7 @@ export declare function responseDataEncryption<T>(stepCb: (_headers: {
268
399
  * @param options - 配置选项
269
400
  * @returns 安全的 URL
270
401
  */
271
- export declare function sanitizeUrl(url: unknown, options?: UrlSanitizeOptions): string;
402
+ export declare function sanitizeUrl(url: unknown, options?: IUrlSanitizeOptions): string;
272
403
 
273
404
  /**
274
405
  * 批量消毒 URL 列表
@@ -276,7 +407,7 @@ export declare function sanitizeUrl(url: unknown, options?: UrlSanitizeOptions):
276
407
  * @param options - 配置选项
277
408
  * @returns 消毒后的 URL 列表
278
409
  */
279
- export declare function sanitizeUrls(urls: string[], options?: UrlSanitizeOptions): string[];
410
+ export declare function sanitizeUrls(urls: string[], options?: IUrlSanitizeOptions): string[];
280
411
 
281
412
  /**
282
413
  * sip code对应的的状态,优先处理 code 对应的提示文案,如果不存在则按照 causes 状态去处理
@@ -338,42 +469,22 @@ declare interface SipAccount {
338
469
  */
339
470
  export declare const startNoDebugger: () => void;
340
471
 
472
+ export { supportedExtensions }
473
+
474
+ export { supportedMimeTypes }
475
+
341
476
  export declare type TData = _TData | _TData[];
342
477
 
343
478
  declare type _TData = null | undefined | number | string | Record<string, any>;
344
479
 
480
+ export declare type TMaybeArray<T> = T[] | T;
481
+
345
482
  export declare type TNullable<T> = T | null;
346
483
 
347
484
  export declare type TObj<K extends keyof any = string, T = any> = Record<K, T>;
348
485
 
349
486
  export declare type TUndefinable<T> = T | undefined;
350
487
 
351
- /**
352
- * URL XSS 防护工具
353
- * 用于检测和拦截包含 XSS 攻击的 URL
354
- */
355
- /**
356
- * URL 消毒选项
357
- */
358
- export declare interface UrlSanitizeOptions {
359
- /**
360
- * 是否允许相对路径 URL,默认 true
361
- */
362
- allowRelative?: boolean;
363
- /**
364
- * 额外的安全协议
365
- */
366
- extraSafeProtocols?: string[];
367
- /**
368
- * 当检测到 XSS 时的替代 URL,默认 '#'
369
- */
370
- fallbackUrl?: string;
371
- /**
372
- * 是否严格模式,严格模式下只允许 http/https,默认 false
373
- */
374
- strictMode?: boolean;
375
- }
376
-
377
488
  /**
378
489
  * 打电话
379
490
  * FIXME: callBack 为什么存在?zyy 中通过 useCall 拿到的变量无法实现响应式,所以通过 callback 的方式更新外部依赖。
package/dist/main.js CHANGED
@@ -1,25 +1,37 @@
1
- import { useCall as e } from "./src/outside-call/index.js";
2
- import { antiReplyAttackStrategy as a, requestDataEncryption as E, responseDataEncryption as p } from "./src/shield/crypto/index.js";
3
- import { htmlSanitize as s } from "./src/shield/html-sanitize.js";
4
- import { startNoDebugger as n } from "./src/shield/no-debugger.js";
5
- import { isUrlSafe as f, sanitizeUrl as m, sanitizeUrls as x } from "./src/shield/url-sanitize.js";
6
- import { EventBus as g } from "./src/utils/eventBus.js";
7
- import { CallLogger as C } from "./src/outside-call/utils.js";
8
- import { ECallStatus as A, EMIT_EVENT_NAME as D, SIP_CODE_MESSAGE as R, SIP_ERROR_CAUSES as U } from "./src/outside-call/constants.js";
1
+ import { useCall as o } from "./src/outside-call/index.js";
2
+ import { antiReplyAttackStrategy as i, requestDataEncryption as s, responseDataEncryption as a } from "./src/shield/crypto/index.js";
3
+ import { ALLOWED_FILE_TYPES as p, detectFileByExtension as E, detectFileByMime as l, detectionFilesByExtension as m, detectionFilesByMime as x, isValidDocument as f, isValidImage as S, isValidVideo as d } from "./src/shield/file-detection.js";
4
+ import { htmlSanitize as c } from "./src/shield/html-sanitize.js";
5
+ import { startNoDebugger as _ } from "./src/shield/no-debugger.js";
6
+ import { isUrlSafe as D, sanitizeUrl as M, sanitizeUrls as A } from "./src/shield/url-sanitize.js";
7
+ import { EventBus as C } from "./src/utils/eventBus.js";
8
+ import { CallLogger as I } from "./src/outside-call/utils.js";
9
+ import { ECallStatus as L, EMIT_EVENT_NAME as R, SIP_CODE_MESSAGE as T, SIP_ERROR_CAUSES as U } from "./src/outside-call/constants.js";
10
+ import { supportedExtensions as N, supportedMimeTypes as O } from "./vendor/file-type/source/index.js";
9
11
  export {
10
- C as CallLogger,
11
- A as ECallStatus,
12
- D as EMIT_EVENT_NAME,
13
- g as EventBus,
14
- R as SIP_CODE_MESSAGE,
12
+ p as ALLOWED_FILE_TYPES,
13
+ I as CallLogger,
14
+ L as ECallStatus,
15
+ R as EMIT_EVENT_NAME,
16
+ C as EventBus,
17
+ T as SIP_CODE_MESSAGE,
15
18
  U as SIP_ERROR_CAUSES,
16
- a as antiReplyAttackStrategy,
17
- s as htmlSanitize,
18
- f as isUrlSafe,
19
- E as requestDataEncryption,
20
- p as responseDataEncryption,
21
- m as sanitizeUrl,
22
- x as sanitizeUrls,
23
- n as startNoDebugger,
24
- e as useCall
19
+ i as antiReplyAttackStrategy,
20
+ E as detectFileByExtension,
21
+ l as detectFileByMime,
22
+ m as detectionFilesByExtension,
23
+ x as detectionFilesByMime,
24
+ c as htmlSanitize,
25
+ D as isUrlSafe,
26
+ f as isValidDocument,
27
+ S as isValidImage,
28
+ d as isValidVideo,
29
+ s as requestDataEncryption,
30
+ a as responseDataEncryption,
31
+ M as sanitizeUrl,
32
+ A as sanitizeUrls,
33
+ _ as startNoDebugger,
34
+ N as supportedExtensions,
35
+ O as supportedMimeTypes,
36
+ o as useCall
25
37
  };
@@ -1,4 +1,4 @@
1
- import c from "../../commonjs-virtual-dir/index3.js";
1
+ import c from "../../commonjs-virtual-dir/index2.js";
2
2
  const g = {
3
3
  log(e, ...r) {
4
4
  console.log(`%c【${(/* @__PURE__ */ new Date()).toLocaleString()}】`, "color: green; font-weight: bold;", e, ...r);
@@ -1,4 +1,4 @@
1
- import { g as o } from "../../../commonjs-virtual-dir/index2.js";
1
+ import { g as o } from "../../../commonjs-virtual-dir/index3.js";
2
2
  import { dataToStr as r } from "./util.js";
3
3
  const c = "cbc", n = (t, e) => new o.sm4({
4
4
  key: t.key,
@@ -0,0 +1,143 @@
1
+ import { supportedMimeTypes as l, fileTypeFromStream as y } from "../../vendor/file-type/source/index.js";
2
+ import { supportedExtensions as z } from "../../vendor/file-type/source/index.js";
3
+ function d(e) {
4
+ const t = /* @__PURE__ */ new Set();
5
+ for (const r of l)
6
+ r.startsWith(`${e}/`) && t.add(r);
7
+ return t;
8
+ }
9
+ const f = {
10
+ // 图片类型 - 从 supportedMimeTypes 中过滤 image/*
11
+ image: d("image"),
12
+ // 文档类型 - 包含常见办公文档
13
+ document: /* @__PURE__ */ new Set([
14
+ ...Array.from(l).filter(
15
+ (e) => e.includes("pdf") || e.includes("msword") || e.includes("officedocument") || e.includes("ms-excel") || e.includes("ms-powerpoint") || e.includes("opendocument") || e === "text/plain"
16
+ )
17
+ ]),
18
+ // 视频类型 - 从 supportedMimeTypes 中过滤 video/*
19
+ video: d("video"),
20
+ // 音频类型 - 从 supportedMimeTypes 中过滤 audio/*
21
+ audio: d("audio"),
22
+ // 压缩文件
23
+ archive: /* @__PURE__ */ new Set([
24
+ ...Array.from(l).filter(
25
+ (e) => e.includes("zip") || e.includes("rar") || e.includes("7z") || e.includes("tar") || e.includes("gzip") || e.includes("compress")
26
+ )
27
+ ]),
28
+ // 字体文件
29
+ font: d("font"),
30
+ // 模型文件
31
+ model: d("model")
32
+ };
33
+ function M(e, t) {
34
+ return t.some((r) => {
35
+ const i = r.trim();
36
+ if (!i)
37
+ return !1;
38
+ if (i === e)
39
+ return !0;
40
+ if (i.endsWith("/*")) {
41
+ const n = i.slice(0, i.indexOf("/"));
42
+ return e.startsWith(`${n}/`);
43
+ }
44
+ return !1;
45
+ });
46
+ }
47
+ async function p(e, t) {
48
+ const { maxSize: r } = t;
49
+ if (r && e.size > r)
50
+ return {
51
+ valid: !1,
52
+ error: `上传文件大小不能超过 ${(r / 1024 / 1024).toFixed(2)}MB`,
53
+ claimedMime: e.type
54
+ };
55
+ const i = await y(e.stream());
56
+ if (!i)
57
+ return {
58
+ valid: !1,
59
+ error: "无法检测文件类型,可能是不支持的格式或文件已损坏",
60
+ claimedMime: e.type
61
+ };
62
+ const n = i.mime, o = i.ext, c = e.type, s = n === c;
63
+ return !s && c && console.warn("文件MIME类型不匹配", {
64
+ claimed: c,
65
+ detected: n,
66
+ fileName: e.name
67
+ }), {
68
+ detectedMime: n,
69
+ detectedExt: o,
70
+ claimedMime: c,
71
+ mimeMatches: s
72
+ };
73
+ }
74
+ async function u(e, t, r = {}) {
75
+ const i = await p(e, r);
76
+ if ("valid" in i && !i.valid)
77
+ return i;
78
+ const { detectedMime: n, detectedExt: o, claimedMime: c, mimeMatches: s } = i, m = Array.isArray(t) ? t : t.split(",");
79
+ return !n || !M(n, m) ? {
80
+ valid: !1,
81
+ error: `不支持的文件类型: ${n || "未知"}`,
82
+ detectedMime: n,
83
+ detectedExt: o,
84
+ claimedMime: c,
85
+ mimeMatches: s
86
+ } : {
87
+ valid: !0,
88
+ detectedMime: n,
89
+ detectedExt: o,
90
+ claimedMime: c,
91
+ mimeMatches: s
92
+ };
93
+ }
94
+ async function v(e, t, r = {}) {
95
+ const i = await p(e, r);
96
+ if ("valid" in i && !i.valid)
97
+ return i;
98
+ const { detectedMime: n, detectedExt: o, claimedMime: c, mimeMatches: s } = i, m = Array.isArray(t) ? t : t.split(",").map((a) => a.trim());
99
+ return !o || !m.some((a) => o === a || `.${o}` === a) ? {
100
+ valid: !1,
101
+ error: `不支持的文件扩展名: .${o || "未知"}`,
102
+ detectedMime: n,
103
+ detectedExt: o,
104
+ claimedMime: c,
105
+ mimeMatches: s
106
+ } : {
107
+ valid: !0,
108
+ detectedMime: n,
109
+ detectedExt: o,
110
+ claimedMime: c,
111
+ mimeMatches: s
112
+ };
113
+ }
114
+ function A(e, t, r = {}) {
115
+ return Promise.all(e.map((i) => u(i, t, r)));
116
+ }
117
+ function g(e, t, r = {}) {
118
+ return Promise.all(e.map((i) => v(i, t, r)));
119
+ }
120
+ function E(e, t) {
121
+ const r = Array.from(f.image);
122
+ return u(e, r, { maxSize: t });
123
+ }
124
+ function w(e, t) {
125
+ const r = Array.from(f.document);
126
+ return u(e, r, { maxSize: t });
127
+ }
128
+ function F(e, t) {
129
+ const r = Array.from(f.video);
130
+ return u(e, r, { maxSize: t });
131
+ }
132
+ export {
133
+ f as ALLOWED_FILE_TYPES,
134
+ v as detectFileByExtension,
135
+ u as detectFileByMime,
136
+ g as detectionFilesByExtension,
137
+ A as detectionFilesByMime,
138
+ w as isValidDocument,
139
+ E as isValidImage,
140
+ F as isValidVideo,
141
+ z as supportedExtensions,
142
+ l as supportedMimeTypes
143
+ };