@agent-infra/media-utils 0.1.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/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # Media Utils
2
+
3
+ A utility package for handling media files, specifically designed for processing base64 encoded images.
4
+
5
+ ## Features
6
+
7
+ - Parse base64 image data and extract metadata
8
+ - Detect image format (PNG, JPEG, WebP, GIF, BMP)
9
+ - Extract image dimensions
10
+ - Convert between different image data formats
11
+ - Works in both Node.js and browser environments
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ npm install @agent-infra/media-utils
17
+ ```
18
+
19
+ ## Base64ImageParser
20
+
21
+ > [!NOTE]
22
+ > Currently only supports parsing **static** base64 image formats: PNG, JPEG, WebP, GIF, and BMP
23
+
24
+ ### Platform Compatibility
25
+
26
+ Supports both Node.js and browsers.
27
+
28
+ ### Basic Usage
29
+
30
+ ```typescript
31
+ import { Base64ImageParser } from '@agent-infra/media-utils';
32
+
33
+ // Initialize with a base64 image string
34
+ const tool = new Base64ImageParser('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgA...');
35
+
36
+ // Get image type
37
+ const imageType = tool.getImageType(); // 'png' | 'jpeg' | 'webp' | 'gif' | 'bmp' | null
38
+
39
+ // Get image dimensions
40
+ const dimensions = tool.getDimensions(); // { width: number, height: number } | null
41
+
42
+ // Get pure base64 string (without data URI prefix)
43
+ const pureBase64 = tool.getPureBase64Image();
44
+
45
+ // Get image buffer
46
+ const buffer = tool.getBuffer(); // Uint8Array
47
+
48
+ // Get data URI
49
+ const dataUri = tool.getDataUri(); // 'data:image/png;base64,...'
50
+ ```
51
+
52
+ ### Example
53
+
54
+ ```typescript
55
+ import { Base64ImageParser } from '@agent-infra/media-utils';
56
+
57
+ const base64Image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==';
58
+
59
+ const tool = new Base64ImageParser(base64Image);
60
+
61
+ console.log('Image type:', tool.getImageType()); // 'png'
62
+ console.log('Dimensions:', tool.getDimensions()); // { width: 1, height: 1 }
63
+ console.log('Pure base64:', tool.getPureBase64Image()); // 'iVBORw0KGgo...'
64
+ ```
65
+
66
+ ## License
67
+
68
+ ISC
@@ -0,0 +1,16 @@
1
+ import type { ImageType, ImageDimensions } from '../type';
2
+ export declare const IMAGE_TYPE_MAP: Map<string, ImageType>;
3
+ export declare function base64String2Uint8Array(base64: string): Uint8Array<ArrayBuffer>;
4
+ /**
5
+ * PNG: https://github.com/corkami/pics/blob/master/binary/PNG.png
6
+ * JPEG: https://github.com/corkami/pics/blob/master/binary/JPG.png
7
+ * WEBP: https://datatracker.ietf.org/doc/rfc9649/
8
+ * GIF: https://github.com/corkami/pics/blob/master/binary/GIF.png
9
+ * BMP: https://github.com/corkami/pics/blob/master/binary/bmp3.png
10
+ */
11
+ export declare function parsePngDimensions(bytes: Uint8Array): ImageDimensions;
12
+ export declare function parseJpegDimensions(bytes: Uint8Array): ImageDimensions;
13
+ export declare function parseGifDimensions(bytes: Uint8Array): ImageDimensions;
14
+ export declare function parseWebpDimensions(bytes: Uint8Array): ImageDimensions;
15
+ export declare function parseBmpDimensions(bytes: Uint8Array): ImageDimensions;
16
+ //# sourceMappingURL=image-parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-parse.d.ts","sourceRoot":"","sources":["../../src/base64/image-parse.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1D,eAAO,MAAM,cAAc,wBAMzB,CAAC;AAEH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,2BAcrD;AAED;;;;;;GAMG;AAEH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,CAOrE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,CA0BtE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,CAKrE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,CAoEtE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,CAOrE"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ "use strict";
6
+ var __webpack_require__ = {};
7
+ (()=>{
8
+ __webpack_require__.d = (exports1, definition)=>{
9
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
10
+ enumerable: true,
11
+ get: definition[key]
12
+ });
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ IMAGE_TYPE_MAP: ()=>IMAGE_TYPE_MAP,
32
+ base64String2Uint8Array: ()=>base64String2Uint8Array,
33
+ parseBmpDimensions: ()=>parseBmpDimensions,
34
+ parseGifDimensions: ()=>parseGifDimensions,
35
+ parseJpegDimensions: ()=>parseJpegDimensions,
36
+ parsePngDimensions: ()=>parsePngDimensions,
37
+ parseWebpDimensions: ()=>parseWebpDimensions
38
+ });
39
+ const IMAGE_TYPE_MAP = new Map([
40
+ [
41
+ '/9j/',
42
+ 'jpeg'
43
+ ],
44
+ [
45
+ 'iVBORw',
46
+ 'png'
47
+ ],
48
+ [
49
+ 'UklGR',
50
+ 'webp'
51
+ ],
52
+ [
53
+ 'R0lGOD',
54
+ 'gif'
55
+ ],
56
+ [
57
+ 'Qk',
58
+ 'bmp'
59
+ ]
60
+ ]);
61
+ function base64String2Uint8Array(base64) {
62
+ if ('undefined' != typeof Buffer) return new Uint8Array(Buffer.from(base64, 'base64'));
63
+ {
64
+ const binaryString = atob(base64);
65
+ const bytes = new Uint8Array(binaryString.length);
66
+ for(let i = 0; i < binaryString.length; i++)bytes[i] = binaryString.charCodeAt(i);
67
+ return bytes;
68
+ }
69
+ }
70
+ function parsePngDimensions(bytes) {
71
+ const width = bytes[16] << 24 | bytes[17] << 16 | bytes[18] << 8 | bytes[19];
72
+ const height = bytes[20] << 24 | bytes[21] << 16 | bytes[22] << 8 | bytes[23];
73
+ return {
74
+ width,
75
+ height
76
+ };
77
+ }
78
+ function parseJpegDimensions(bytes) {
79
+ let i = 2;
80
+ while(i < bytes.length - 1)if (0xff === bytes[i]) {
81
+ const marker = bytes[i + 1];
82
+ if (marker >= 0xc0 && marker <= 0xc3) {
83
+ if (i + 8 < bytes.length) {
84
+ const height = bytes[i + 5] << 8 | bytes[i + 6];
85
+ const width = bytes[i + 7] << 8 | bytes[i + 8];
86
+ return {
87
+ width,
88
+ height
89
+ };
90
+ }
91
+ }
92
+ if (i + 3 < bytes.length) {
93
+ const segmentLength = bytes[i + 2] << 8 | bytes[i + 3];
94
+ i += 2 + segmentLength;
95
+ } else break;
96
+ } else i++;
97
+ throw new Error('Unable to find JPEG dimensions');
98
+ }
99
+ function parseGifDimensions(bytes) {
100
+ const width = bytes[6] | bytes[7] << 8;
101
+ const height = bytes[8] | bytes[9] << 8;
102
+ return {
103
+ width,
104
+ height
105
+ };
106
+ }
107
+ function parseWebpDimensions(bytes) {
108
+ const fourCC = String.fromCharCode(bytes[12], bytes[13], bytes[14], bytes[15]);
109
+ if ('VP8 ' === fourCC) {
110
+ const startByte = 23;
111
+ const width = bytes[startByte + 3] | bytes[startByte + 4] << 8;
112
+ const height = bytes[startByte + 5] | bytes[startByte + 6] << 8;
113
+ return {
114
+ width: 0x3fff & width,
115
+ height: 0x3fff & height
116
+ };
117
+ }
118
+ if ('VP8L' === fourCC) {
119
+ const startByte = 21;
120
+ const bits = bytes[startByte] | bytes[startByte + 1] << 8 | bytes[startByte + 2] << 16 | bytes[startByte + 3] << 24;
121
+ const width = (0x3fff & bits) + 1;
122
+ const height = (bits >> 14 & 0x3fff) + 1;
123
+ return {
124
+ width,
125
+ height
126
+ };
127
+ }
128
+ if ('VP8X' === fourCC) {
129
+ const startByte = 24;
130
+ const width = bytes[startByte] | bytes[startByte + 1] << 8 | bytes[startByte + 2] << 16;
131
+ const height = bytes[startByte + 3] | bytes[startByte + 4] << 8 | bytes[startByte + 5] << 16;
132
+ return {
133
+ width: width + 1,
134
+ height: height + 1
135
+ };
136
+ }
137
+ throw new Error('Unsupported WebP format');
138
+ }
139
+ function parseBmpDimensions(bytes) {
140
+ const width = bytes[18] | bytes[19] << 8 | bytes[20] << 16 | bytes[21] << 24;
141
+ const height = bytes[22] | bytes[23] << 8 | bytes[24] << 16 | bytes[25] << 24;
142
+ return {
143
+ width,
144
+ height
145
+ };
146
+ }
147
+ exports.IMAGE_TYPE_MAP = __webpack_exports__.IMAGE_TYPE_MAP;
148
+ exports.base64String2Uint8Array = __webpack_exports__.base64String2Uint8Array;
149
+ exports.parseBmpDimensions = __webpack_exports__.parseBmpDimensions;
150
+ exports.parseGifDimensions = __webpack_exports__.parseGifDimensions;
151
+ exports.parseJpegDimensions = __webpack_exports__.parseJpegDimensions;
152
+ exports.parsePngDimensions = __webpack_exports__.parsePngDimensions;
153
+ exports.parseWebpDimensions = __webpack_exports__.parseWebpDimensions;
154
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
155
+ "IMAGE_TYPE_MAP",
156
+ "base64String2Uint8Array",
157
+ "parseBmpDimensions",
158
+ "parseGifDimensions",
159
+ "parseJpegDimensions",
160
+ "parsePngDimensions",
161
+ "parseWebpDimensions"
162
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
163
+ Object.defineProperty(exports, '__esModule', {
164
+ value: true
165
+ });
166
+
167
+ //# sourceMappingURL=image-parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64/image-parse.js","sources":["webpack://@agent-infra/media-utils/webpack/runtime/define_property_getters","webpack://@agent-infra/media-utils/webpack/runtime/has_own_property","webpack://@agent-infra/media-utils/webpack/runtime/make_namespace_object","webpack://@agent-infra/media-utils/./src/base64/image-parse.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type { ImageType, ImageDimensions } from '../type';\n\nexport const IMAGE_TYPE_MAP = new Map<string, ImageType>([\n ['/9j/', 'jpeg'], // JPEG: FF D8 FF\n ['iVBORw', 'png'], // PNG: 89 50 4E 47\n ['UklGR', 'webp'], // WebP: 52 49 46 46\n ['R0lGOD', 'gif'], // GIF: 47 49 46 38\n ['Qk', 'bmp'], // BMP: 42 4D\n]);\n\nexport function base64String2Uint8Array(base64: string) {\n if (typeof Buffer !== 'undefined') {\n // Node.js environment\n return new Uint8Array(Buffer.from(base64, 'base64'));\n } else {\n // Browser environment\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n return bytes;\n }\n}\n\n/**\n * PNG: https://github.com/corkami/pics/blob/master/binary/PNG.png\n * JPEG: https://github.com/corkami/pics/blob/master/binary/JPG.png\n * WEBP: https://datatracker.ietf.org/doc/rfc9649/\n * GIF: https://github.com/corkami/pics/blob/master/binary/GIF.png\n * BMP: https://github.com/corkami/pics/blob/master/binary/bmp3.png\n */\n\nexport function parsePngDimensions(bytes: Uint8Array): ImageDimensions {\n // PNG dimensions are at bytes 16-23 (big-endian)\n const width =\n (bytes[16] << 24) | (bytes[17] << 16) | (bytes[18] << 8) | bytes[19];\n const height =\n (bytes[20] << 24) | (bytes[21] << 16) | (bytes[22] << 8) | bytes[23];\n return { width, height };\n}\n\nexport function parseJpegDimensions(bytes: Uint8Array): ImageDimensions {\n // JPEG requires parsing through segments to find SOF marker\n let i = 2; // Skip FF D8\n while (i < bytes.length - 1) {\n if (bytes[i] === 0xff) {\n const marker = bytes[i + 1];\n // SOF0, SOF1, SOF2 markers contain dimensions\n if (marker >= 0xc0 && marker <= 0xc3) {\n if (i + 8 < bytes.length) {\n const height = (bytes[i + 5] << 8) | bytes[i + 6];\n const width = (bytes[i + 7] << 8) | bytes[i + 8];\n return { width, height };\n }\n }\n // Skip to next segment\n if (i + 3 < bytes.length) {\n const segmentLength = (bytes[i + 2] << 8) | bytes[i + 3];\n i += 2 + segmentLength;\n } else {\n break;\n }\n } else {\n i++;\n }\n }\n throw new Error('Unable to find JPEG dimensions');\n}\n\nexport function parseGifDimensions(bytes: Uint8Array): ImageDimensions {\n // GIF dimensions are at bytes 6-9 (little-endian)\n const width = bytes[6] | (bytes[7] << 8);\n const height = bytes[8] | (bytes[9] << 8);\n return { width, height };\n}\n\nexport function parseWebpDimensions(bytes: Uint8Array): ImageDimensions {\n /**\n * WebP format varies, check for VP8/VP8L/VP8X\n *\n * - VP8 : Simple File Format (Lossy)\n * - VP8L: Simple File Format (Lossless)\n * - VP8X: Extended File Format\n */\n const fourCC = String.fromCharCode(\n bytes[12],\n bytes[13],\n bytes[14],\n bytes[15],\n );\n\n if (fourCC === 'VP8 ') {\n // VP8 format - dimensions are in the frame header\n // Skip chunk size (4 bytes) and frame tag (3 bytes) + key frame info (1 byte)\n const startByte = 20 + 3; // Start after VP8 chunk header + frame tag\n\n // Read width and height from VP8 frame header\n const width = bytes[startByte + 3] | (bytes[startByte + 4] << 8);\n const height = bytes[startByte + 5] | (bytes[startByte + 6] << 8);\n\n return {\n width: width & 0x3fff,\n height: height & 0x3fff,\n };\n } else if (fourCC === 'VP8L') {\n // VP8L format - dimensions are right after the signature\n // Skip chunk size (4 bytes) and VP8L signature (1 byte)\n const startByte = 20 + 1;\n\n // Read 4 bytes containing width and height info\n const bits =\n bytes[startByte] |\n (bytes[startByte + 1] << 8) |\n (bytes[startByte + 2] << 16) |\n (bytes[startByte + 3] << 24);\n\n const width = (bits & 0x3fff) + 1;\n const height = ((bits >> 14) & 0x3fff) + 1;\n\n return { width, height };\n } else if (fourCC === 'VP8X') {\n // VP8X format - extended format with dimensions in header\n // Skip chunk size (4 bytes) and flags (4 bytes)\n const startByte = 20 + 4;\n\n // Width is stored in 3 bytes (little endian) + 1\n const width =\n bytes[startByte] |\n (bytes[startByte + 1] << 8) |\n (bytes[startByte + 2] << 16);\n\n // Height is stored in next 3 bytes (little endian) + 1\n const height =\n bytes[startByte + 3] |\n (bytes[startByte + 4] << 8) |\n (bytes[startByte + 5] << 16);\n\n return {\n width: width + 1,\n height: height + 1,\n };\n }\n\n throw new Error('Unsupported WebP format');\n}\n\nexport function parseBmpDimensions(bytes: Uint8Array): ImageDimensions {\n // BMP dimensions are at bytes 18-25 (little-endian)\n const width =\n bytes[18] | (bytes[19] << 8) | (bytes[20] << 16) | (bytes[21] << 24);\n const height =\n bytes[22] | (bytes[23] << 8) | (bytes[24] << 16) | (bytes[25] << 24);\n return { width, height };\n}"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","IMAGE_TYPE_MAP","Map","base64String2Uint8Array","base64","Buffer","Uint8Array","binaryString","atob","bytes","i","parsePngDimensions","width","height","parseJpegDimensions","marker","segmentLength","Error","parseGifDimensions","parseWebpDimensions","fourCC","String","startByte","bits","parseBmpDimensions"],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ const IMAGE_TYPE_MAP = new Map([
6
+ [
7
+ '/9j/',
8
+ 'jpeg'
9
+ ],
10
+ [
11
+ 'iVBORw',
12
+ 'png'
13
+ ],
14
+ [
15
+ 'UklGR',
16
+ 'webp'
17
+ ],
18
+ [
19
+ 'R0lGOD',
20
+ 'gif'
21
+ ],
22
+ [
23
+ 'Qk',
24
+ 'bmp'
25
+ ]
26
+ ]);
27
+ function base64String2Uint8Array(base64) {
28
+ if ('undefined' != typeof Buffer) return new Uint8Array(Buffer.from(base64, 'base64'));
29
+ {
30
+ const binaryString = atob(base64);
31
+ const bytes = new Uint8Array(binaryString.length);
32
+ for(let i = 0; i < binaryString.length; i++)bytes[i] = binaryString.charCodeAt(i);
33
+ return bytes;
34
+ }
35
+ }
36
+ function parsePngDimensions(bytes) {
37
+ const width = bytes[16] << 24 | bytes[17] << 16 | bytes[18] << 8 | bytes[19];
38
+ const height = bytes[20] << 24 | bytes[21] << 16 | bytes[22] << 8 | bytes[23];
39
+ return {
40
+ width,
41
+ height
42
+ };
43
+ }
44
+ function parseJpegDimensions(bytes) {
45
+ let i = 2;
46
+ while(i < bytes.length - 1)if (0xff === bytes[i]) {
47
+ const marker = bytes[i + 1];
48
+ if (marker >= 0xc0 && marker <= 0xc3) {
49
+ if (i + 8 < bytes.length) {
50
+ const height = bytes[i + 5] << 8 | bytes[i + 6];
51
+ const width = bytes[i + 7] << 8 | bytes[i + 8];
52
+ return {
53
+ width,
54
+ height
55
+ };
56
+ }
57
+ }
58
+ if (i + 3 < bytes.length) {
59
+ const segmentLength = bytes[i + 2] << 8 | bytes[i + 3];
60
+ i += 2 + segmentLength;
61
+ } else break;
62
+ } else i++;
63
+ throw new Error('Unable to find JPEG dimensions');
64
+ }
65
+ function parseGifDimensions(bytes) {
66
+ const width = bytes[6] | bytes[7] << 8;
67
+ const height = bytes[8] | bytes[9] << 8;
68
+ return {
69
+ width,
70
+ height
71
+ };
72
+ }
73
+ function parseWebpDimensions(bytes) {
74
+ const fourCC = String.fromCharCode(bytes[12], bytes[13], bytes[14], bytes[15]);
75
+ if ('VP8 ' === fourCC) {
76
+ const startByte = 23;
77
+ const width = bytes[startByte + 3] | bytes[startByte + 4] << 8;
78
+ const height = bytes[startByte + 5] | bytes[startByte + 6] << 8;
79
+ return {
80
+ width: 0x3fff & width,
81
+ height: 0x3fff & height
82
+ };
83
+ }
84
+ if ('VP8L' === fourCC) {
85
+ const startByte = 21;
86
+ const bits = bytes[startByte] | bytes[startByte + 1] << 8 | bytes[startByte + 2] << 16 | bytes[startByte + 3] << 24;
87
+ const width = (0x3fff & bits) + 1;
88
+ const height = (bits >> 14 & 0x3fff) + 1;
89
+ return {
90
+ width,
91
+ height
92
+ };
93
+ }
94
+ if ('VP8X' === fourCC) {
95
+ const startByte = 24;
96
+ const width = bytes[startByte] | bytes[startByte + 1] << 8 | bytes[startByte + 2] << 16;
97
+ const height = bytes[startByte + 3] | bytes[startByte + 4] << 8 | bytes[startByte + 5] << 16;
98
+ return {
99
+ width: width + 1,
100
+ height: height + 1
101
+ };
102
+ }
103
+ throw new Error('Unsupported WebP format');
104
+ }
105
+ function parseBmpDimensions(bytes) {
106
+ const width = bytes[18] | bytes[19] << 8 | bytes[20] << 16 | bytes[21] << 24;
107
+ const height = bytes[22] | bytes[23] << 8 | bytes[24] << 16 | bytes[25] << 24;
108
+ return {
109
+ width,
110
+ height
111
+ };
112
+ }
113
+ export { IMAGE_TYPE_MAP, base64String2Uint8Array, parseBmpDimensions, parseGifDimensions, parseJpegDimensions, parsePngDimensions, parseWebpDimensions };
114
+
115
+ //# sourceMappingURL=image-parse.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64/image-parse.mjs","sources":["webpack://@agent-infra/media-utils/./src/base64/image-parse.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type { ImageType, ImageDimensions } from '../type';\n\nexport const IMAGE_TYPE_MAP = new Map<string, ImageType>([\n ['/9j/', 'jpeg'], // JPEG: FF D8 FF\n ['iVBORw', 'png'], // PNG: 89 50 4E 47\n ['UklGR', 'webp'], // WebP: 52 49 46 46\n ['R0lGOD', 'gif'], // GIF: 47 49 46 38\n ['Qk', 'bmp'], // BMP: 42 4D\n]);\n\nexport function base64String2Uint8Array(base64: string) {\n if (typeof Buffer !== 'undefined') {\n // Node.js environment\n return new Uint8Array(Buffer.from(base64, 'base64'));\n } else {\n // Browser environment\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n return bytes;\n }\n}\n\n/**\n * PNG: https://github.com/corkami/pics/blob/master/binary/PNG.png\n * JPEG: https://github.com/corkami/pics/blob/master/binary/JPG.png\n * WEBP: https://datatracker.ietf.org/doc/rfc9649/\n * GIF: https://github.com/corkami/pics/blob/master/binary/GIF.png\n * BMP: https://github.com/corkami/pics/blob/master/binary/bmp3.png\n */\n\nexport function parsePngDimensions(bytes: Uint8Array): ImageDimensions {\n // PNG dimensions are at bytes 16-23 (big-endian)\n const width =\n (bytes[16] << 24) | (bytes[17] << 16) | (bytes[18] << 8) | bytes[19];\n const height =\n (bytes[20] << 24) | (bytes[21] << 16) | (bytes[22] << 8) | bytes[23];\n return { width, height };\n}\n\nexport function parseJpegDimensions(bytes: Uint8Array): ImageDimensions {\n // JPEG requires parsing through segments to find SOF marker\n let i = 2; // Skip FF D8\n while (i < bytes.length - 1) {\n if (bytes[i] === 0xff) {\n const marker = bytes[i + 1];\n // SOF0, SOF1, SOF2 markers contain dimensions\n if (marker >= 0xc0 && marker <= 0xc3) {\n if (i + 8 < bytes.length) {\n const height = (bytes[i + 5] << 8) | bytes[i + 6];\n const width = (bytes[i + 7] << 8) | bytes[i + 8];\n return { width, height };\n }\n }\n // Skip to next segment\n if (i + 3 < bytes.length) {\n const segmentLength = (bytes[i + 2] << 8) | bytes[i + 3];\n i += 2 + segmentLength;\n } else {\n break;\n }\n } else {\n i++;\n }\n }\n throw new Error('Unable to find JPEG dimensions');\n}\n\nexport function parseGifDimensions(bytes: Uint8Array): ImageDimensions {\n // GIF dimensions are at bytes 6-9 (little-endian)\n const width = bytes[6] | (bytes[7] << 8);\n const height = bytes[8] | (bytes[9] << 8);\n return { width, height };\n}\n\nexport function parseWebpDimensions(bytes: Uint8Array): ImageDimensions {\n /**\n * WebP format varies, check for VP8/VP8L/VP8X\n *\n * - VP8 : Simple File Format (Lossy)\n * - VP8L: Simple File Format (Lossless)\n * - VP8X: Extended File Format\n */\n const fourCC = String.fromCharCode(\n bytes[12],\n bytes[13],\n bytes[14],\n bytes[15],\n );\n\n if (fourCC === 'VP8 ') {\n // VP8 format - dimensions are in the frame header\n // Skip chunk size (4 bytes) and frame tag (3 bytes) + key frame info (1 byte)\n const startByte = 20 + 3; // Start after VP8 chunk header + frame tag\n\n // Read width and height from VP8 frame header\n const width = bytes[startByte + 3] | (bytes[startByte + 4] << 8);\n const height = bytes[startByte + 5] | (bytes[startByte + 6] << 8);\n\n return {\n width: width & 0x3fff,\n height: height & 0x3fff,\n };\n } else if (fourCC === 'VP8L') {\n // VP8L format - dimensions are right after the signature\n // Skip chunk size (4 bytes) and VP8L signature (1 byte)\n const startByte = 20 + 1;\n\n // Read 4 bytes containing width and height info\n const bits =\n bytes[startByte] |\n (bytes[startByte + 1] << 8) |\n (bytes[startByte + 2] << 16) |\n (bytes[startByte + 3] << 24);\n\n const width = (bits & 0x3fff) + 1;\n const height = ((bits >> 14) & 0x3fff) + 1;\n\n return { width, height };\n } else if (fourCC === 'VP8X') {\n // VP8X format - extended format with dimensions in header\n // Skip chunk size (4 bytes) and flags (4 bytes)\n const startByte = 20 + 4;\n\n // Width is stored in 3 bytes (little endian) + 1\n const width =\n bytes[startByte] |\n (bytes[startByte + 1] << 8) |\n (bytes[startByte + 2] << 16);\n\n // Height is stored in next 3 bytes (little endian) + 1\n const height =\n bytes[startByte + 3] |\n (bytes[startByte + 4] << 8) |\n (bytes[startByte + 5] << 16);\n\n return {\n width: width + 1,\n height: height + 1,\n };\n }\n\n throw new Error('Unsupported WebP format');\n}\n\nexport function parseBmpDimensions(bytes: Uint8Array): ImageDimensions {\n // BMP dimensions are at bytes 18-25 (little-endian)\n const width =\n bytes[18] | (bytes[19] << 8) | (bytes[20] << 16) | (bytes[21] << 24);\n const height =\n bytes[22] | (bytes[23] << 8) | (bytes[24] << 16) | (bytes[25] << 24);\n return { width, height };\n}"],"names":["IMAGE_TYPE_MAP","Map","base64String2Uint8Array","base64","Buffer","Uint8Array","binaryString","atob","bytes","i","parsePngDimensions","width","height","parseJpegDimensions","marker","segmentLength","Error","parseGifDimensions","parseWebpDimensions","fourCC","String","startByte","bits","parseBmpDimensions"],"mappings":";;;;AAMO,MAAMA,iBAAiB,IAAIC,IAAuB;IACvD;QAAC;QAAQ;KAAO;IAChB;QAAC;QAAU;KAAM;IACjB;QAAC;QAAS;KAAO;IACjB;QAAC;QAAU;KAAM;IACjB;QAAC;QAAM;KAAM;CACd;AAEM,SAASC,wBAAwBC,MAAc;IACpD,IAAI,AAAkB,eAAlB,OAAOC,QAET,OAAO,IAAIC,WAAWD,OAAO,IAAI,CAACD,QAAQ;IACrC;QAEL,MAAMG,eAAeC,KAAKJ;QAC1B,MAAMK,QAAQ,IAAIH,WAAWC,aAAa,MAAM;QAChD,IAAK,IAAIG,IAAI,GAAGA,IAAIH,aAAa,MAAM,EAAEG,IACvCD,KAAK,CAACC,EAAE,GAAGH,aAAa,UAAU,CAACG;QAGrC,OAAOD;IACT;AACF;AAUO,SAASE,mBAAmBF,KAAiB;IAElD,MAAMG,QACHH,KAAK,CAAC,GAAG,IAAI,KAAOA,KAAK,CAAC,GAAG,IAAI,KAAOA,KAAK,CAAC,GAAG,IAAI,IAAKA,KAAK,CAAC,GAAG;IACtE,MAAMI,SACHJ,KAAK,CAAC,GAAG,IAAI,KAAOA,KAAK,CAAC,GAAG,IAAI,KAAOA,KAAK,CAAC,GAAG,IAAI,IAAKA,KAAK,CAAC,GAAG;IACtE,OAAO;QAAEG;QAAOC;IAAO;AACzB;AAEO,SAASC,oBAAoBL,KAAiB;IAEnD,IAAIC,IAAI;IACR,MAAOA,IAAID,MAAM,MAAM,GAAG,EACxB,IAAIA,AAAa,SAAbA,KAAK,CAACC,EAAE,EAAW;QACrB,MAAMK,SAASN,KAAK,CAACC,IAAI,EAAE;QAE3B,IAAIK,UAAU,QAAQA,UAAU,MAC9B;YAAA,IAAIL,IAAI,IAAID,MAAM,MAAM,EAAE;gBACxB,MAAMI,SAAUJ,KAAK,CAACC,IAAI,EAAE,IAAI,IAAKD,KAAK,CAACC,IAAI,EAAE;gBACjD,MAAME,QAASH,KAAK,CAACC,IAAI,EAAE,IAAI,IAAKD,KAAK,CAACC,IAAI,EAAE;gBAChD,OAAO;oBAAEE;oBAAOC;gBAAO;YACzB;QAAA;QAGF,IAAIH,IAAI,IAAID,MAAM,MAAM,EAAE;YACxB,MAAMO,gBAAiBP,KAAK,CAACC,IAAI,EAAE,IAAI,IAAKD,KAAK,CAACC,IAAI,EAAE;YACxDA,KAAK,IAAIM;QACX,OACE;IAEJ,OACEN;IAGJ,MAAM,IAAIO,MAAM;AAClB;AAEO,SAASC,mBAAmBT,KAAiB;IAElD,MAAMG,QAAQH,KAAK,CAAC,EAAE,GAAIA,KAAK,CAAC,EAAE,IAAI;IACtC,MAAMI,SAASJ,KAAK,CAAC,EAAE,GAAIA,KAAK,CAAC,EAAE,IAAI;IACvC,OAAO;QAAEG;QAAOC;IAAO;AACzB;AAEO,SAASM,oBAAoBV,KAAiB;IAQnD,MAAMW,SAASC,OAAO,YAAY,CAChCZ,KAAK,CAAC,GAAG,EACTA,KAAK,CAAC,GAAG,EACTA,KAAK,CAAC,GAAG,EACTA,KAAK,CAAC,GAAG;IAGX,IAAIW,AAAW,WAAXA,QAAmB;QAGrB,MAAME,YAAY;QAGlB,MAAMV,QAAQH,KAAK,CAACa,YAAY,EAAE,GAAIb,KAAK,CAACa,YAAY,EAAE,IAAI;QAC9D,MAAMT,SAASJ,KAAK,CAACa,YAAY,EAAE,GAAIb,KAAK,CAACa,YAAY,EAAE,IAAI;QAE/D,OAAO;YACL,OAAOV,AAAQ,SAARA;YACP,QAAQC,AAAS,SAATA;QACV;IACF;IAAO,IAAIO,AAAW,WAAXA,QAAmB;QAG5B,MAAME,YAAY;QAGlB,MAAMC,OACJd,KAAK,CAACa,UAAU,GACfb,KAAK,CAACa,YAAY,EAAE,IAAI,IACxBb,KAAK,CAACa,YAAY,EAAE,IAAI,KACxBb,KAAK,CAACa,YAAY,EAAE,IAAI;QAE3B,MAAMV,QAASW,AAAAA,CAAAA,AAAO,SAAPA,IAAY,IAAK;QAChC,MAAMV,SAAU,AAACU,CAAAA,QAAQ,KAAM,MAAK,IAAK;QAEzC,OAAO;YAAEX;YAAOC;QAAO;IACzB;IAAO,IAAIO,AAAW,WAAXA,QAAmB;QAG5B,MAAME,YAAY;QAGlB,MAAMV,QACJH,KAAK,CAACa,UAAU,GACfb,KAAK,CAACa,YAAY,EAAE,IAAI,IACxBb,KAAK,CAACa,YAAY,EAAE,IAAI;QAG3B,MAAMT,SACJJ,KAAK,CAACa,YAAY,EAAE,GACnBb,KAAK,CAACa,YAAY,EAAE,IAAI,IACxBb,KAAK,CAACa,YAAY,EAAE,IAAI;QAE3B,OAAO;YACL,OAAOV,QAAQ;YACf,QAAQC,SAAS;QACnB;IACF;IAEA,MAAM,IAAII,MAAM;AAClB;AAEO,SAASO,mBAAmBf,KAAiB;IAElD,MAAMG,QACJH,KAAK,CAAC,GAAG,GAAIA,KAAK,CAAC,GAAG,IAAI,IAAMA,KAAK,CAAC,GAAG,IAAI,KAAOA,KAAK,CAAC,GAAG,IAAI;IACnE,MAAMI,SACJJ,KAAK,CAAC,GAAG,GAAIA,KAAK,CAAC,GAAG,IAAI,IAAMA,KAAK,CAAC,GAAG,IAAI,KAAOA,KAAK,CAAC,GAAG,IAAI;IACnE,OAAO;QAAEG;QAAOC;IAAO;AACzB"}
@@ -0,0 +1,22 @@
1
+ import type { ImageDimensions, ImageType } from '../type';
2
+ export declare class Base64ImageParser {
3
+ private pureBase64;
4
+ private buffer?;
5
+ private imageType;
6
+ private dimensions;
7
+ constructor(base64Image: string);
8
+ getPureBase64Image(): string;
9
+ getBuffer(): Uint8Array;
10
+ /**
11
+ * get image type form base64 magic number
12
+ */
13
+ getImageType(): ImageType | null;
14
+ getDimensions(): ImageDimensions | null;
15
+ getDataUri(): string | null;
16
+ /**
17
+ * Get only the header bytes needed for dimension parsing
18
+ * This is much more memory efficient than converting the entire image
19
+ */
20
+ private getHeaderBuffer;
21
+ }
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/base64/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE1D,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAC,CAAa;IAE5B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,UAAU,CAAgC;gBAEtC,WAAW,EAAE,MAAM;IAIxB,kBAAkB,IAAI,MAAM;IAI5B,SAAS,IAAI,UAAU;IAM9B;;OAEG;IACI,YAAY,IAAI,SAAS,GAAG,IAAI;IAiBhC,aAAa,IAAI,eAAe,GAAG,IAAI;IAqDvC,UAAU;IASjB;;;OAGG;IACH,OAAO,CAAC,eAAe;CAcxB"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ "use strict";
6
+ var __webpack_require__ = {};
7
+ (()=>{
8
+ __webpack_require__.d = (exports1, definition)=>{
9
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
10
+ enumerable: true,
11
+ get: definition[key]
12
+ });
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ Base64ImageParser: ()=>Base64ImageParser
32
+ });
33
+ const external_image_parse_js_namespaceObject = require("./image-parse.js");
34
+ function _define_property(obj, key, value) {
35
+ if (key in obj) Object.defineProperty(obj, key, {
36
+ value: value,
37
+ enumerable: true,
38
+ configurable: true,
39
+ writable: true
40
+ });
41
+ else obj[key] = value;
42
+ return obj;
43
+ }
44
+ class Base64ImageParser {
45
+ getPureBase64Image() {
46
+ return this.pureBase64;
47
+ }
48
+ getBuffer() {
49
+ this.buffer = (0, external_image_parse_js_namespaceObject.base64String2Uint8Array)(this.pureBase64);
50
+ return this.buffer;
51
+ }
52
+ getImageType() {
53
+ if (this.imageType) return this.imageType;
54
+ const prefix = this.pureBase64.substring(0, 8);
55
+ for (const [signature, type] of external_image_parse_js_namespaceObject.IMAGE_TYPE_MAP)if (prefix.startsWith(signature)) {
56
+ this.imageType = type;
57
+ break;
58
+ }
59
+ return this.imageType;
60
+ }
61
+ getDimensions() {
62
+ if (this.dimensions) return this.dimensions;
63
+ const imageType = this.getImageType();
64
+ if (!imageType) return null;
65
+ try {
66
+ switch(imageType){
67
+ case 'png':
68
+ {
69
+ const bytes = this.getHeaderBuffer(32);
70
+ this.dimensions = (0, external_image_parse_js_namespaceObject.parsePngDimensions)(bytes);
71
+ break;
72
+ }
73
+ case 'jpeg':
74
+ try {
75
+ const headerBytes = this.getHeaderBuffer(1024);
76
+ this.dimensions = (0, external_image_parse_js_namespaceObject.parseJpegDimensions)(headerBytes);
77
+ } catch (e) {
78
+ const fullBuffer = this.getBuffer();
79
+ this.dimensions = (0, external_image_parse_js_namespaceObject.parseJpegDimensions)(fullBuffer);
80
+ }
81
+ break;
82
+ case 'webp':
83
+ {
84
+ const bytes = this.getHeaderBuffer(32);
85
+ this.dimensions = (0, external_image_parse_js_namespaceObject.parseWebpDimensions)(bytes);
86
+ break;
87
+ }
88
+ case 'gif':
89
+ {
90
+ const bytes = this.getHeaderBuffer(24);
91
+ this.dimensions = (0, external_image_parse_js_namespaceObject.parseGifDimensions)(bytes);
92
+ break;
93
+ }
94
+ case 'bmp':
95
+ {
96
+ const bytes = this.getHeaderBuffer(40);
97
+ this.dimensions = (0, external_image_parse_js_namespaceObject.parseBmpDimensions)(bytes);
98
+ break;
99
+ }
100
+ default:
101
+ return null;
102
+ }
103
+ return this.dimensions;
104
+ } catch (error) {
105
+ console.warn('Failed to parse image dimensions:', error);
106
+ return null;
107
+ }
108
+ }
109
+ getDataUri() {
110
+ const imageType = this.getImageType();
111
+ if (imageType) return `data:image/${this.imageType};base64,${this.pureBase64}`;
112
+ return null;
113
+ }
114
+ getHeaderBuffer(maxBytes) {
115
+ if (this.buffer) return this.buffer;
116
+ const base64CharsNeeded = Math.ceil(4 * maxBytes / 3);
117
+ const alignedChars = 4 * Math.ceil(base64CharsNeeded / 4);
118
+ const headerBase64 = this.pureBase64.substring(0, alignedChars);
119
+ return (0, external_image_parse_js_namespaceObject.base64String2Uint8Array)(headerBase64);
120
+ }
121
+ constructor(base64Image){
122
+ _define_property(this, "pureBase64", void 0);
123
+ _define_property(this, "buffer", void 0);
124
+ _define_property(this, "imageType", null);
125
+ _define_property(this, "dimensions", null);
126
+ this.pureBase64 = base64Image.replace(/^data:image\/\w+;base64,/, '');
127
+ }
128
+ }
129
+ exports.Base64ImageParser = __webpack_exports__.Base64ImageParser;
130
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
131
+ "Base64ImageParser"
132
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
133
+ Object.defineProperty(exports, '__esModule', {
134
+ value: true
135
+ });
136
+
137
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64/index.js","sources":["webpack://@agent-infra/media-utils/webpack/runtime/define_property_getters","webpack://@agent-infra/media-utils/webpack/runtime/has_own_property","webpack://@agent-infra/media-utils/webpack/runtime/make_namespace_object","webpack://@agent-infra/media-utils/./src/base64/index.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n base64String2Uint8Array,\n IMAGE_TYPE_MAP,\n parseBmpDimensions,\n parseGifDimensions,\n parseJpegDimensions,\n parsePngDimensions,\n parseWebpDimensions,\n} from './image-parse';\n\nimport type { ImageDimensions, ImageType } from '../type';\n\nexport class Base64ImageParser {\n private pureBase64: string;\n private buffer?: Uint8Array;\n\n private imageType: ImageType | null = null;\n private dimensions: ImageDimensions | null = null;\n\n constructor(base64Image: string) {\n this.pureBase64 = base64Image.replace(/^data:image\\/\\w+;base64,/, '');\n }\n\n public getPureBase64Image(): string {\n return this.pureBase64;\n }\n\n public getBuffer(): Uint8Array {\n this.buffer = base64String2Uint8Array(this.pureBase64);\n\n return this.buffer;\n }\n\n /**\n * get image type form base64 magic number\n */\n public getImageType(): ImageType | null {\n if (this.imageType) {\n return this.imageType;\n }\n\n const prefix = this.pureBase64.substring(0, 8);\n\n for (const [signature, type] of IMAGE_TYPE_MAP) {\n if (prefix.startsWith(signature)) {\n this.imageType = type;\n break;\n }\n }\n\n return this.imageType;\n }\n\n public getDimensions(): ImageDimensions | null {\n if (this.dimensions) {\n return this.dimensions;\n }\n\n const imageType = this.getImageType();\n if (!imageType) {\n return null;\n }\n\n try {\n switch (imageType) {\n case 'png': {\n const bytes = this.getHeaderBuffer(32); // 16-23\n this.dimensions = parsePngDimensions(bytes);\n break;\n }\n case 'jpeg': {\n try {\n const headerBytes = this.getHeaderBuffer(1024); // SOF marker\n this.dimensions = parseJpegDimensions(headerBytes);\n } catch(e) {\n const fullBuffer = this.getBuffer();\n this.dimensions = parseJpegDimensions(fullBuffer);\n }\n break;\n }\n case 'webp': {\n const bytes = this.getHeaderBuffer(32); // 23 - 29\n this.dimensions = parseWebpDimensions(bytes);\n break;\n }\n case 'gif': {\n const bytes = this.getHeaderBuffer(24); // 6 - 9\n this.dimensions = parseGifDimensions(bytes);\n break;\n }\n case 'bmp': {\n const bytes = this.getHeaderBuffer(40); // 18-25\n this.dimensions = parseBmpDimensions(bytes);\n break;\n }\n default:\n return null;\n }\n\n return this.dimensions;\n } catch (error) {\n console.warn('Failed to parse image dimensions:', error);\n return null;\n }\n }\n\n public getDataUri() {\n const imageType = this.getImageType();\n if (imageType) {\n return `data:image/${this.imageType};base64,${this.pureBase64}`;\n }\n\n return null;\n }\n\n /**\n * Get only the header bytes needed for dimension parsing\n * This is much more memory efficient than converting the entire image\n */\n private getHeaderBuffer(maxBytes: number): Uint8Array {\n if (this.buffer) {\n return this.buffer;\n }\n\n // Calculate how much of the base64 we need to decode\n // Base64 encoding: 4 characters represent 3 bytes\n const base64CharsNeeded = Math.ceil((maxBytes * 4) / 3);\n // Round up to nearest multiple of 4 to avoid padding issues\n const alignedChars = Math.ceil(base64CharsNeeded / 4) * 4;\n const headerBase64 = this.pureBase64.substring(0, alignedChars);\n\n return base64String2Uint8Array(headerBase64);\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","Base64ImageParser","base64String2Uint8Array","prefix","signature","type","IMAGE_TYPE_MAP","imageType","bytes","parsePngDimensions","headerBytes","parseJpegDimensions","e","fullBuffer","parseWebpDimensions","parseGifDimensions","parseBmpDimensions","error","console","maxBytes","base64CharsNeeded","Math","alignedChars","headerBase64","base64Image"],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { IMAGE_TYPE_MAP, base64String2Uint8Array, parseBmpDimensions, parseGifDimensions, parseJpegDimensions, parsePngDimensions, parseWebpDimensions } from "./image-parse.mjs";
6
+ function _define_property(obj, key, value) {
7
+ if (key in obj) Object.defineProperty(obj, key, {
8
+ value: value,
9
+ enumerable: true,
10
+ configurable: true,
11
+ writable: true
12
+ });
13
+ else obj[key] = value;
14
+ return obj;
15
+ }
16
+ class Base64ImageParser {
17
+ getPureBase64Image() {
18
+ return this.pureBase64;
19
+ }
20
+ getBuffer() {
21
+ this.buffer = base64String2Uint8Array(this.pureBase64);
22
+ return this.buffer;
23
+ }
24
+ getImageType() {
25
+ if (this.imageType) return this.imageType;
26
+ const prefix = this.pureBase64.substring(0, 8);
27
+ for (const [signature, type] of IMAGE_TYPE_MAP)if (prefix.startsWith(signature)) {
28
+ this.imageType = type;
29
+ break;
30
+ }
31
+ return this.imageType;
32
+ }
33
+ getDimensions() {
34
+ if (this.dimensions) return this.dimensions;
35
+ const imageType = this.getImageType();
36
+ if (!imageType) return null;
37
+ try {
38
+ switch(imageType){
39
+ case 'png':
40
+ {
41
+ const bytes = this.getHeaderBuffer(32);
42
+ this.dimensions = parsePngDimensions(bytes);
43
+ break;
44
+ }
45
+ case 'jpeg':
46
+ try {
47
+ const headerBytes = this.getHeaderBuffer(1024);
48
+ this.dimensions = parseJpegDimensions(headerBytes);
49
+ } catch (e) {
50
+ const fullBuffer = this.getBuffer();
51
+ this.dimensions = parseJpegDimensions(fullBuffer);
52
+ }
53
+ break;
54
+ case 'webp':
55
+ {
56
+ const bytes = this.getHeaderBuffer(32);
57
+ this.dimensions = parseWebpDimensions(bytes);
58
+ break;
59
+ }
60
+ case 'gif':
61
+ {
62
+ const bytes = this.getHeaderBuffer(24);
63
+ this.dimensions = parseGifDimensions(bytes);
64
+ break;
65
+ }
66
+ case 'bmp':
67
+ {
68
+ const bytes = this.getHeaderBuffer(40);
69
+ this.dimensions = parseBmpDimensions(bytes);
70
+ break;
71
+ }
72
+ default:
73
+ return null;
74
+ }
75
+ return this.dimensions;
76
+ } catch (error) {
77
+ console.warn('Failed to parse image dimensions:', error);
78
+ return null;
79
+ }
80
+ }
81
+ getDataUri() {
82
+ const imageType = this.getImageType();
83
+ if (imageType) return `data:image/${this.imageType};base64,${this.pureBase64}`;
84
+ return null;
85
+ }
86
+ getHeaderBuffer(maxBytes) {
87
+ if (this.buffer) return this.buffer;
88
+ const base64CharsNeeded = Math.ceil(4 * maxBytes / 3);
89
+ const alignedChars = 4 * Math.ceil(base64CharsNeeded / 4);
90
+ const headerBase64 = this.pureBase64.substring(0, alignedChars);
91
+ return base64String2Uint8Array(headerBase64);
92
+ }
93
+ constructor(base64Image){
94
+ _define_property(this, "pureBase64", void 0);
95
+ _define_property(this, "buffer", void 0);
96
+ _define_property(this, "imageType", null);
97
+ _define_property(this, "dimensions", null);
98
+ this.pureBase64 = base64Image.replace(/^data:image\/\w+;base64,/, '');
99
+ }
100
+ }
101
+ export { Base64ImageParser };
102
+
103
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64/index.mjs","sources":["webpack://@agent-infra/media-utils/./src/base64/index.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n base64String2Uint8Array,\n IMAGE_TYPE_MAP,\n parseBmpDimensions,\n parseGifDimensions,\n parseJpegDimensions,\n parsePngDimensions,\n parseWebpDimensions,\n} from './image-parse';\n\nimport type { ImageDimensions, ImageType } from '../type';\n\nexport class Base64ImageParser {\n private pureBase64: string;\n private buffer?: Uint8Array;\n\n private imageType: ImageType | null = null;\n private dimensions: ImageDimensions | null = null;\n\n constructor(base64Image: string) {\n this.pureBase64 = base64Image.replace(/^data:image\\/\\w+;base64,/, '');\n }\n\n public getPureBase64Image(): string {\n return this.pureBase64;\n }\n\n public getBuffer(): Uint8Array {\n this.buffer = base64String2Uint8Array(this.pureBase64);\n\n return this.buffer;\n }\n\n /**\n * get image type form base64 magic number\n */\n public getImageType(): ImageType | null {\n if (this.imageType) {\n return this.imageType;\n }\n\n const prefix = this.pureBase64.substring(0, 8);\n\n for (const [signature, type] of IMAGE_TYPE_MAP) {\n if (prefix.startsWith(signature)) {\n this.imageType = type;\n break;\n }\n }\n\n return this.imageType;\n }\n\n public getDimensions(): ImageDimensions | null {\n if (this.dimensions) {\n return this.dimensions;\n }\n\n const imageType = this.getImageType();\n if (!imageType) {\n return null;\n }\n\n try {\n switch (imageType) {\n case 'png': {\n const bytes = this.getHeaderBuffer(32); // 16-23\n this.dimensions = parsePngDimensions(bytes);\n break;\n }\n case 'jpeg': {\n try {\n const headerBytes = this.getHeaderBuffer(1024); // SOF marker\n this.dimensions = parseJpegDimensions(headerBytes);\n } catch(e) {\n const fullBuffer = this.getBuffer();\n this.dimensions = parseJpegDimensions(fullBuffer);\n }\n break;\n }\n case 'webp': {\n const bytes = this.getHeaderBuffer(32); // 23 - 29\n this.dimensions = parseWebpDimensions(bytes);\n break;\n }\n case 'gif': {\n const bytes = this.getHeaderBuffer(24); // 6 - 9\n this.dimensions = parseGifDimensions(bytes);\n break;\n }\n case 'bmp': {\n const bytes = this.getHeaderBuffer(40); // 18-25\n this.dimensions = parseBmpDimensions(bytes);\n break;\n }\n default:\n return null;\n }\n\n return this.dimensions;\n } catch (error) {\n console.warn('Failed to parse image dimensions:', error);\n return null;\n }\n }\n\n public getDataUri() {\n const imageType = this.getImageType();\n if (imageType) {\n return `data:image/${this.imageType};base64,${this.pureBase64}`;\n }\n\n return null;\n }\n\n /**\n * Get only the header bytes needed for dimension parsing\n * This is much more memory efficient than converting the entire image\n */\n private getHeaderBuffer(maxBytes: number): Uint8Array {\n if (this.buffer) {\n return this.buffer;\n }\n\n // Calculate how much of the base64 we need to decode\n // Base64 encoding: 4 characters represent 3 bytes\n const base64CharsNeeded = Math.ceil((maxBytes * 4) / 3);\n // Round up to nearest multiple of 4 to avoid padding issues\n const alignedChars = Math.ceil(base64CharsNeeded / 4) * 4;\n const headerBase64 = this.pureBase64.substring(0, alignedChars);\n\n return base64String2Uint8Array(headerBase64);\n }\n}\n"],"names":["Base64ImageParser","base64String2Uint8Array","prefix","signature","type","IMAGE_TYPE_MAP","imageType","bytes","parsePngDimensions","headerBytes","parseJpegDimensions","e","fullBuffer","parseWebpDimensions","parseGifDimensions","parseBmpDimensions","error","console","maxBytes","base64CharsNeeded","Math","alignedChars","headerBase64","base64Image"],"mappings":";;;;;AAGC;;;;;;;;;;AAaM,MAAMA;IAWJ,qBAA6B;QAClC,OAAO,IAAI,CAAC,UAAU;IACxB;IAEO,YAAwB;QAC7B,IAAI,CAAC,MAAM,GAAGC,wBAAwB,IAAI,CAAC,UAAU;QAErD,OAAO,IAAI,CAAC,MAAM;IACpB;IAKO,eAAiC;QACtC,IAAI,IAAI,CAAC,SAAS,EAChB,OAAO,IAAI,CAAC,SAAS;QAGvB,MAAMC,SAAS,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG;QAE5C,KAAK,MAAM,CAACC,WAAWC,KAAK,IAAIC,eAC9B,IAAIH,OAAO,UAAU,CAACC,YAAY;YAChC,IAAI,CAAC,SAAS,GAAGC;YACjB;QACF;QAGF,OAAO,IAAI,CAAC,SAAS;IACvB;IAEO,gBAAwC;QAC7C,IAAI,IAAI,CAAC,UAAU,EACjB,OAAO,IAAI,CAAC,UAAU;QAGxB,MAAME,YAAY,IAAI,CAAC,YAAY;QACnC,IAAI,CAACA,WACH,OAAO;QAGT,IAAI;YACF,OAAQA;gBACN,KAAK;oBAAO;wBACV,MAAMC,QAAQ,IAAI,CAAC,eAAe,CAAC;wBACnC,IAAI,CAAC,UAAU,GAAGC,mBAAmBD;wBACrC;oBACF;gBACA,KAAK;oBACH,IAAI;wBACF,MAAME,cAAc,IAAI,CAAC,eAAe,CAAC;wBACzC,IAAI,CAAC,UAAU,GAAGC,oBAAoBD;oBACxC,EAAE,OAAME,GAAG;wBACT,MAAMC,aAAa,IAAI,CAAC,SAAS;wBACjC,IAAI,CAAC,UAAU,GAAGF,oBAAoBE;oBACxC;oBACA;gBAEF,KAAK;oBAAQ;wBACX,MAAML,QAAQ,IAAI,CAAC,eAAe,CAAC;wBACnC,IAAI,CAAC,UAAU,GAAGM,oBAAoBN;wBACtC;oBACF;gBACA,KAAK;oBAAO;wBACV,MAAMA,QAAQ,IAAI,CAAC,eAAe,CAAC;wBACnC,IAAI,CAAC,UAAU,GAAGO,mBAAmBP;wBACrC;oBACF;gBACA,KAAK;oBAAO;wBACV,MAAMA,QAAQ,IAAI,CAAC,eAAe,CAAC;wBACnC,IAAI,CAAC,UAAU,GAAGQ,mBAAmBR;wBACrC;oBACF;gBACA;oBACE,OAAO;YACX;YAEA,OAAO,IAAI,CAAC,UAAU;QACxB,EAAE,OAAOS,OAAO;YACdC,QAAQ,IAAI,CAAC,qCAAqCD;YAClD,OAAO;QACT;IACF;IAEO,aAAa;QAClB,MAAMV,YAAY,IAAI,CAAC,YAAY;QACnC,IAAIA,WACF,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE;QAGjE,OAAO;IACT;IAMQ,gBAAgBY,QAAgB,EAAc;QACpD,IAAI,IAAI,CAAC,MAAM,EACb,OAAO,IAAI,CAAC,MAAM;QAKpB,MAAMC,oBAAoBC,KAAK,IAAI,CAAEF,AAAW,IAAXA,WAAgB;QAErD,MAAMG,eAAeD,AAAmC,IAAnCA,KAAK,IAAI,CAACD,oBAAoB;QACnD,MAAMG,eAAe,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAGD;QAElD,OAAOpB,wBAAwBqB;IACjC;IAjHA,YAAYC,WAAmB,CAAE;QANjC,uBAAQ,cAAR;QACA,uBAAQ,UAAR;QAEA,uBAAQ,aAA8B;QACtC,uBAAQ,cAAqC;QAG3C,IAAI,CAAC,UAAU,GAAGA,YAAY,OAAO,CAAC,4BAA4B;IACpE;AAgHF"}
@@ -0,0 +1,3 @@
1
+ export * from './base64';
2
+ export * from './type';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ "use strict";
6
+ var __webpack_modules__ = {
7
+ "./base64": function(module) {
8
+ module.exports = require("./base64/index.js");
9
+ },
10
+ "./type": function(module) {
11
+ module.exports = require("./type.js");
12
+ }
13
+ };
14
+ var __webpack_module_cache__ = {};
15
+ function __webpack_require__(moduleId) {
16
+ var cachedModule = __webpack_module_cache__[moduleId];
17
+ if (void 0 !== cachedModule) return cachedModule.exports;
18
+ var module = __webpack_module_cache__[moduleId] = {
19
+ exports: {}
20
+ };
21
+ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
22
+ return module.exports;
23
+ }
24
+ (()=>{
25
+ __webpack_require__.n = (module)=>{
26
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
27
+ __webpack_require__.d(getter, {
28
+ a: getter
29
+ });
30
+ return getter;
31
+ };
32
+ })();
33
+ (()=>{
34
+ __webpack_require__.d = (exports1, definition)=>{
35
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
36
+ enumerable: true,
37
+ get: definition[key]
38
+ });
39
+ };
40
+ })();
41
+ (()=>{
42
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
43
+ })();
44
+ (()=>{
45
+ __webpack_require__.r = (exports1)=>{
46
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
47
+ value: 'Module'
48
+ });
49
+ Object.defineProperty(exports1, '__esModule', {
50
+ value: true
51
+ });
52
+ };
53
+ })();
54
+ var __webpack_exports__ = {};
55
+ (()=>{
56
+ __webpack_require__.r(__webpack_exports__);
57
+ var _base64__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./base64");
58
+ var __WEBPACK_REEXPORT_OBJECT__ = {};
59
+ for(var __WEBPACK_IMPORT_KEY__ in _base64__WEBPACK_IMPORTED_MODULE_0__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
60
+ return _base64__WEBPACK_IMPORTED_MODULE_0__[key];
61
+ }).bind(0, __WEBPACK_IMPORT_KEY__);
62
+ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
63
+ var _type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./type");
64
+ var __WEBPACK_REEXPORT_OBJECT__ = {};
65
+ for(var __WEBPACK_IMPORT_KEY__ in _type__WEBPACK_IMPORTED_MODULE_1__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
66
+ return _type__WEBPACK_IMPORTED_MODULE_1__[key];
67
+ }).bind(0, __WEBPACK_IMPORT_KEY__);
68
+ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
69
+ })();
70
+ for(var __webpack_i__ in __webpack_exports__)exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
71
+ Object.defineProperty(exports, '__esModule', {
72
+ value: true
73
+ });
74
+
75
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["webpack://@agent-infra/media-utils/webpack/runtime/compat_get_default_export","webpack://@agent-infra/media-utils/webpack/runtime/define_property_getters","webpack://@agent-infra/media-utils/webpack/runtime/has_own_property","webpack://@agent-infra/media-utils/webpack/runtime/make_namespace_object"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;IACAA,oBAAoB,CAAC,GAAG,CAACC;QACxB,IAAIC,SAASD,UAAUA,OAAO,UAAU,GACvC,IAAOA,MAAM,CAAC,UAAU,GACxB,IAAOA;QACRD,oBAAoB,CAAC,CAACE,QAAQ;YAAE,GAAGA;QAAO;QAC1C,OAAOA;IACR;;;ICPAF,oBAAoB,CAAC,GAAG,CAAC,UAASG;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGH,oBAAoB,CAAC,CAACG,YAAYC,QAAQ,CAACJ,oBAAoB,CAAC,CAAC,UAASI,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAJ,oBAAoB,CAAC,GAAG,CAACM,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFP,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOQ,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D"}
package/dist/index.mjs ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ export * from "./base64/index.mjs";
6
+ export * from "./type.mjs";
package/dist/type.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export type ImageType = 'jpeg' | 'png' | 'webp' | 'gif' | 'bmp';
2
+ export interface ImageDimensions {
3
+ width: number;
4
+ height: number;
5
+ }
6
+ //# sourceMappingURL=type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAEhE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB"}
package/dist/type.js ADDED
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ "use strict";
6
+ var __webpack_require__ = {};
7
+ (()=>{
8
+ __webpack_require__.r = (exports1)=>{
9
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
10
+ value: 'Module'
11
+ });
12
+ Object.defineProperty(exports1, '__esModule', {
13
+ value: true
14
+ });
15
+ };
16
+ })();
17
+ var __webpack_exports__ = {};
18
+ __webpack_require__.r(__webpack_exports__);
19
+ for(var __webpack_i__ in __webpack_exports__)exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
20
+ Object.defineProperty(exports, '__esModule', {
21
+ value: true
22
+ });
23
+
24
+ //# sourceMappingURL=type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type.js","sources":["webpack://@agent-infra/media-utils/webpack/runtime/make_namespace_object"],"sourcesContent":["// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};"],"names":["__webpack_require__","Symbol","Object"],"mappings":";;;;;;;IACAA,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOC,UAA0BA,OAAO,WAAW,EACrDC,OAAO,cAAc,CAAC,UAASD,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEC,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D"}
package/dist/type.mjs ADDED
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@agent-infra/media-utils",
3
+ "description": "media-utils",
4
+ "version": "0.1.3",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git@github.com:agent-infra/browser.git"
21
+ },
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "dependencies": {
26
+ "@agent-infra/logger": "0.0.2-beta.2",
27
+ "delay": "6.0.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "24.1.0",
31
+ "typescript": "5.8.3",
32
+ "vitest": "3.2.4",
33
+ "@vitest/coverage-v8": "3.2.4",
34
+ "@rslib/core": "0.11.0"
35
+ },
36
+ "scripts": {
37
+ "dev": "rslib build --watch",
38
+ "build": "rslib build",
39
+ "test": "vitest run",
40
+ "test:watch": "vitest",
41
+ "coverage": "vitest run --coverage"
42
+ }
43
+ }