@kenzuya/mediabunny 1.26.0 → 1.28.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/README.md +1 -1
  2. package/dist/bundles/{mediabunny.mjs → mediabunny.js} +21963 -21388
  3. package/dist/bundles/mediabunny.min.js +490 -0
  4. package/dist/modules/shared/mp3-misc.d.ts.map +1 -1
  5. package/dist/modules/src/adts/adts-demuxer.d.ts +6 -6
  6. package/dist/modules/src/adts/adts-demuxer.d.ts.map +1 -1
  7. package/dist/modules/src/adts/adts-muxer.d.ts +4 -4
  8. package/dist/modules/src/adts/adts-muxer.d.ts.map +1 -1
  9. package/dist/modules/src/adts/adts-reader.d.ts +1 -1
  10. package/dist/modules/src/adts/adts-reader.d.ts.map +1 -1
  11. package/dist/modules/src/avi/avi-demuxer.d.ts +44 -0
  12. package/dist/modules/src/avi/avi-demuxer.d.ts.map +1 -0
  13. package/dist/modules/src/avi/avi-misc.d.ts +88 -0
  14. package/dist/modules/src/avi/avi-misc.d.ts.map +1 -0
  15. package/dist/modules/src/avi/avi-muxer.d.ts +45 -0
  16. package/dist/modules/src/avi/avi-muxer.d.ts.map +1 -0
  17. package/dist/modules/src/avi/riff-writer.d.ts +26 -0
  18. package/dist/modules/src/avi/riff-writer.d.ts.map +1 -0
  19. package/dist/modules/src/codec-data.d.ts +8 -3
  20. package/dist/modules/src/codec-data.d.ts.map +1 -1
  21. package/dist/modules/src/codec.d.ts +10 -10
  22. package/dist/modules/src/codec.d.ts.map +1 -1
  23. package/dist/modules/src/conversion.d.ts +33 -16
  24. package/dist/modules/src/conversion.d.ts.map +1 -1
  25. package/dist/modules/src/custom-coder.d.ts +8 -8
  26. package/dist/modules/src/custom-coder.d.ts.map +1 -1
  27. package/dist/modules/src/demuxer.d.ts +3 -3
  28. package/dist/modules/src/demuxer.d.ts.map +1 -1
  29. package/dist/modules/src/encode.d.ts +8 -8
  30. package/dist/modules/src/encode.d.ts.map +1 -1
  31. package/dist/modules/src/flac/flac-demuxer.d.ts +7 -7
  32. package/dist/modules/src/flac/flac-demuxer.d.ts.map +1 -1
  33. package/dist/modules/src/flac/flac-misc.d.ts +3 -3
  34. package/dist/modules/src/flac/flac-misc.d.ts.map +1 -1
  35. package/dist/modules/src/flac/flac-muxer.d.ts +5 -5
  36. package/dist/modules/src/flac/flac-muxer.d.ts.map +1 -1
  37. package/dist/modules/src/id3.d.ts +3 -3
  38. package/dist/modules/src/id3.d.ts.map +1 -1
  39. package/dist/modules/src/index.d.ts +20 -20
  40. package/dist/modules/src/index.d.ts.map +1 -1
  41. package/dist/modules/src/input-format.d.ts +22 -0
  42. package/dist/modules/src/input-format.d.ts.map +1 -1
  43. package/dist/modules/src/input-track.d.ts +8 -8
  44. package/dist/modules/src/input-track.d.ts.map +1 -1
  45. package/dist/modules/src/input.d.ts +12 -12
  46. package/dist/modules/src/isobmff/isobmff-boxes.d.ts +2 -2
  47. package/dist/modules/src/isobmff/isobmff-boxes.d.ts.map +1 -1
  48. package/dist/modules/src/isobmff/isobmff-demuxer.d.ts +12 -12
  49. package/dist/modules/src/isobmff/isobmff-demuxer.d.ts.map +1 -1
  50. package/dist/modules/src/isobmff/isobmff-misc.d.ts.map +1 -1
  51. package/dist/modules/src/isobmff/isobmff-muxer.d.ts +11 -11
  52. package/dist/modules/src/isobmff/isobmff-muxer.d.ts.map +1 -1
  53. package/dist/modules/src/isobmff/isobmff-reader.d.ts +2 -2
  54. package/dist/modules/src/isobmff/isobmff-reader.d.ts.map +1 -1
  55. package/dist/modules/src/matroska/ebml.d.ts +3 -3
  56. package/dist/modules/src/matroska/ebml.d.ts.map +1 -1
  57. package/dist/modules/src/matroska/matroska-demuxer.d.ts +13 -13
  58. package/dist/modules/src/matroska/matroska-demuxer.d.ts.map +1 -1
  59. package/dist/modules/src/matroska/matroska-input.d.ts +33 -0
  60. package/dist/modules/src/matroska/matroska-input.d.ts.map +1 -0
  61. package/dist/modules/src/matroska/matroska-misc.d.ts.map +1 -1
  62. package/dist/modules/src/matroska/matroska-muxer.d.ts +5 -5
  63. package/dist/modules/src/matroska/matroska-muxer.d.ts.map +1 -1
  64. package/dist/modules/src/media-sink.d.ts +5 -5
  65. package/dist/modules/src/media-sink.d.ts.map +1 -1
  66. package/dist/modules/src/media-source.d.ts +22 -4
  67. package/dist/modules/src/media-source.d.ts.map +1 -1
  68. package/dist/modules/src/metadata.d.ts +2 -2
  69. package/dist/modules/src/metadata.d.ts.map +1 -1
  70. package/dist/modules/src/misc.d.ts +5 -4
  71. package/dist/modules/src/misc.d.ts.map +1 -1
  72. package/dist/modules/src/mp3/mp3-demuxer.d.ts +7 -7
  73. package/dist/modules/src/mp3/mp3-demuxer.d.ts.map +1 -1
  74. package/dist/modules/src/mp3/mp3-muxer.d.ts +4 -4
  75. package/dist/modules/src/mp3/mp3-muxer.d.ts.map +1 -1
  76. package/dist/modules/src/mp3/mp3-reader.d.ts +2 -2
  77. package/dist/modules/src/mp3/mp3-reader.d.ts.map +1 -1
  78. package/dist/modules/src/mp3/mp3-writer.d.ts +1 -1
  79. package/dist/modules/src/mp3/mp3-writer.d.ts.map +1 -1
  80. package/dist/modules/src/muxer.d.ts +4 -4
  81. package/dist/modules/src/muxer.d.ts.map +1 -1
  82. package/dist/modules/src/node.d.ts +1 -1
  83. package/dist/modules/src/ogg/ogg-demuxer.d.ts +7 -7
  84. package/dist/modules/src/ogg/ogg-demuxer.d.ts.map +1 -1
  85. package/dist/modules/src/ogg/ogg-misc.d.ts +1 -1
  86. package/dist/modules/src/ogg/ogg-misc.d.ts.map +1 -1
  87. package/dist/modules/src/ogg/ogg-muxer.d.ts +5 -5
  88. package/dist/modules/src/ogg/ogg-muxer.d.ts.map +1 -1
  89. package/dist/modules/src/ogg/ogg-reader.d.ts +1 -1
  90. package/dist/modules/src/ogg/ogg-reader.d.ts.map +1 -1
  91. package/dist/modules/src/output-format.d.ts +51 -6
  92. package/dist/modules/src/output-format.d.ts.map +1 -1
  93. package/dist/modules/src/output.d.ts +13 -13
  94. package/dist/modules/src/output.d.ts.map +1 -1
  95. package/dist/modules/src/packet.d.ts +1 -1
  96. package/dist/modules/src/packet.d.ts.map +1 -1
  97. package/dist/modules/src/pcm.d.ts.map +1 -1
  98. package/dist/modules/src/reader.d.ts +2 -2
  99. package/dist/modules/src/reader.d.ts.map +1 -1
  100. package/dist/modules/src/sample.d.ts +57 -15
  101. package/dist/modules/src/sample.d.ts.map +1 -1
  102. package/dist/modules/src/source.d.ts +3 -3
  103. package/dist/modules/src/source.d.ts.map +1 -1
  104. package/dist/modules/src/subtitles.d.ts +1 -1
  105. package/dist/modules/src/subtitles.d.ts.map +1 -1
  106. package/dist/modules/src/target.d.ts +2 -2
  107. package/dist/modules/src/target.d.ts.map +1 -1
  108. package/dist/modules/src/tsconfig.tsbuildinfo +1 -1
  109. package/dist/modules/src/wave/riff-writer.d.ts +1 -1
  110. package/dist/modules/src/wave/riff-writer.d.ts.map +1 -1
  111. package/dist/modules/src/wave/wave-demuxer.d.ts +6 -6
  112. package/dist/modules/src/wave/wave-demuxer.d.ts.map +1 -1
  113. package/dist/modules/src/wave/wave-muxer.d.ts +4 -4
  114. package/dist/modules/src/wave/wave-muxer.d.ts.map +1 -1
  115. package/dist/modules/src/writer.d.ts +1 -1
  116. package/dist/modules/src/writer.d.ts.map +1 -1
  117. package/dist/packages/eac3/eac3.wasm +0 -0
  118. package/dist/packages/eac3/mediabunny-eac3.js +1058 -0
  119. package/dist/packages/eac3/mediabunny-eac3.min.js +44 -0
  120. package/dist/packages/mp3-encoder/mediabunny-mp3-encoder.js +694 -0
  121. package/dist/packages/mp3-encoder/mediabunny-mp3-encoder.min.js +58 -0
  122. package/dist/packages/mpeg4/mediabunny-mpeg4.js +1198 -0
  123. package/dist/packages/mpeg4/mediabunny-mpeg4.min.js +44 -0
  124. package/dist/packages/mpeg4/xvid.wasm +0 -0
  125. package/package.json +18 -57
  126. package/dist/bundles/mediabunny.cjs +0 -26140
  127. package/dist/bundles/mediabunny.min.cjs +0 -147
  128. package/dist/bundles/mediabunny.min.mjs +0 -146
  129. package/dist/mediabunny.d.ts +0 -3319
  130. package/dist/modules/shared/mp3-misc.js +0 -147
  131. package/dist/modules/src/adts/adts-demuxer.js +0 -239
  132. package/dist/modules/src/adts/adts-muxer.js +0 -80
  133. package/dist/modules/src/adts/adts-reader.js +0 -63
  134. package/dist/modules/src/codec-data.js +0 -1730
  135. package/dist/modules/src/codec.js +0 -869
  136. package/dist/modules/src/conversion.js +0 -1459
  137. package/dist/modules/src/custom-coder.js +0 -117
  138. package/dist/modules/src/demuxer.js +0 -12
  139. package/dist/modules/src/encode.js +0 -442
  140. package/dist/modules/src/flac/flac-demuxer.js +0 -504
  141. package/dist/modules/src/flac/flac-misc.js +0 -135
  142. package/dist/modules/src/flac/flac-muxer.js +0 -222
  143. package/dist/modules/src/id3.js +0 -848
  144. package/dist/modules/src/index.js +0 -28
  145. package/dist/modules/src/input-format.js +0 -480
  146. package/dist/modules/src/input-track.js +0 -372
  147. package/dist/modules/src/input.js +0 -188
  148. package/dist/modules/src/isobmff/isobmff-boxes.js +0 -1480
  149. package/dist/modules/src/isobmff/isobmff-demuxer.js +0 -2618
  150. package/dist/modules/src/isobmff/isobmff-misc.js +0 -20
  151. package/dist/modules/src/isobmff/isobmff-muxer.js +0 -966
  152. package/dist/modules/src/isobmff/isobmff-reader.js +0 -72
  153. package/dist/modules/src/matroska/ebml.js +0 -653
  154. package/dist/modules/src/matroska/matroska-demuxer.js +0 -2133
  155. package/dist/modules/src/matroska/matroska-misc.js +0 -20
  156. package/dist/modules/src/matroska/matroska-muxer.js +0 -1017
  157. package/dist/modules/src/media-sink.js +0 -1736
  158. package/dist/modules/src/media-source.js +0 -1825
  159. package/dist/modules/src/metadata.js +0 -193
  160. package/dist/modules/src/misc.js +0 -623
  161. package/dist/modules/src/mp3/mp3-demuxer.js +0 -285
  162. package/dist/modules/src/mp3/mp3-muxer.js +0 -123
  163. package/dist/modules/src/mp3/mp3-reader.js +0 -26
  164. package/dist/modules/src/mp3/mp3-writer.js +0 -78
  165. package/dist/modules/src/muxer.js +0 -50
  166. package/dist/modules/src/node.js +0 -9
  167. package/dist/modules/src/ogg/ogg-demuxer.js +0 -763
  168. package/dist/modules/src/ogg/ogg-misc.js +0 -78
  169. package/dist/modules/src/ogg/ogg-muxer.js +0 -353
  170. package/dist/modules/src/ogg/ogg-reader.js +0 -65
  171. package/dist/modules/src/output-format.js +0 -527
  172. package/dist/modules/src/output.js +0 -300
  173. package/dist/modules/src/packet.js +0 -182
  174. package/dist/modules/src/pcm.js +0 -85
  175. package/dist/modules/src/reader.js +0 -236
  176. package/dist/modules/src/sample.js +0 -1056
  177. package/dist/modules/src/source.js +0 -1182
  178. package/dist/modules/src/subtitles.js +0 -575
  179. package/dist/modules/src/target.js +0 -140
  180. package/dist/modules/src/wave/riff-writer.js +0 -30
  181. package/dist/modules/src/wave/wave-demuxer.js +0 -447
  182. package/dist/modules/src/wave/wave-muxer.js +0 -318
  183. package/dist/modules/src/writer.js +0 -370
  184. package/src/adts/adts-demuxer.ts +0 -331
  185. package/src/adts/adts-muxer.ts +0 -111
  186. package/src/adts/adts-reader.ts +0 -85
  187. package/src/codec-data.ts +0 -2078
  188. package/src/codec.ts +0 -1092
  189. package/src/conversion.ts +0 -2112
  190. package/src/custom-coder.ts +0 -197
  191. package/src/demuxer.ts +0 -24
  192. package/src/encode.ts +0 -739
  193. package/src/flac/flac-demuxer.ts +0 -730
  194. package/src/flac/flac-misc.ts +0 -164
  195. package/src/flac/flac-muxer.ts +0 -320
  196. package/src/id3.ts +0 -925
  197. package/src/index.ts +0 -221
  198. package/src/input-format.ts +0 -541
  199. package/src/input-track.ts +0 -529
  200. package/src/input.ts +0 -235
  201. package/src/isobmff/isobmff-boxes.ts +0 -1719
  202. package/src/isobmff/isobmff-demuxer.ts +0 -3190
  203. package/src/isobmff/isobmff-misc.ts +0 -29
  204. package/src/isobmff/isobmff-muxer.ts +0 -1348
  205. package/src/isobmff/isobmff-reader.ts +0 -91
  206. package/src/matroska/ebml.ts +0 -730
  207. package/src/matroska/matroska-demuxer.ts +0 -2481
  208. package/src/matroska/matroska-misc.ts +0 -29
  209. package/src/matroska/matroska-muxer.ts +0 -1276
  210. package/src/media-sink.ts +0 -2179
  211. package/src/media-source.ts +0 -2243
  212. package/src/metadata.ts +0 -320
  213. package/src/misc.ts +0 -798
  214. package/src/mp3/mp3-demuxer.ts +0 -383
  215. package/src/mp3/mp3-muxer.ts +0 -166
  216. package/src/mp3/mp3-reader.ts +0 -34
  217. package/src/mp3/mp3-writer.ts +0 -120
  218. package/src/muxer.ts +0 -88
  219. package/src/node.ts +0 -11
  220. package/src/ogg/ogg-demuxer.ts +0 -1053
  221. package/src/ogg/ogg-misc.ts +0 -116
  222. package/src/ogg/ogg-muxer.ts +0 -497
  223. package/src/ogg/ogg-reader.ts +0 -93
  224. package/src/output-format.ts +0 -945
  225. package/src/output.ts +0 -488
  226. package/src/packet.ts +0 -263
  227. package/src/pcm.ts +0 -112
  228. package/src/reader.ts +0 -323
  229. package/src/sample.ts +0 -1461
  230. package/src/source.ts +0 -1688
  231. package/src/subtitles.ts +0 -711
  232. package/src/target.ts +0 -204
  233. package/src/tsconfig.json +0 -16
  234. package/src/wave/riff-writer.ts +0 -36
  235. package/src/wave/wave-demuxer.ts +0 -529
  236. package/src/wave/wave-muxer.ts +0 -371
  237. package/src/writer.ts +0 -490
