@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 +68 -0
- package/dist/base64/image-parse.d.ts +16 -0
- package/dist/base64/image-parse.d.ts.map +1 -0
- package/dist/base64/image-parse.js +167 -0
- package/dist/base64/image-parse.js.map +1 -0
- package/dist/base64/image-parse.mjs +115 -0
- package/dist/base64/image-parse.mjs.map +1 -0
- package/dist/base64/index.d.ts +22 -0
- package/dist/base64/index.d.ts.map +1 -0
- package/dist/base64/index.js +137 -0
- package/dist/base64/index.js.map +1 -0
- package/dist/base64/index.mjs +103 -0
- package/dist/base64/index.mjs.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +75 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +6 -0
- package/dist/type.d.ts +6 -0
- package/dist/type.d.ts.map +1 -0
- package/dist/type.js +24 -0
- package/dist/type.js.map +1 -0
- package/dist/type.mjs +4 -0
- package/package.json +43 -0
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":"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"}
|
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
package/dist/type.d.ts
ADDED
|
@@ -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
|
package/dist/type.js.map
ADDED
|
@@ -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
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
|
+
}
|