@@ -1,623 +0,0 @@
1
- /*!
2
- * Copyright (c) 2025-present, Vanilagy and contributors
3
- *
4
- * This Source Code Form is subject to the terms of the Mozilla Public
5
- * License, v. 2.0. If a copy of the MPL was not distributed with this
6
- * file, You can obtain one at https://mozilla.org/MPL/2.0/.
7
- */
8
- export function assert(x) {
9
- if (!x) {
10
- throw new Error('Assertion failed.');
11
- }
12
- }
13
- export const normalizeRotation = (rotation) => {
14
- const mappedRotation = (rotation % 360 + 360) % 360;
15
- if (mappedRotation === 0 || mappedRotation === 90 || mappedRotation === 180 || mappedRotation === 270) {
16
- return mappedRotation;
17
- }
18
- else {
19
- throw new Error(`Invalid rotation ${rotation}.`);
20
- }
21
- };
22
- export const last = (arr) => {
23
- return arr && arr[arr.length - 1];
24
- };
25
- export const isU32 = (value) => {
26
- return value >= 0 && value < 2 ** 32;
27
- };
28
- export class Bitstream {
29
- constructor(bytes) {
30
- this.bytes = bytes;
31
- /** Current offset in bits. */
32
- this.pos = 0;
33
- }
34
- seekToByte(byteOffset) {
35
- this.pos = 8 * byteOffset;
36
- }
37
- readBit() {
38
- const byteIndex = Math.floor(this.pos / 8);
39
- const byte = this.bytes[byteIndex] ?? 0;
40
- const bitIndex = 0b111 - (this.pos & 0b111);
41
- const bit = (byte & (1 << bitIndex)) >> bitIndex;
42
- this.pos++;
43
- return bit;
44
- }
45
- readBits(n) {
46
- if (n === 1) {
47
- return this.readBit();
48
- }
49
- let result = 0;
50
- for (let i = 0; i < n; i++) {
51
- result <<= 1;
52
- result |= this.readBit();
53
- }
54
- return result;
55
- }
56
- writeBits(n, value) {
57
- const end = this.pos + n;
58
- for (let i = this.pos; i < end; i++) {
59
- const byteIndex = Math.floor(i / 8);
60
- let byte = this.bytes[byteIndex];
61
- const bitIndex = 0b111 - (i & 0b111);
62
- byte &= ~(1 << bitIndex);
63
- byte |= ((value & (1 << (end - i - 1))) >> (end - i - 1)) << bitIndex;
64
- this.bytes[byteIndex] = byte;
65
- }
66
- this.pos = end;
67
- }
68
- ;
69
- readAlignedByte() {
70
- // Ensure we're byte-aligned
71
- if (this.pos % 8 !== 0) {
72
- throw new Error('Bitstream is not byte-aligned.');
73
- }
74
- const byteIndex = this.pos / 8;
75
- const byte = this.bytes[byteIndex] ?? 0;
76
- this.pos += 8;
77
- return byte;
78
- }
79
- skipBits(n) {
80
- this.pos += n;
81
- }
82
- getBitsLeft() {
83
- return this.bytes.length * 8 - this.pos;
84
- }
85
- clone() {
86
- const clone = new Bitstream(this.bytes);
87
- clone.pos = this.pos;
88
- return clone;
89
- }
90
- }
91
- /** Reads an exponential-Golomb universal code from a Bitstream. */
92
- export const readExpGolomb = (bitstream) => {
93
- let leadingZeroBits = 0;
94
- while (bitstream.readBits(1) === 0 && leadingZeroBits < 32) {
95
- leadingZeroBits++;
96
- }
97
- if (leadingZeroBits >= 32) {
98
- throw new Error('Invalid exponential-Golomb code.');
99
- }
100
- const result = (1 << leadingZeroBits) - 1 + bitstream.readBits(leadingZeroBits);
101
- return result;
102
- };
103
- /** Reads a signed exponential-Golomb universal code from a Bitstream. */
104
- export const readSignedExpGolomb = (bitstream) => {
105
- const codeNum = readExpGolomb(bitstream);
106
- return ((codeNum & 1) === 0)
107
- ? -(codeNum >> 1)
108
- : ((codeNum + 1) >> 1);
109
- };
110
- export const writeBits = (bytes, start, end, value) => {
111
- for (let i = start; i < end; i++) {
112
- const byteIndex = Math.floor(i / 8);
113
- let byte = bytes[byteIndex];
114
- const bitIndex = 0b111 - (i & 0b111);
115
- byte &= ~(1 << bitIndex);
116
- byte |= ((value & (1 << (end - i - 1))) >> (end - i - 1)) << bitIndex;
117
- bytes[byteIndex] = byte;
118
- }
119
- };
120
- export const toUint8Array = (source) => {
121
- if (source.constructor === Uint8Array) { // We want a true Uint8Array, not something that extends it like Buffer
122
- return source;
123
- }
124
- else if (source instanceof ArrayBuffer) {
125
- return new Uint8Array(source);
126
- }
127
- else {
128
- return new Uint8Array(source.buffer, source.byteOffset, source.byteLength);
129
- }
130
- };
131
- export const toDataView = (source) => {
132
- if (source.constructor === DataView) {
133
- return source;
134
- }
135
- else if (source instanceof ArrayBuffer) {
136
- return new DataView(source);
137
- }
138
- else {
139
- return new DataView(source.buffer, source.byteOffset, source.byteLength);
140
- }
141
- };
142
- export const textDecoder = /* #__PURE__ */ new TextDecoder();
143
- export const textEncoder = /* #__PURE__ */ new TextEncoder();
144
- export const isIso88591Compatible = (text) => {
145
- for (let i = 0; i < text.length; i++) {
146
- const code = text.charCodeAt(i);
147
- if (code > 255) {
148
- return false;
149
- }
150
- }
151
- return true;
152
- };
153
- const invertObject = (object) => {
154
- return Object.fromEntries(Object.entries(object).map(([key, value]) => [value, key]));
155
- };
156
- // For the color space mappings, see Rec. ITU-T H.273.
157
- export const COLOR_PRIMARIES_MAP = {
158
- bt709: 1, // ITU-R BT.709
159
- bt470bg: 5, // ITU-R BT.470BG
160
- smpte170m: 6, // ITU-R BT.601 525 - SMPTE 170M
161
- bt2020: 9, // ITU-R BT.202
162
- smpte432: 12, // SMPTE EG 432-1
163
- };
164
- export const COLOR_PRIMARIES_MAP_INVERSE = /* #__PURE__ */ invertObject(COLOR_PRIMARIES_MAP);
165
- export const TRANSFER_CHARACTERISTICS_MAP = {
166
- 'bt709': 1, // ITU-R BT.709
167
- 'smpte170m': 6, // SMPTE 170M
168
- 'linear': 8, // Linear transfer characteristics
169
- 'iec61966-2-1': 13, // IEC 61966-2-1
170
- 'pq': 16, // Rec. ITU-R BT.2100-2 perceptual quantization (PQ) system
171
- 'hlg': 18, // Rec. ITU-R BT.2100-2 hybrid loggamma (HLG) system
172
- };
173
- export const TRANSFER_CHARACTERISTICS_MAP_INVERSE = /* #__PURE__ */ invertObject(TRANSFER_CHARACTERISTICS_MAP);
174
- export const MATRIX_COEFFICIENTS_MAP = {
175
- 'rgb': 0, // Identity
176
- 'bt709': 1, // ITU-R BT.709
177
- 'bt470bg': 5, // ITU-R BT.470BG
178
- 'smpte170m': 6, // SMPTE 170M
179
- 'bt2020-ncl': 9, // ITU-R BT.2020-2 (non-constant luminance)
180
- };
181
- export const MATRIX_COEFFICIENTS_MAP_INVERSE = /* #__PURE__ */ invertObject(MATRIX_COEFFICIENTS_MAP);
182
- export const colorSpaceIsComplete = (colorSpace) => {
183
- return (!!colorSpace
184
- && !!colorSpace.primaries
185
- && !!colorSpace.transfer
186
- && !!colorSpace.matrix
187
- && colorSpace.fullRange !== undefined);
188
- };
189
- export const isAllowSharedBufferSource = (x) => {
190
- return (x instanceof ArrayBuffer
191
- || (typeof SharedArrayBuffer !== 'undefined' && x instanceof SharedArrayBuffer)
192
- || ArrayBuffer.isView(x));
193
- };
194
- export class AsyncMutex {
195
- constructor() {
196
- this.currentPromise = Promise.resolve();
197
- }
198
- async acquire() {
199
- let resolver;
200
- const nextPromise = new Promise((resolve) => {
201
- resolver = resolve;
202
- });
203
- const currentPromiseAlias = this.currentPromise;
204
- this.currentPromise = nextPromise;
205
- await currentPromiseAlias;
206
- return resolver;
207
- }
208
- }
209
- export const bytesToHexString = (bytes) => {
210
- return [...bytes].map(x => x.toString(16).padStart(2, '0')).join('');
211
- };
212
- export const reverseBitsU32 = (x) => {
213
- x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1);
214
- x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2);
215
- x = ((x >> 4) & 0x0f0f0f0f) | ((x & 0x0f0f0f0f) << 4);
216
- x = ((x >> 8) & 0x00ff00ff) | ((x & 0x00ff00ff) << 8);
217
- x = ((x >> 16) & 0x0000ffff) | ((x & 0x0000ffff) << 16);
218
- return x >>> 0; // Ensure it's treated as an unsigned 32-bit integer
219
- };
220
- /** Returns the smallest index i such that val[i] === key, or -1 if no such index exists. */
221
- export const binarySearchExact = (arr, key, valueGetter) => {
222
- let low = 0;
223
- let high = arr.length - 1;
224
- let ans = -1;
225
- while (low <= high) {
226
- const mid = (low + high) >> 1;
227
- const midVal = valueGetter(arr[mid]);
228
- if (midVal === key) {
229
- ans = mid;
230
- high = mid - 1; // Continue searching left to find the lowest index
231
- }
232
- else if (midVal < key) {
233
- low = mid + 1;
234
- }
235
- else {
236
- high = mid - 1;
237
- }
238
- }
239
- return ans;
240
- };
241
- /** Returns the largest index i such that val[i] <= key, or -1 if no such index exists. */
242
- export const binarySearchLessOrEqual = (arr, key, valueGetter) => {
243
- let low = 0;
244
- let high = arr.length - 1;
245
- let ans = -1;
246
- while (low <= high) {
247
- const mid = (low + (high - low + 1) / 2) | 0;
248
- const midVal = valueGetter(arr[mid]);
249
- if (midVal <= key) {
250
- ans = mid;
251
- low = mid + 1;
252
- }
253
- else {
254
- high = mid - 1;
255
- }
256
- }
257
- return ans;
258
- };
259
- /** Assumes the array is already sorted. */
260
- export const insertSorted = (arr, item, valueGetter) => {
261
- const insertionIndex = binarySearchLessOrEqual(arr, valueGetter(item), valueGetter);
262
- arr.splice(insertionIndex + 1, 0, item); // This even behaves correctly for the -1 case
263
- };
264
- export const promiseWithResolvers = () => {
265
- let resolve;
266
- let reject;
267
- const promise = new Promise((res, rej) => {
268
- resolve = res;
269
- reject = rej;
270
- });
271
- return { promise, resolve: resolve, reject: reject };
272
- };
273
- export const removeItem = (arr, item) => {
274
- const index = arr.indexOf(item);
275
- if (index !== -1) {
276
- arr.splice(index, 1);
277
- }
278
- };
279
- export const findLast = (arr, predicate) => {
280
- for (let i = arr.length - 1; i >= 0; i--) {
281
- if (predicate(arr[i])) {
282
- return arr[i];
283
- }
284
- }
285
- return undefined;
286
- };
287
- export const findLastIndex = (arr, predicate) => {
288
- for (let i = arr.length - 1; i >= 0; i--) {
289
- if (predicate(arr[i])) {
290
- return i;
291
- }
292
- }
293
- return -1;
294
- };
295
- export const toAsyncIterator = async function* (source) {
296
- if (Symbol.iterator in source) {
297
- // @ts-expect-error Trust me
298
- yield* source[Symbol.iterator]();
299
- }
300
- else {
301
- // @ts-expect-error Trust me
302
- yield* source[Symbol.asyncIterator]();
303
- }
304
- };
305
- export const validateAnyIterable = (iterable) => {
306
- if (!(Symbol.iterator in iterable) && !(Symbol.asyncIterator in iterable)) {
307
- throw new TypeError('Argument must be an iterable or async iterable.');
308
- }
309
- };
310
- export const assertNever = (x) => {
311
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
312
- throw new Error(`Unexpected value: ${x}`);
313
- };
314
- export const getUint24 = (view, byteOffset, littleEndian) => {
315
- const byte1 = view.getUint8(byteOffset);
316
- const byte2 = view.getUint8(byteOffset + 1);
317
- const byte3 = view.getUint8(byteOffset + 2);
318
- if (littleEndian) {
319
- return byte1 | (byte2 << 8) | (byte3 << 16);
320
- }
321
- else {
322
- return (byte1 << 16) | (byte2 << 8) | byte3;
323
- }
324
- };
325
- export const getInt24 = (view, byteOffset, littleEndian) => {
326
- // The left shift pushes the most significant bit into the sign bit region, and the subsequent right shift
327
- // then correctly interprets the sign bit.
328
- return getUint24(view, byteOffset, littleEndian) << 8 >> 8;
329
- };
330
- export const setUint24 = (view, byteOffset, value, littleEndian) => {
331
- // Ensure the value is within 24-bit unsigned range (0 to 16777215)
332
- value = value >>> 0; // Convert to unsigned 32-bit
333
- value = value & 0xFFFFFF; // Mask to 24 bits
334
- if (littleEndian) {
335
- view.setUint8(byteOffset, value & 0xFF);
336
- view.setUint8(byteOffset + 1, (value >>> 8) & 0xFF);
337
- view.setUint8(byteOffset + 2, (value >>> 16) & 0xFF);
338
- }
339
- else {
340
- view.setUint8(byteOffset, (value >>> 16) & 0xFF);
341
- view.setUint8(byteOffset + 1, (value >>> 8) & 0xFF);
342
- view.setUint8(byteOffset + 2, value & 0xFF);
343
- }
344
- };
345
- export const setInt24 = (view, byteOffset, value, littleEndian) => {
346
- // Ensure the value is within 24-bit signed range (-8388608 to 8388607)
347
- value = clamp(value, -8388608, 8388607);
348
- // Convert negative values to their 24-bit representation
349
- if (value < 0) {
350
- value = (value + 0x1000000) & 0xFFFFFF;
351
- }
352
- setUint24(view, byteOffset, value, littleEndian);
353
- };
354
- export const setInt64 = (view, byteOffset, value, littleEndian) => {
355
- if (littleEndian) {
356
- view.setUint32(byteOffset + 0, value, true);
357
- view.setInt32(byteOffset + 4, Math.floor(value / 2 ** 32), true);
358
- }
359
- else {
360
- view.setInt32(byteOffset + 0, Math.floor(value / 2 ** 32), true);
361
- view.setUint32(byteOffset + 4, value, true);
362
- }
363
- };
364
- /**
365
- * Calls a function on each value spat out by an async generator. The reason for writing this manually instead of
366
- * using a generator function is that the generator function queues return() calls - here, we forward them immediately.
367
- */
368
- export const mapAsyncGenerator = (generator, map) => {
369
- return {
370
- async next() {
371
- const result = await generator.next();
372
- if (result.done) {
373
- return { value: undefined, done: true };
374
- }
375
- else {
376
- return { value: map(result.value), done: false };
377
- }
378
- },
379
- return() {
380
- return generator.return();
381
- },
382
- throw(error) {
383
- return generator.throw(error);
384
- },
385
- [Symbol.asyncIterator]() {
386
- return this;
387
- },
388
- };
389
- };
390
- export const clamp = (value, min, max) => {
391
- return Math.max(min, Math.min(max, value));
392
- };
393
- export const UNDETERMINED_LANGUAGE = 'und';
394
- export const roundIfAlmostInteger = (value) => {
395
- const rounded = Math.round(value);
396
- if (Math.abs(value / rounded - 1) < 10 * Number.EPSILON) {
397
- return rounded;
398
- }
399
- else {
400
- return value;
401
- }
402
- };
403
- export const roundToMultiple = (value, multiple) => {
404
- return Math.round(value / multiple) * multiple;
405
- };
406
- export const ilog = (x) => {
407
- let ret = 0;
408
- while (x) {
409
- ret++;
410
- x >>= 1;
411
- }
412
- return ret;
413
- };
414
- const ISO_639_2_REGEX = /^[a-z]{3}$/;
415
- export const isIso639Dash2LanguageCode = (x) => {
416
- return ISO_639_2_REGEX.test(x);
417
- };
418
- // Since the result will be truncated, add a bit of eps to compensate for floating point errors
419
- export const SECOND_TO_MICROSECOND_FACTOR = /* #__PURE__ */ 1e6 * (1 + Number.EPSILON);
420
- /**
421
- * Merges two RequestInit objects with special handling for headers.
422
- * Headers are merged case-insensitively, but original casing is preserved.
423
- * init2 headers take precedence and will override case-insensitive matches from init1.
424
- */
425
- export const mergeRequestInit = (init1, init2) => {
426
- const merged = { ...init1, ...init2 };
427
- // Special handling for headers
428
- if (init1.headers || init2.headers) {
429
- const headers1 = init1.headers ? normalizeHeaders(init1.headers) : {};
430
- const headers2 = init2.headers ? normalizeHeaders(init2.headers) : {};
431
- const mergedHeaders = { ...headers1 };
432
- // For each header in headers2, check if a case-insensitive match exists in mergedHeaders
433
- Object.entries(headers2).forEach(([key2, value2]) => {
434
- const existingKey = Object.keys(mergedHeaders).find(key1 => key1.toLowerCase() === key2.toLowerCase());
435
- if (existingKey) {
436
- delete mergedHeaders[existingKey];
437
- }
438
- mergedHeaders[key2] = value2;
439
- });
440
- merged.headers = mergedHeaders;
441
- }
442
- return merged;
443
- };
444
- /** Normalizes HeadersInit to a Record<string, string> format. */
445
- const normalizeHeaders = (headers) => {
446
- if (headers instanceof Headers) {
447
- const result = {};
448
- headers.forEach((value, key) => {
449
- result[key] = value;
450
- });
451
- return result;
452
- }
453
- if (Array.isArray(headers)) {
454
- const result = {};
455
- headers.forEach(([key, value]) => {
456
- result[key] = value;
457
- });
458
- return result;
459
- }
460
- return headers;
461
- };
462
- export const retriedFetch = async (fetchFn, url, requestInit, getRetryDelay) => {
463
- let attempts = 0;
464
- while (true) {
465
- try {
466
- return await fetchFn(url, requestInit);
467
- }
468
- catch (error) {
469
- attempts++;
470
- const retryDelayInSeconds = getRetryDelay(attempts, error, url);
471
- if (retryDelayInSeconds === null) {
472
- throw error;
473
- }
474
- console.error('Retrying failed fetch. Error:', error);
475
- if (!Number.isFinite(retryDelayInSeconds) || retryDelayInSeconds < 0) {
476
- throw new TypeError('Retry delay must be a non-negative finite number.');
477
- }
478
- if (retryDelayInSeconds > 0) {
479
- await new Promise(resolve => setTimeout(resolve, 1000 * retryDelayInSeconds));
480
- }
481
- }
482
- }
483
- };
484
- export const computeRationalApproximation = (x, maxDenominator) => {
485
- // Handle negative numbers
486
- const sign = x < 0 ? -1 : 1;
487
- x = Math.abs(x);
488
- let prevNumerator = 0, prevDenominator = 1;
489
- let currNumerator = 1, currDenominator = 0;
490
- // Continued fraction algorithm
491
- let remainder = x;
492
- while (true) {
493
- const integer = Math.floor(remainder);
494
- // Calculate next convergent
495
- const nextNumerator = integer * currNumerator + prevNumerator;
496
- const nextDenominator = integer * currDenominator + prevDenominator;
497
- if (nextDenominator > maxDenominator) {
498
- return {
499
- numerator: sign * currNumerator,
500
- denominator: currDenominator,
501
- };
502
- }
503
- prevNumerator = currNumerator;
504
- prevDenominator = currDenominator;
505
- currNumerator = nextNumerator;
506
- currDenominator = nextDenominator;
507
- remainder = 1 / (remainder - integer);
508
- // Guard against precision issues
509
- if (!isFinite(remainder)) {
510
- break;
511
- }
512
- }
513
- return {
514
- numerator: sign * currNumerator,
515
- denominator: currDenominator,
516
- };
517
- };
518
- export class CallSerializer {
519
- constructor() {
520
- this.currentPromise = Promise.resolve();
521
- }
522
- call(fn) {
523
- return this.currentPromise = this.currentPromise.then(fn);
524
- }
525
- }
526
- let isWebKitCache = null;
527
- export const isWebKit = () => {
528
- if (isWebKitCache !== null) {
529
- return isWebKitCache;
530
- }
531
- // This even returns true for WebKit-wrapping browsers such as Chrome on iOS
532
- return isWebKitCache = !!(typeof navigator !== 'undefined' && navigator.vendor?.match(/apple/i));
533
- };
534
- let isFirefoxCache = null;
535
- export const isFirefox = () => {
536
- if (isFirefoxCache !== null) {
537
- return isFirefoxCache;
538
- }
539
- return isFirefoxCache = typeof navigator !== 'undefined' && navigator.userAgent?.includes('Firefox');
540
- };
541
- let isChromiumCache = null;
542
- export const isChromium = () => {
543
- if (isChromiumCache !== null) {
544
- return isChromiumCache;
545
- }
546
- return isChromiumCache = !!(typeof navigator !== 'undefined' && navigator.vendor?.includes('Google Inc'));
547
- };
548
- /** Acts like `??` except the condition is -1 and not null/undefined. */
549
- export const coalesceIndex = (a, b) => {
550
- return a !== -1 ? a : b;
551
- };
552
- export const closedIntervalsOverlap = (startA, endA, startB, endB) => {
553
- return startA <= endB && startB <= endA;
554
- };
555
- export const keyValueIterator = function* (object) {
556
- for (const key in object) {
557
- const value = object[key];
558
- if (value === undefined) {
559
- continue;
560
- }
561
- yield { key, value };
562
- }
563
- };
564
- export const imageMimeTypeToExtension = (mimeType) => {
565
- switch (mimeType.toLowerCase()) {
566
- case 'image/jpeg':
567
- case 'image/jpg':
568
- return '.jpg';
569
- case 'image/png':
570
- return '.png';
571
- case 'image/gif':
572
- return '.gif';
573
- case 'image/webp':
574
- return '.webp';
575
- case 'image/bmp':
576
- return '.bmp';
577
- case 'image/svg+xml':
578
- return '.svg';
579
- case 'image/tiff':
580
- return '.tiff';
581
- case 'image/avif':
582
- return '.avif';
583
- case 'image/x-icon':
584
- case 'image/vnd.microsoft.icon':
585
- return '.ico';
586
- default:
587
- return null;
588
- }
589
- };
590
- export const base64ToBytes = (base64) => {
591
- const decoded = atob(base64);
592
- const bytes = new Uint8Array(decoded.length);
593
- for (let i = 0; i < decoded.length; i++) {
594
- bytes[i] = decoded.charCodeAt(i);
595
- }
596
- return bytes;
597
- };
598
- export const bytesToBase64 = (bytes) => {
599
- let string = '';
600
- for (let i = 0; i < bytes.length; i++) {
601
- string += String.fromCharCode(bytes[i]);
602
- }
603
- return btoa(string);
604
- };
605
- export const uint8ArraysAreEqual = (a, b) => {
606
- if (a.length !== b.length) {
607
- return false;
608
- }
609
- for (let i = 0; i < a.length; i++) {
610
- if (a[i] !== b[i]) {
611
- return false;
612
- }
613
- }
614
- return true;
615
- };
616
- export const polyfillSymbolDispose = () => {
617
- // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html
618
- // @ts-expect-error Readonly
619
- Symbol.dispose ??= Symbol('Symbol.dispose');
620
- };
621
- export const isNumber = (x) => {
622
- return typeof x === 'number' && !Number.isNaN(x);
623
- };