@twin.org/web 0.9.3-next.1 → 0.9.3-next.2

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.
@@ -162,10 +162,38 @@ export const MimeTypes = {
162
162
  * Application ZIP - application/zip
163
163
  */
164
164
  Zip: "application/zip",
165
+ /**
166
+ * Application 7-Zip - application/x-7z-compressed
167
+ */
168
+ SevenZip: "application/x-7z-compressed",
169
+ /**
170
+ * Application RAR - application/vnd.rar
171
+ */
172
+ Rar: "application/vnd.rar",
173
+ /**
174
+ * Application SQLite3 - application/x-sqlite3
175
+ */
176
+ Sqlite: "application/x-sqlite3",
165
177
  /**
166
178
  * Application PDF - application/pdf
167
179
  */
168
180
  Pdf: "application/pdf",
181
+ /**
182
+ * Rich Text Format - application/rtf
183
+ */
184
+ Rtf: "application/rtf",
185
+ /**
186
+ * Word Document - application/vnd.openxmlformats-officedocument.wordprocessingml.document
187
+ */
188
+ Docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
189
+ /**
190
+ * Excel Spreadsheet - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
191
+ */
192
+ Xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
193
+ /**
194
+ * PowerPoint Presentation - application/vnd.openxmlformats-officedocument.presentationml.presentation
195
+ */
196
+ Pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
169
197
  /**
170
198
  * Image GIF - image/gif
171
199
  */
@@ -202,6 +230,10 @@ export const MimeTypes = {
202
230
  * Image AVIF - image/avif
203
231
  */
204
232
  Avif: "image/avif",
233
+ /**
234
+ * Image HEIC - image/heic
235
+ */
236
+ Heic: "image/heic",
205
237
  /**
206
238
  * Image APNG - image/apng
207
239
  */
@@ -222,6 +254,14 @@ export const MimeTypes = {
222
254
  * Font OTF - font/otf
223
255
  */
224
256
  Otf: "font/otf",
257
+ /**
258
+ * Audio FLAC - audio/flac
259
+ */
260
+ Flac: "audio/flac",
261
+ /**
262
+ * Audio MIDI - audio/midi
263
+ */
264
+ Midi: "audio/midi",
225
265
  /**
226
266
  * Audio MP3 - audio/mpeg
227
267
  */
@@ -1 +1 @@
1
- {"version":3,"file":"mimeTypes.js","sourceRoot":"","sources":["../../../src/models/mimeTypes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Common mime types.\n * @see https://www.iana.org/assignments/media-types/media-types.xhtml\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const MimeTypes = {\n\t/**\n\t * Plaint Text - text/plain\n\t */\n\tPlainText: \"text/plain\",\n\n\t/**\n\t * Event Stream - text/event-stream\n\t */\n\tEventStream: \"text/event-stream\",\n\n\t/**\n\t * HTML - text/html\n\t */\n\tHtml: \"text/html\",\n\n\t/**\n\t * CSS - text/css\n\t */\n\tCss: \"text/css\",\n\n\t/**\n\t * Javascript - text/javascript\n\t */\n\tJavascript: \"text/javascript\",\n\n\t/**\n\t * Markdown - text/markdown\n\t */\n\tMarkdown: \"text/markdown\",\n\n\t/**\n\t * JSON - application/json\n\t */\n\tJson: \"application/json\",\n\n\t/**\n\t * Problem JSON - application/problem+json\n\t */\n\tProblemJson: \"application/problem+json\",\n\n\t/**\n\t * JSON-LD - application/ld+json\n\t */\n\tJsonLd: \"application/ld+json\",\n\n\t/**\n\t * Activity Streams - application/activity+json\n\t */\n\tActivityStreams: \"application/activity+json\",\n\n\t/**\n\t * WebFinger JRD - application/jrd+json\n\t */\n\tJrdJson: \"application/jrd+json\",\n\n\t/**\n\t * JWT - application/jwt\n\t */\n\tJwt: \"application/jwt\",\n\n\t/**\n\t * Access Token JWT - application/at+jwt\n\t */\n\tAccessTokenJwt: \"application/at+jwt\",\n\n\t/**\n\t * JOSE (Compact Serialization) - application/jose\n\t */\n\tJose: \"application/jose\",\n\n\t/**\n\t * JOSE (JSON Serialization) - application/jose+json\n\t */\n\tJoseJson: \"application/jose+json\",\n\n\t/**\n\t * JSON Web Key (JWK) - application/jwk+json\n\t */\n\tJwkJson: \"application/jwk+json\",\n\n\t/**\n\t * JSON Web Key Set (JWKS) - application/jwk-set+json\n\t */\n\tJwkSetJson: \"application/jwk-set+json\",\n\n\t/**\n\t * Decentralized Identifier (DID) - application/did+json\n\t */\n\tDidJson: \"application/did+json\",\n\n\t/**\n\t * Decentralized Identifier (DID) (JSON-LD) - application/did+ld+json\n\t */\n\tDidLdJson: \"application/did+ld+json\",\n\n\t/**\n\t * Verifiable Credential (JSON-LD) - application/vc+ld+json\n\t */\n\tVerifiableCredentialLdJson: \"application/vc+ld+json\",\n\n\t/**\n\t * Verifiable Presentation (JSON-LD) - application/vp+ld+json\n\t */\n\tVerifiablePresentationLdJson: \"application/vp+ld+json\",\n\n\t/**\n\t * Verifiable Credential (JWT) - application/vc+jwt\n\t */\n\tVerifiableCredentialJwt: \"application/vc+jwt\",\n\n\t/**\n\t * Verifiable Presentation (JWT) - application/vp+jwt\n\t */\n\tVerifiablePresentationJwt: \"application/vp+jwt\",\n\n\t/**\n\t * JSON Patch - application/json-patch+json\n\t */\n\tJsonPatch: \"application/json-patch+json\",\n\n\t/**\n\t * JSON Merge Patch - application/merge-patch+json\n\t */\n\tMergePatch: \"application/merge-patch+json\",\n\n\t/**\n\t * CBOR Web Token (CWT) - application/cwt\n\t */\n\tCwt: \"application/cwt\",\n\n\t/**\n\t * COSE - application/cose\n\t */\n\tCose: \"application/cose\",\n\n\t/**\n\t * COSE Key - application/cose-key\n\t */\n\tCoseKey: \"application/cose-key\",\n\n\t/**\n\t * COSE Key Set - application/cose-key-set\n\t */\n\tCoseKeySet: \"application/cose-key-set\",\n\n\t/**\n\t * Form URL Encoded - application/x-www-form-urlencoded\n\t */\n\tFormUrlEncoded: \"application/x-www-form-urlencoded\",\n\n\t/**\n\t * Multipart Form Data - multipart/form-data\n\t */\n\tMultipartFormData: \"multipart/form-data\",\n\n\t/**\n\t * XML - application/xml\n\t */\n\tXml: \"application/xml\",\n\n\t/**\n\t * WASM - application/wasm\n\t */\n\tWasm: \"application/wasm\",\n\n\t/**\n\t * Web App Manifest - application/manifest+json\n\t */\n\tWebManifest: \"application/manifest+json\",\n\n\t/**\n\t * Application Octet Stream, arbitrary binary - application/octet-stream\n\t */\n\tOctetStream: \"application/octet-stream\",\n\n\t/**\n\t * Application GZIP - application/gzip\n\t */\n\tGzip: \"application/gzip\",\n\n\t/**\n\t * Application deflate - application/zlib\n\t */\n\tZlib: \"application/zlib\",\n\n\t/**\n\t * Application BZIP2 - application/x-bzip2\n\t */\n\tBzip2: \"application/x-bzip2\",\n\n\t/**\n\t * Application ZIP - application/zip\n\t */\n\tZip: \"application/zip\",\n\n\t/**\n\t * Application PDF - application/pdf\n\t */\n\tPdf: \"application/pdf\",\n\n\t/**\n\t * Image GIF - image/gif\n\t */\n\tGif: \"image/gif\",\n\n\t/**\n\t * Image BMP - image/bmp\n\t */\n\tBmp: \"image/bmp\",\n\n\t/**\n\t * Image JPEG - image/jpeg\n\t */\n\tJpeg: \"image/jpeg\",\n\n\t/**\n\t * Image PNG - image/png\n\t */\n\tPng: \"image/png\",\n\n\t/**\n\t * Image Tiff - image/tiff\n\t */\n\tTiff: \"image/tiff\",\n\n\t/**\n\t * Image SVG - image/svg+xml\n\t */\n\tSvg: \"image/svg+xml\",\n\n\t/**\n\t * Image ICO - image/x-icon\n\t */\n\tIco: \"image/x-icon\",\n\n\t/**\n\t * Image WEBP - image/webp\n\t */\n\tWebP: \"image/webp\",\n\n\t/**\n\t * Image AVIF - image/avif\n\t */\n\tAvif: \"image/avif\",\n\n\t/**\n\t * Image APNG - image/apng\n\t */\n\tApng: \"image/apng\",\n\n\t/**\n\t * Font WOFF - font/woff\n\t */\n\tWoff: \"font/woff\",\n\n\t/**\n\t * Font WOFF2 - font/woff2\n\t */\n\tWoff2: \"font/woff2\",\n\n\t/**\n\t * Font TTF - font/ttf\n\t */\n\tTtf: \"font/ttf\",\n\n\t/**\n\t * Font OTF - font/otf\n\t */\n\tOtf: \"font/otf\",\n\n\t/**\n\t * Audio MP3 - audio/mpeg\n\t */\n\tMp3: \"audio/mpeg\",\n\n\t/**\n\t * Audio OGG - audio/ogg\n\t */\n\tOggAudio: \"audio/ogg\",\n\n\t/**\n\t * Audio WAV - audio/wav\n\t */\n\tWav: \"audio/wav\",\n\n\t/**\n\t * Audio WEBM - audio/webm\n\t */\n\tWebmAudio: \"audio/webm\",\n\n\t/**\n\t * Audio AAC - audio/aac\n\t */\n\tAac: \"audio/aac\",\n\n\t/**\n\t * Audio MP4 - audio/mp4\n\t */\n\tMp4Audio: \"audio/mp4\",\n\n\t/**\n\t * Video MP4 - video/mp4\n\t */\n\tMp4: \"video/mp4\",\n\n\t/**\n\t * Audio/Video MPEG - video/mpeg\n\t */\n\tMpeg: \"video/mpeg\",\n\n\t/**\n\t * Video WEBM - video/webm\n\t */\n\tWebm: \"video/webm\",\n\n\t/**\n\t * Video OGG - video/ogg\n\t */\n\tOggVideo: \"video/ogg\",\n\n\t/**\n\t * Video QuickTime - video/quicktime\n\t */\n\tQuicktime: \"video/quicktime\"\n} as const;\n\n/**\n * Common mime types.\n */\nexport type MimeTypes = (typeof MimeTypes)[keyof typeof MimeTypes];\n"]}
1
+ {"version":3,"file":"mimeTypes.js","sourceRoot":"","sources":["../../../src/models/mimeTypes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Common mime types.\n * @see https://www.iana.org/assignments/media-types/media-types.xhtml\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const MimeTypes = {\n\t/**\n\t * Plaint Text - text/plain\n\t */\n\tPlainText: \"text/plain\",\n\n\t/**\n\t * Event Stream - text/event-stream\n\t */\n\tEventStream: \"text/event-stream\",\n\n\t/**\n\t * HTML - text/html\n\t */\n\tHtml: \"text/html\",\n\n\t/**\n\t * CSS - text/css\n\t */\n\tCss: \"text/css\",\n\n\t/**\n\t * Javascript - text/javascript\n\t */\n\tJavascript: \"text/javascript\",\n\n\t/**\n\t * Markdown - text/markdown\n\t */\n\tMarkdown: \"text/markdown\",\n\n\t/**\n\t * JSON - application/json\n\t */\n\tJson: \"application/json\",\n\n\t/**\n\t * Problem JSON - application/problem+json\n\t */\n\tProblemJson: \"application/problem+json\",\n\n\t/**\n\t * JSON-LD - application/ld+json\n\t */\n\tJsonLd: \"application/ld+json\",\n\n\t/**\n\t * Activity Streams - application/activity+json\n\t */\n\tActivityStreams: \"application/activity+json\",\n\n\t/**\n\t * WebFinger JRD - application/jrd+json\n\t */\n\tJrdJson: \"application/jrd+json\",\n\n\t/**\n\t * JWT - application/jwt\n\t */\n\tJwt: \"application/jwt\",\n\n\t/**\n\t * Access Token JWT - application/at+jwt\n\t */\n\tAccessTokenJwt: \"application/at+jwt\",\n\n\t/**\n\t * JOSE (Compact Serialization) - application/jose\n\t */\n\tJose: \"application/jose\",\n\n\t/**\n\t * JOSE (JSON Serialization) - application/jose+json\n\t */\n\tJoseJson: \"application/jose+json\",\n\n\t/**\n\t * JSON Web Key (JWK) - application/jwk+json\n\t */\n\tJwkJson: \"application/jwk+json\",\n\n\t/**\n\t * JSON Web Key Set (JWKS) - application/jwk-set+json\n\t */\n\tJwkSetJson: \"application/jwk-set+json\",\n\n\t/**\n\t * Decentralized Identifier (DID) - application/did+json\n\t */\n\tDidJson: \"application/did+json\",\n\n\t/**\n\t * Decentralized Identifier (DID) (JSON-LD) - application/did+ld+json\n\t */\n\tDidLdJson: \"application/did+ld+json\",\n\n\t/**\n\t * Verifiable Credential (JSON-LD) - application/vc+ld+json\n\t */\n\tVerifiableCredentialLdJson: \"application/vc+ld+json\",\n\n\t/**\n\t * Verifiable Presentation (JSON-LD) - application/vp+ld+json\n\t */\n\tVerifiablePresentationLdJson: \"application/vp+ld+json\",\n\n\t/**\n\t * Verifiable Credential (JWT) - application/vc+jwt\n\t */\n\tVerifiableCredentialJwt: \"application/vc+jwt\",\n\n\t/**\n\t * Verifiable Presentation (JWT) - application/vp+jwt\n\t */\n\tVerifiablePresentationJwt: \"application/vp+jwt\",\n\n\t/**\n\t * JSON Patch - application/json-patch+json\n\t */\n\tJsonPatch: \"application/json-patch+json\",\n\n\t/**\n\t * JSON Merge Patch - application/merge-patch+json\n\t */\n\tMergePatch: \"application/merge-patch+json\",\n\n\t/**\n\t * CBOR Web Token (CWT) - application/cwt\n\t */\n\tCwt: \"application/cwt\",\n\n\t/**\n\t * COSE - application/cose\n\t */\n\tCose: \"application/cose\",\n\n\t/**\n\t * COSE Key - application/cose-key\n\t */\n\tCoseKey: \"application/cose-key\",\n\n\t/**\n\t * COSE Key Set - application/cose-key-set\n\t */\n\tCoseKeySet: \"application/cose-key-set\",\n\n\t/**\n\t * Form URL Encoded - application/x-www-form-urlencoded\n\t */\n\tFormUrlEncoded: \"application/x-www-form-urlencoded\",\n\n\t/**\n\t * Multipart Form Data - multipart/form-data\n\t */\n\tMultipartFormData: \"multipart/form-data\",\n\n\t/**\n\t * XML - application/xml\n\t */\n\tXml: \"application/xml\",\n\n\t/**\n\t * WASM - application/wasm\n\t */\n\tWasm: \"application/wasm\",\n\n\t/**\n\t * Web App Manifest - application/manifest+json\n\t */\n\tWebManifest: \"application/manifest+json\",\n\n\t/**\n\t * Application Octet Stream, arbitrary binary - application/octet-stream\n\t */\n\tOctetStream: \"application/octet-stream\",\n\n\t/**\n\t * Application GZIP - application/gzip\n\t */\n\tGzip: \"application/gzip\",\n\n\t/**\n\t * Application deflate - application/zlib\n\t */\n\tZlib: \"application/zlib\",\n\n\t/**\n\t * Application BZIP2 - application/x-bzip2\n\t */\n\tBzip2: \"application/x-bzip2\",\n\n\t/**\n\t * Application ZIP - application/zip\n\t */\n\tZip: \"application/zip\",\n\n\t/**\n\t * Application 7-Zip - application/x-7z-compressed\n\t */\n\tSevenZip: \"application/x-7z-compressed\",\n\n\t/**\n\t * Application RAR - application/vnd.rar\n\t */\n\tRar: \"application/vnd.rar\",\n\n\t/**\n\t * Application SQLite3 - application/x-sqlite3\n\t */\n\tSqlite: \"application/x-sqlite3\",\n\n\t/**\n\t * Application PDF - application/pdf\n\t */\n\tPdf: \"application/pdf\",\n\n\t/**\n\t * Rich Text Format - application/rtf\n\t */\n\tRtf: \"application/rtf\",\n\n\t/**\n\t * Word Document - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n\t */\n\tDocx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n\n\t/**\n\t * Excel Spreadsheet - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\n\t */\n\tXlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n\n\t/**\n\t * PowerPoint Presentation - application/vnd.openxmlformats-officedocument.presentationml.presentation\n\t */\n\tPptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n\n\t/**\n\t * Image GIF - image/gif\n\t */\n\tGif: \"image/gif\",\n\n\t/**\n\t * Image BMP - image/bmp\n\t */\n\tBmp: \"image/bmp\",\n\n\t/**\n\t * Image JPEG - image/jpeg\n\t */\n\tJpeg: \"image/jpeg\",\n\n\t/**\n\t * Image PNG - image/png\n\t */\n\tPng: \"image/png\",\n\n\t/**\n\t * Image Tiff - image/tiff\n\t */\n\tTiff: \"image/tiff\",\n\n\t/**\n\t * Image SVG - image/svg+xml\n\t */\n\tSvg: \"image/svg+xml\",\n\n\t/**\n\t * Image ICO - image/x-icon\n\t */\n\tIco: \"image/x-icon\",\n\n\t/**\n\t * Image WEBP - image/webp\n\t */\n\tWebP: \"image/webp\",\n\n\t/**\n\t * Image AVIF - image/avif\n\t */\n\tAvif: \"image/avif\",\n\n\t/**\n\t * Image HEIC - image/heic\n\t */\n\tHeic: \"image/heic\",\n\n\t/**\n\t * Image APNG - image/apng\n\t */\n\tApng: \"image/apng\",\n\n\t/**\n\t * Font WOFF - font/woff\n\t */\n\tWoff: \"font/woff\",\n\n\t/**\n\t * Font WOFF2 - font/woff2\n\t */\n\tWoff2: \"font/woff2\",\n\n\t/**\n\t * Font TTF - font/ttf\n\t */\n\tTtf: \"font/ttf\",\n\n\t/**\n\t * Font OTF - font/otf\n\t */\n\tOtf: \"font/otf\",\n\n\t/**\n\t * Audio FLAC - audio/flac\n\t */\n\tFlac: \"audio/flac\",\n\n\t/**\n\t * Audio MIDI - audio/midi\n\t */\n\tMidi: \"audio/midi\",\n\n\t/**\n\t * Audio MP3 - audio/mpeg\n\t */\n\tMp3: \"audio/mpeg\",\n\n\t/**\n\t * Audio OGG - audio/ogg\n\t */\n\tOggAudio: \"audio/ogg\",\n\n\t/**\n\t * Audio WAV - audio/wav\n\t */\n\tWav: \"audio/wav\",\n\n\t/**\n\t * Audio WEBM - audio/webm\n\t */\n\tWebmAudio: \"audio/webm\",\n\n\t/**\n\t * Audio AAC - audio/aac\n\t */\n\tAac: \"audio/aac\",\n\n\t/**\n\t * Audio MP4 - audio/mp4\n\t */\n\tMp4Audio: \"audio/mp4\",\n\n\t/**\n\t * Video MP4 - video/mp4\n\t */\n\tMp4: \"video/mp4\",\n\n\t/**\n\t * Audio/Video MPEG - video/mpeg\n\t */\n\tMpeg: \"video/mpeg\",\n\n\t/**\n\t * Video WEBM - video/webm\n\t */\n\tWebm: \"video/webm\",\n\n\t/**\n\t * Video OGG - video/ogg\n\t */\n\tOggVideo: \"video/ogg\",\n\n\t/**\n\t * Video QuickTime - video/quicktime\n\t */\n\tQuicktime: \"video/quicktime\"\n} as const;\n\n/**\n * Common mime types.\n */\nexport type MimeTypes = (typeof MimeTypes)[keyof typeof MimeTypes];\n"]}
@@ -1,6 +1,6 @@
1
1
  // Copyright 2024 IOTA Stiftung.
2
2
  // SPDX-License-Identifier: Apache-2.0.
3
- import { Converter, Is, StringHelper } from "@twin.org/core";
3
+ import { Converter, Is } from "@twin.org/core";
4
4
  import { MimeTypes } from "../models/mimeTypes.js";
5
5
  /**
6
6
  * Class to help with mime types.
@@ -32,6 +32,36 @@ export class MimeTypeHelper {
32
32
  MimeTypeHelper.checkBytes(data, [0x4d, 0x4d, 0x00, 0x2a])) {
33
33
  return MimeTypes.Tiff;
34
34
  }
35
+ // WebP: RIFF container with WEBP brand at offset 8
36
+ if (MimeTypeHelper.checkBytes(data, [0x52, 0x49, 0x46, 0x46]) &&
37
+ MimeTypeHelper.checkBytes(data, [0x57, 0x45, 0x42, 0x50], 8)) {
38
+ return MimeTypes.WebP;
39
+ }
40
+ if (MimeTypeHelper.checkBytes(data, [0x00, 0x00, 0x01, 0x00])) {
41
+ return MimeTypes.Ico;
42
+ }
43
+ // ISO base media file format: file-type box at offset 4, major brand at offset 8
44
+ if (MimeTypeHelper.checkBytes(data, [0x66, 0x74, 0x79, 0x70], 4)) {
45
+ if (MimeTypeHelper.checkBytes(data, [0x61, 0x76, 0x69, 0x66], 8)) {
46
+ return MimeTypes.Avif;
47
+ }
48
+ if (MimeTypeHelper.checkBytes(data, [0x68, 0x65, 0x69, 0x63], 8) || // heic
49
+ MimeTypeHelper.checkBytes(data, [0x68, 0x65, 0x69, 0x78], 8) || // heic variant
50
+ MimeTypeHelper.checkBytes(data, [0x68, 0x65, 0x69, 0x66], 8) || // heif
51
+ MimeTypeHelper.checkBytes(data, [0x6d, 0x69, 0x66, 0x31], 8) // mif1 (multi-image)
52
+ ) {
53
+ return MimeTypes.Heic;
54
+ }
55
+ if (MimeTypeHelper.checkBytes(data, [0x69, 0x73, 0x6f, 0x6d], 8) ||
56
+ MimeTypeHelper.checkBytes(data, [0x6d, 0x70, 0x34, 0x31], 8) ||
57
+ MimeTypeHelper.checkBytes(data, [0x6d, 0x70, 0x34, 0x32], 8) ||
58
+ MimeTypeHelper.checkBytes(data, [0x4d, 0x34, 0x56, 0x20], 8)) {
59
+ return MimeTypes.Mp4;
60
+ }
61
+ if (MimeTypeHelper.checkBytes(data, [0x71, 0x74, 0x20, 0x20], 8)) {
62
+ return MimeTypes.Quicktime;
63
+ }
64
+ }
35
65
  // Compression
36
66
  if (MimeTypeHelper.checkBytes(data, [0x1f, 0x8b, 0x8])) {
37
67
  return MimeTypes.Gzip;
@@ -45,15 +75,79 @@ export class MimeTypeHelper {
45
75
  return MimeTypes.Bzip2;
46
76
  }
47
77
  if (MimeTypeHelper.checkBytes(data, [0x50, 0x4b, 0x3, 0x4])) {
78
+ // Office Open XML: scan for format-specific path prefixes in ZIP local file headers
79
+ if (MimeTypeHelper.scanBytes(data, [0x77, 0x6f, 0x72, 0x64, 0x2f])) {
80
+ return MimeTypes.Docx; // word/
81
+ }
82
+ if (MimeTypeHelper.scanBytes(data, [0x78, 0x6c, 0x2f])) {
83
+ return MimeTypes.Xlsx; // xl/
84
+ }
85
+ if (MimeTypeHelper.scanBytes(data, [0x70, 0x70, 0x74, 0x2f])) {
86
+ return MimeTypes.Pptx; // ppt/
87
+ }
48
88
  return MimeTypes.Zip;
49
89
  }
90
+ if (MimeTypeHelper.checkBytes(data, [0x37, 0x7a, 0xbc, 0xaf, 0x27, 0x1c])) {
91
+ return MimeTypes.SevenZip;
92
+ }
93
+ if (MimeTypeHelper.checkBytes(data, [0x52, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00]) ||
94
+ MimeTypeHelper.checkBytes(data, [0x52, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x01, 0x00])) {
95
+ return MimeTypes.Rar;
96
+ }
97
+ if (MimeTypeHelper.checkBytes(data, [0x53, 0x51, 0x4c, 0x69])) {
98
+ return MimeTypes.Sqlite;
99
+ }
100
+ // Fonts
101
+ if (MimeTypeHelper.checkBytes(data, [0x77, 0x4f, 0x46, 0x46])) {
102
+ return MimeTypes.Woff;
103
+ }
104
+ if (MimeTypeHelper.checkBytes(data, [0x77, 0x4f, 0x46, 0x32])) {
105
+ return MimeTypes.Woff2;
106
+ }
107
+ if (MimeTypeHelper.checkBytes(data, [0x00, 0x01, 0x00, 0x00, 0x00])) {
108
+ return MimeTypes.Ttf;
109
+ }
110
+ if (MimeTypeHelper.checkBytes(data, [0x4f, 0x54, 0x54, 0x4f])) {
111
+ return MimeTypes.Otf;
112
+ }
113
+ // Audio / Video
114
+ if (MimeTypeHelper.checkBytes(data, [0x1a, 0x45, 0xdf, 0xa3])) {
115
+ return MimeTypes.Webm;
116
+ }
117
+ if (MimeTypeHelper.checkBytes(data, [0x4f, 0x67, 0x67, 0x53])) {
118
+ return MimeTypes.OggAudio;
119
+ }
120
+ if (MimeTypeHelper.checkBytes(data, [0x52, 0x49, 0x46, 0x46]) &&
121
+ MimeTypeHelper.checkBytes(data, [0x57, 0x41, 0x56, 0x45], 8)) {
122
+ return MimeTypes.Wav;
123
+ }
124
+ if (MimeTypeHelper.checkBytes(data, [0x49, 0x44, 0x33])) {
125
+ return MimeTypes.Mp3;
126
+ }
127
+ if (MimeTypeHelper.checkBytes(data, [0x66, 0x4c, 0x61, 0x43])) {
128
+ return MimeTypes.Flac;
129
+ }
130
+ if (MimeTypeHelper.checkBytes(data, [0x4d, 0x54, 0x68, 0x64])) {
131
+ return MimeTypes.Midi;
132
+ }
133
+ if (MimeTypeHelper.checkBytes(data, [0x00, 0x61, 0x73, 0x6d])) {
134
+ return MimeTypes.Wasm;
135
+ }
50
136
  // Documents
51
137
  if (MimeTypeHelper.checkText(data, ["%PDF"])) {
52
138
  return MimeTypes.Pdf;
53
139
  }
140
+ if (MimeTypeHelper.checkBytes(data, [0x7b, 0x5c, 0x72, 0x74, 0x66])) {
141
+ return MimeTypes.Rtf; // {\rtf
142
+ }
143
+ // HTML: check before SVG so embedded SVG in an HTML page does not take precedence
144
+ if (MimeTypeHelper.checkText(data, ["<!DOCTYPE html", "<!doctype html"]) ||
145
+ MimeTypeHelper.scanBytes(data, [0x3c, 0x68, 0x74, 0x6d, 0x6c])) {
146
+ return MimeTypes.Html;
147
+ }
54
148
  // Lookup svg before xml, as svg are xml files as well
55
- const asText = Converter.bytesToUtf8(data);
56
- if (asText.includes("<svg")) {
149
+ // Scan raw bytes so large preambles (DOCTYPE, comments) don't require a full decode
150
+ if (MimeTypeHelper.scanBytes(data, [0x3c, 0x73, 0x76, 0x67])) {
57
151
  return MimeTypes.Svg;
58
152
  }
59
153
  if (MimeTypeHelper.checkText(data, ["<?xml ", "<message"])) {
@@ -64,14 +158,12 @@ export class MimeTypeHelper {
64
158
  // UTF-8-BOM
65
159
  return MimeTypes.Xml;
66
160
  }
67
- if (StringHelper.isUtf8(data)) {
68
- try {
69
- JSON.parse(new TextDecoder().decode(data));
70
- return MimeTypes.Json;
71
- }
72
- catch {
73
- return MimeTypes.PlainText;
74
- }
161
+ try {
162
+ const text = new TextDecoder("utf-8", { fatal: true }).decode(data);
163
+ return MimeTypeHelper.detectJsonOrText(text);
164
+ }
165
+ catch {
166
+ // not valid UTF-8
75
167
  }
76
168
  }
77
169
  /**
@@ -122,7 +214,14 @@ export class MimeTypeHelper {
122
214
  [MimeTypes.Zlib]: "zlib",
123
215
  [MimeTypes.Bzip2]: "bz2",
124
216
  [MimeTypes.Zip]: "zip",
217
+ [MimeTypes.SevenZip]: "7z",
218
+ [MimeTypes.Rar]: "rar",
219
+ [MimeTypes.Sqlite]: "sqlite",
125
220
  [MimeTypes.Pdf]: "pdf",
221
+ [MimeTypes.Rtf]: "rtf",
222
+ [MimeTypes.Docx]: "docx",
223
+ [MimeTypes.Xlsx]: "xlsx",
224
+ [MimeTypes.Pptx]: "pptx",
126
225
  [MimeTypes.Gif]: "gif",
127
226
  [MimeTypes.Bmp]: "bmp",
128
227
  [MimeTypes.Jpeg]: "jpeg",
@@ -132,11 +231,14 @@ export class MimeTypeHelper {
132
231
  [MimeTypes.Ico]: "ico",
133
232
  [MimeTypes.WebP]: "webp",
134
233
  [MimeTypes.Avif]: "avif",
234
+ [MimeTypes.Heic]: "heic",
135
235
  [MimeTypes.Apng]: "apng",
136
236
  [MimeTypes.Woff]: "woff",
137
237
  [MimeTypes.Woff2]: "woff2",
138
238
  [MimeTypes.Ttf]: "ttf",
139
239
  [MimeTypes.Otf]: "otf",
240
+ [MimeTypes.Flac]: "flac",
241
+ [MimeTypes.Midi]: "midi",
140
242
  [MimeTypes.Mp3]: "mp3",
141
243
  [MimeTypes.OggAudio]: "ogg",
142
244
  [MimeTypes.Wav]: "wav",
@@ -170,6 +272,65 @@ export class MimeTypeHelper {
170
272
  }
171
273
  return true;
172
274
  }
275
+ /**
276
+ * Detect whether already-decoded UTF-8 text is JSON or plain text.
277
+ * For structured types (object/array) the end character is also checked
278
+ * before attempting a full parse to avoid the cost on large plain-text content.
279
+ * @param text The decoded text to inspect.
280
+ * @returns The detected mime type.
281
+ * @internal
282
+ */
283
+ static detectJsonOrText(text) {
284
+ const trimmedStart = text.trimStart();
285
+ if (trimmedStart.length === 0) {
286
+ return MimeTypes.PlainText;
287
+ }
288
+ const first = trimmedStart.charCodeAt(0);
289
+ let couldBeJson;
290
+ if (first === 0x7b || first === 0x5b) {
291
+ // Object or array: verify matching end character before attempting full parse
292
+ const trimmedEnd = text.trimEnd();
293
+ const last = trimmedEnd.charCodeAt(trimmedEnd.length - 1);
294
+ couldBeJson = (first === 0x7b && last === 0x7d) || (first === 0x5b && last === 0x5d);
295
+ }
296
+ else {
297
+ // Primitive value: first character is sufficient to screen
298
+ couldBeJson =
299
+ first === 0x22 || // "
300
+ first === 0x74 || // t (true)
301
+ first === 0x66 || // f (false)
302
+ first === 0x6e || // n (null)
303
+ first === 0x2d || // -
304
+ (first >= 0x30 && first <= 0x39); // 0-9
305
+ }
306
+ if (couldBeJson) {
307
+ try {
308
+ JSON.parse(text);
309
+ return MimeTypes.Json;
310
+ }
311
+ catch {
312
+ // valid UTF-8 but not valid JSON
313
+ }
314
+ }
315
+ return MimeTypes.PlainText;
316
+ }
317
+ /**
318
+ * Scan for a byte sequence anywhere within the first limit bytes.
319
+ * @param data The data to search.
320
+ * @param bytes The byte sequence to find.
321
+ * @param limit Maximum number of bytes to scan.
322
+ * @returns True if the sequence is found within the scan limit.
323
+ * @internal
324
+ */
325
+ static scanBytes(data, bytes, limit = 4096) {
326
+ const end = Math.min(data.length - bytes.length, limit);
327
+ for (let i = 0; i <= end; i++) {
328
+ if (MimeTypeHelper.checkBytes(data, bytes, i)) {
329
+ return true;
330
+ }
331
+ }
332
+ return false;
333
+ }
173
334
  /**
174
335
  * Check if the text matches.
175
336
  * @param data The data to look at.
@@ -1 +1 @@
1
- {"version":3,"file":"mimeTypeHelper.js","sourceRoot":"","sources":["../../../src/utils/mimeTypeHelper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Converter, Is, StringHelper } from \"@twin.org/core\";\nimport { MimeTypes } from \"../models/mimeTypes.js\";\n\n/**\n * Class to help with mime types.\n */\nexport class MimeTypeHelper {\n\t/**\n\t * Detect the mime type from a byte array.\n\t * @param data The data to test.\n\t * @returns The mime type if detected.\n\t */\n\tpublic static async detect(data: Uint8Array): Promise<string | undefined> {\n\t\tif (!Is.uint8Array(data) || data.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Image\n\t\tif (MimeTypeHelper.checkBytes(data, [0x47, 0x49, 0x46])) {\n\t\t\treturn MimeTypes.Gif;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x42, 0x4d])) {\n\t\t\treturn MimeTypes.Bmp;\n\t\t}\n\t\tif (MimeTypeHelper.checkBytes(data, [0xff, 0xd8, 0xff])) {\n\t\t\treturn MimeTypes.Jpeg;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) {\n\t\t\treturn MimeTypes.Png;\n\t\t}\n\n\t\tif (\n\t\t\tMimeTypeHelper.checkBytes(data, [0x49, 0x49, 0x2a, 0x00]) ||\n\t\t\tMimeTypeHelper.checkBytes(data, [0x4d, 0x4d, 0x00, 0x2a])\n\t\t) {\n\t\t\treturn MimeTypes.Tiff;\n\t\t}\n\n\t\t// Compression\n\t\tif (MimeTypeHelper.checkBytes(data, [0x1f, 0x8b, 0x8])) {\n\t\t\treturn MimeTypes.Gzip;\n\t\t}\n\n\t\tif (\n\t\t\tMimeTypeHelper.checkBytes(data, [0x78, 0x01]) ||\n\t\t\tMimeTypeHelper.checkBytes(data, [0x78, 0x9c]) ||\n\t\t\tMimeTypeHelper.checkBytes(data, [0x78, 0xda])\n\t\t) {\n\t\t\treturn MimeTypes.Zlib;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x42, 0x5a, 0x68])) {\n\t\t\treturn MimeTypes.Bzip2;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x50, 0x4b, 0x3, 0x4])) {\n\t\t\treturn MimeTypes.Zip;\n\t\t}\n\n\t\t// Documents\n\t\tif (MimeTypeHelper.checkText(data, [\"%PDF\"])) {\n\t\t\treturn MimeTypes.Pdf;\n\t\t}\n\n\t\t// Lookup svg before xml, as svg are xml files as well\n\t\tconst asText = Converter.bytesToUtf8(data);\n\t\tif (asText.includes(\"<svg\")) {\n\t\t\treturn MimeTypes.Svg;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkText(data, [\"<?xml \", \"<message\"])) {\n\t\t\treturn MimeTypes.Xml;\n\t\t}\n\n\t\tif (\n\t\t\tMimeTypeHelper.checkBytes(data, [0xef, 0xbb, 0xbf]) &&\n\t\t\tMimeTypeHelper.checkText(data, [\"<?xml \"], 3)\n\t\t) {\n\t\t\t// UTF-8-BOM\n\t\t\treturn MimeTypes.Xml;\n\t\t}\n\n\t\tif (StringHelper.isUtf8(data)) {\n\t\t\ttry {\n\t\t\t\tJSON.parse(new TextDecoder().decode(data));\n\t\t\t\treturn MimeTypes.Json;\n\t\t\t} catch {\n\t\t\t\treturn MimeTypes.PlainText;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Return the default extension for a mime type.\n\t * @param mimeType The mimetype to get the extension for.\n\t * @returns The extension for the mime type.\n\t */\n\tpublic static defaultExtension(mimeType: string | undefined): string | undefined {\n\t\tif (!Is.stringValue(mimeType)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst lookup: { [mimeType: string]: string } = {\n\t\t\t[MimeTypes.PlainText]: \"txt\",\n\t\t\t[MimeTypes.EventStream]: \"txt\",\n\t\t\t[MimeTypes.Html]: \"html\",\n\t\t\t[MimeTypes.Css]: \"css\",\n\t\t\t[MimeTypes.Javascript]: \"js\",\n\t\t\t[MimeTypes.Markdown]: \"md\",\n\t\t\t[MimeTypes.Json]: \"json\",\n\t\t\t[MimeTypes.ProblemJson]: \"json\",\n\t\t\t[MimeTypes.WebManifest]: \"webmanifest\",\n\t\t\t[MimeTypes.JsonLd]: \"jsonld\",\n\t\t\t[MimeTypes.Jwt]: \"jwt\",\n\t\t\t[MimeTypes.AccessTokenJwt]: \"jwt\",\n\t\t\t[MimeTypes.Jose]: \"jose\",\n\t\t\t[MimeTypes.JoseJson]: \"json\",\n\t\t\t[MimeTypes.JwkJson]: \"json\",\n\t\t\t[MimeTypes.JwkSetJson]: \"json\",\n\t\t\t[MimeTypes.JrdJson]: \"json\",\n\t\t\t[MimeTypes.DidJson]: \"json\",\n\t\t\t[MimeTypes.DidLdJson]: \"jsonld\",\n\t\t\t[MimeTypes.VerifiableCredentialLdJson]: \"jsonld\",\n\t\t\t[MimeTypes.VerifiablePresentationLdJson]: \"jsonld\",\n\t\t\t[MimeTypes.VerifiableCredentialJwt]: \"jwt\",\n\t\t\t[MimeTypes.VerifiablePresentationJwt]: \"jwt\",\n\t\t\t[MimeTypes.JsonPatch]: \"json\",\n\t\t\t[MimeTypes.MergePatch]: \"json\",\n\t\t\t[MimeTypes.Cwt]: \"cwt\",\n\t\t\t[MimeTypes.Cose]: \"cose\",\n\t\t\t[MimeTypes.CoseKey]: \"cose\",\n\t\t\t[MimeTypes.CoseKeySet]: \"cose\",\n\t\t\t[MimeTypes.FormUrlEncoded]: \"txt\",\n\t\t\t[MimeTypes.MultipartFormData]: \"txt\",\n\t\t\t[MimeTypes.Xml]: \"xml\",\n\t\t\t[MimeTypes.Wasm]: \"wasm\",\n\t\t\t[MimeTypes.OctetStream]: \"bin\",\n\t\t\t[MimeTypes.Gzip]: \"gzip\",\n\t\t\t[MimeTypes.Zlib]: \"zlib\",\n\t\t\t[MimeTypes.Bzip2]: \"bz2\",\n\t\t\t[MimeTypes.Zip]: \"zip\",\n\t\t\t[MimeTypes.Pdf]: \"pdf\",\n\t\t\t[MimeTypes.Gif]: \"gif\",\n\t\t\t[MimeTypes.Bmp]: \"bmp\",\n\t\t\t[MimeTypes.Jpeg]: \"jpeg\",\n\t\t\t[MimeTypes.Png]: \"png\",\n\t\t\t[MimeTypes.Tiff]: \"tif\",\n\t\t\t[MimeTypes.Svg]: \"svg\",\n\t\t\t[MimeTypes.Ico]: \"ico\",\n\t\t\t[MimeTypes.WebP]: \"webp\",\n\t\t\t[MimeTypes.Avif]: \"avif\",\n\t\t\t[MimeTypes.Apng]: \"apng\",\n\t\t\t[MimeTypes.Woff]: \"woff\",\n\t\t\t[MimeTypes.Woff2]: \"woff2\",\n\t\t\t[MimeTypes.Ttf]: \"ttf\",\n\t\t\t[MimeTypes.Otf]: \"otf\",\n\t\t\t[MimeTypes.Mp3]: \"mp3\",\n\t\t\t[MimeTypes.OggAudio]: \"ogg\",\n\t\t\t[MimeTypes.Wav]: \"wav\",\n\t\t\t[MimeTypes.WebmAudio]: \"webm\",\n\t\t\t[MimeTypes.Aac]: \"aac\",\n\t\t\t[MimeTypes.Mp4Audio]: \"m4a\",\n\t\t\t[MimeTypes.Mp4]: \"mp4\",\n\t\t\t[MimeTypes.Mpeg]: \"mpg\",\n\t\t\t[MimeTypes.Webm]: \"webm\",\n\t\t\t[MimeTypes.OggVideo]: \"ogv\",\n\t\t\t[MimeTypes.Quicktime]: \"mov\"\n\t\t};\n\n\t\treturn lookup[mimeType];\n\t}\n\n\t/**\n\t * Check if the bytes match.\n\t * @param data The data to look at.\n\t * @param bytes The bytes to try and match.\n\t * @param startOffset Start offset in the data.\n\t * @returns True if the bytes match.\n\t * @internal\n\t */\n\tprivate static checkBytes(data: Uint8Array, bytes: number[], startOffset = 0): boolean {\n\t\tif (data.length - startOffset < bytes.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (let i = 0; i < bytes.length; i++) {\n\t\t\tif (data[i + startOffset] !== bytes[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Check if the text matches.\n\t * @param data The data to look at.\n\t * @param texts The text to try and match.\n\t * @param startOffset Start offset in the data.\n\t * @returns True if the bytes match.\n\t * @internal\n\t */\n\tprivate static checkText(data: Uint8Array, texts: string[], startOffset = 0): boolean {\n\t\treturn texts.some(text =>\n\t\t\tMimeTypeHelper.checkBytes(data, Array.from(Converter.utf8ToBytes(text)), startOffset)\n\t\t);\n\t}\n}\n"]}
1
+ {"version":3,"file":"mimeTypeHelper.js","sourceRoot":"","sources":["../../../src/utils/mimeTypeHelper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Converter, Is } from \"@twin.org/core\";\nimport { MimeTypes } from \"../models/mimeTypes.js\";\n\n/**\n * Class to help with mime types.\n */\nexport class MimeTypeHelper {\n\t/**\n\t * Detect the mime type from a byte array.\n\t * @param data The data to test.\n\t * @returns The mime type if detected.\n\t */\n\tpublic static async detect(data: Uint8Array): Promise<string | undefined> {\n\t\tif (!Is.uint8Array(data) || data.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Image\n\t\tif (MimeTypeHelper.checkBytes(data, [0x47, 0x49, 0x46])) {\n\t\t\treturn MimeTypes.Gif;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x42, 0x4d])) {\n\t\t\treturn MimeTypes.Bmp;\n\t\t}\n\t\tif (MimeTypeHelper.checkBytes(data, [0xff, 0xd8, 0xff])) {\n\t\t\treturn MimeTypes.Jpeg;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) {\n\t\t\treturn MimeTypes.Png;\n\t\t}\n\n\t\tif (\n\t\t\tMimeTypeHelper.checkBytes(data, [0x49, 0x49, 0x2a, 0x00]) ||\n\t\t\tMimeTypeHelper.checkBytes(data, [0x4d, 0x4d, 0x00, 0x2a])\n\t\t) {\n\t\t\treturn MimeTypes.Tiff;\n\t\t}\n\n\t\t// WebP: RIFF container with WEBP brand at offset 8\n\t\tif (\n\t\t\tMimeTypeHelper.checkBytes(data, [0x52, 0x49, 0x46, 0x46]) &&\n\t\t\tMimeTypeHelper.checkBytes(data, [0x57, 0x45, 0x42, 0x50], 8)\n\t\t) {\n\t\t\treturn MimeTypes.WebP;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x00, 0x00, 0x01, 0x00])) {\n\t\t\treturn MimeTypes.Ico;\n\t\t}\n\n\t\t// ISO base media file format: file-type box at offset 4, major brand at offset 8\n\t\tif (MimeTypeHelper.checkBytes(data, [0x66, 0x74, 0x79, 0x70], 4)) {\n\t\t\tif (MimeTypeHelper.checkBytes(data, [0x61, 0x76, 0x69, 0x66], 8)) {\n\t\t\t\treturn MimeTypes.Avif;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tMimeTypeHelper.checkBytes(data, [0x68, 0x65, 0x69, 0x63], 8) || // heic\n\t\t\t\tMimeTypeHelper.checkBytes(data, [0x68, 0x65, 0x69, 0x78], 8) || // heic variant\n\t\t\t\tMimeTypeHelper.checkBytes(data, [0x68, 0x65, 0x69, 0x66], 8) || // heif\n\t\t\t\tMimeTypeHelper.checkBytes(data, [0x6d, 0x69, 0x66, 0x31], 8) // mif1 (multi-image)\n\t\t\t) {\n\t\t\t\treturn MimeTypes.Heic;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tMimeTypeHelper.checkBytes(data, [0x69, 0x73, 0x6f, 0x6d], 8) ||\n\t\t\t\tMimeTypeHelper.checkBytes(data, [0x6d, 0x70, 0x34, 0x31], 8) ||\n\t\t\t\tMimeTypeHelper.checkBytes(data, [0x6d, 0x70, 0x34, 0x32], 8) ||\n\t\t\t\tMimeTypeHelper.checkBytes(data, [0x4d, 0x34, 0x56, 0x20], 8)\n\t\t\t) {\n\t\t\t\treturn MimeTypes.Mp4;\n\t\t\t}\n\t\t\tif (MimeTypeHelper.checkBytes(data, [0x71, 0x74, 0x20, 0x20], 8)) {\n\t\t\t\treturn MimeTypes.Quicktime;\n\t\t\t}\n\t\t}\n\n\t\t// Compression\n\t\tif (MimeTypeHelper.checkBytes(data, [0x1f, 0x8b, 0x8])) {\n\t\t\treturn MimeTypes.Gzip;\n\t\t}\n\n\t\tif (\n\t\t\tMimeTypeHelper.checkBytes(data, [0x78, 0x01]) ||\n\t\t\tMimeTypeHelper.checkBytes(data, [0x78, 0x9c]) ||\n\t\t\tMimeTypeHelper.checkBytes(data, [0x78, 0xda])\n\t\t) {\n\t\t\treturn MimeTypes.Zlib;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x42, 0x5a, 0x68])) {\n\t\t\treturn MimeTypes.Bzip2;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x50, 0x4b, 0x3, 0x4])) {\n\t\t\t// Office Open XML: scan for format-specific path prefixes in ZIP local file headers\n\t\t\tif (MimeTypeHelper.scanBytes(data, [0x77, 0x6f, 0x72, 0x64, 0x2f])) {\n\t\t\t\treturn MimeTypes.Docx; // word/\n\t\t\t}\n\t\t\tif (MimeTypeHelper.scanBytes(data, [0x78, 0x6c, 0x2f])) {\n\t\t\t\treturn MimeTypes.Xlsx; // xl/\n\t\t\t}\n\t\t\tif (MimeTypeHelper.scanBytes(data, [0x70, 0x70, 0x74, 0x2f])) {\n\t\t\t\treturn MimeTypes.Pptx; // ppt/\n\t\t\t}\n\t\t\treturn MimeTypes.Zip;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x37, 0x7a, 0xbc, 0xaf, 0x27, 0x1c])) {\n\t\t\treturn MimeTypes.SevenZip;\n\t\t}\n\n\t\tif (\n\t\t\tMimeTypeHelper.checkBytes(data, [0x52, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00]) ||\n\t\t\tMimeTypeHelper.checkBytes(data, [0x52, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x01, 0x00])\n\t\t) {\n\t\t\treturn MimeTypes.Rar;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x53, 0x51, 0x4c, 0x69])) {\n\t\t\treturn MimeTypes.Sqlite;\n\t\t}\n\n\t\t// Fonts\n\t\tif (MimeTypeHelper.checkBytes(data, [0x77, 0x4f, 0x46, 0x46])) {\n\t\t\treturn MimeTypes.Woff;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x77, 0x4f, 0x46, 0x32])) {\n\t\t\treturn MimeTypes.Woff2;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x00, 0x01, 0x00, 0x00, 0x00])) {\n\t\t\treturn MimeTypes.Ttf;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x4f, 0x54, 0x54, 0x4f])) {\n\t\t\treturn MimeTypes.Otf;\n\t\t}\n\n\t\t// Audio / Video\n\t\tif (MimeTypeHelper.checkBytes(data, [0x1a, 0x45, 0xdf, 0xa3])) {\n\t\t\treturn MimeTypes.Webm;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x4f, 0x67, 0x67, 0x53])) {\n\t\t\treturn MimeTypes.OggAudio;\n\t\t}\n\n\t\tif (\n\t\t\tMimeTypeHelper.checkBytes(data, [0x52, 0x49, 0x46, 0x46]) &&\n\t\t\tMimeTypeHelper.checkBytes(data, [0x57, 0x41, 0x56, 0x45], 8)\n\t\t) {\n\t\t\treturn MimeTypes.Wav;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x49, 0x44, 0x33])) {\n\t\t\treturn MimeTypes.Mp3;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x66, 0x4c, 0x61, 0x43])) {\n\t\t\treturn MimeTypes.Flac;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x4d, 0x54, 0x68, 0x64])) {\n\t\t\treturn MimeTypes.Midi;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x00, 0x61, 0x73, 0x6d])) {\n\t\t\treturn MimeTypes.Wasm;\n\t\t}\n\n\t\t// Documents\n\t\tif (MimeTypeHelper.checkText(data, [\"%PDF\"])) {\n\t\t\treturn MimeTypes.Pdf;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkBytes(data, [0x7b, 0x5c, 0x72, 0x74, 0x66])) {\n\t\t\treturn MimeTypes.Rtf; // {\\rtf\n\t\t}\n\n\t\t// HTML: check before SVG so embedded SVG in an HTML page does not take precedence\n\t\tif (\n\t\t\tMimeTypeHelper.checkText(data, [\"<!DOCTYPE html\", \"<!doctype html\"]) ||\n\t\t\tMimeTypeHelper.scanBytes(data, [0x3c, 0x68, 0x74, 0x6d, 0x6c])\n\t\t) {\n\t\t\treturn MimeTypes.Html;\n\t\t}\n\n\t\t// Lookup svg before xml, as svg are xml files as well\n\t\t// Scan raw bytes so large preambles (DOCTYPE, comments) don't require a full decode\n\t\tif (MimeTypeHelper.scanBytes(data, [0x3c, 0x73, 0x76, 0x67])) {\n\t\t\treturn MimeTypes.Svg;\n\t\t}\n\n\t\tif (MimeTypeHelper.checkText(data, [\"<?xml \", \"<message\"])) {\n\t\t\treturn MimeTypes.Xml;\n\t\t}\n\n\t\tif (\n\t\t\tMimeTypeHelper.checkBytes(data, [0xef, 0xbb, 0xbf]) &&\n\t\t\tMimeTypeHelper.checkText(data, [\"<?xml \"], 3)\n\t\t) {\n\t\t\t// UTF-8-BOM\n\t\t\treturn MimeTypes.Xml;\n\t\t}\n\n\t\ttry {\n\t\t\tconst text = new TextDecoder(\"utf-8\", { fatal: true }).decode(data);\n\t\t\treturn MimeTypeHelper.detectJsonOrText(text);\n\t\t} catch {\n\t\t\t// not valid UTF-8\n\t\t}\n\t}\n\n\t/**\n\t * Return the default extension for a mime type.\n\t * @param mimeType The mimetype to get the extension for.\n\t * @returns The extension for the mime type.\n\t */\n\tpublic static defaultExtension(mimeType: string | undefined): string | undefined {\n\t\tif (!Is.stringValue(mimeType)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst lookup: { [mimeType: string]: string } = {\n\t\t\t[MimeTypes.PlainText]: \"txt\",\n\t\t\t[MimeTypes.EventStream]: \"txt\",\n\t\t\t[MimeTypes.Html]: \"html\",\n\t\t\t[MimeTypes.Css]: \"css\",\n\t\t\t[MimeTypes.Javascript]: \"js\",\n\t\t\t[MimeTypes.Markdown]: \"md\",\n\t\t\t[MimeTypes.Json]: \"json\",\n\t\t\t[MimeTypes.ProblemJson]: \"json\",\n\t\t\t[MimeTypes.WebManifest]: \"webmanifest\",\n\t\t\t[MimeTypes.JsonLd]: \"jsonld\",\n\t\t\t[MimeTypes.Jwt]: \"jwt\",\n\t\t\t[MimeTypes.AccessTokenJwt]: \"jwt\",\n\t\t\t[MimeTypes.Jose]: \"jose\",\n\t\t\t[MimeTypes.JoseJson]: \"json\",\n\t\t\t[MimeTypes.JwkJson]: \"json\",\n\t\t\t[MimeTypes.JwkSetJson]: \"json\",\n\t\t\t[MimeTypes.JrdJson]: \"json\",\n\t\t\t[MimeTypes.DidJson]: \"json\",\n\t\t\t[MimeTypes.DidLdJson]: \"jsonld\",\n\t\t\t[MimeTypes.VerifiableCredentialLdJson]: \"jsonld\",\n\t\t\t[MimeTypes.VerifiablePresentationLdJson]: \"jsonld\",\n\t\t\t[MimeTypes.VerifiableCredentialJwt]: \"jwt\",\n\t\t\t[MimeTypes.VerifiablePresentationJwt]: \"jwt\",\n\t\t\t[MimeTypes.JsonPatch]: \"json\",\n\t\t\t[MimeTypes.MergePatch]: \"json\",\n\t\t\t[MimeTypes.Cwt]: \"cwt\",\n\t\t\t[MimeTypes.Cose]: \"cose\",\n\t\t\t[MimeTypes.CoseKey]: \"cose\",\n\t\t\t[MimeTypes.CoseKeySet]: \"cose\",\n\t\t\t[MimeTypes.FormUrlEncoded]: \"txt\",\n\t\t\t[MimeTypes.MultipartFormData]: \"txt\",\n\t\t\t[MimeTypes.Xml]: \"xml\",\n\t\t\t[MimeTypes.Wasm]: \"wasm\",\n\t\t\t[MimeTypes.OctetStream]: \"bin\",\n\t\t\t[MimeTypes.Gzip]: \"gzip\",\n\t\t\t[MimeTypes.Zlib]: \"zlib\",\n\t\t\t[MimeTypes.Bzip2]: \"bz2\",\n\t\t\t[MimeTypes.Zip]: \"zip\",\n\t\t\t[MimeTypes.SevenZip]: \"7z\",\n\t\t\t[MimeTypes.Rar]: \"rar\",\n\t\t\t[MimeTypes.Sqlite]: \"sqlite\",\n\t\t\t[MimeTypes.Pdf]: \"pdf\",\n\t\t\t[MimeTypes.Rtf]: \"rtf\",\n\t\t\t[MimeTypes.Docx]: \"docx\",\n\t\t\t[MimeTypes.Xlsx]: \"xlsx\",\n\t\t\t[MimeTypes.Pptx]: \"pptx\",\n\t\t\t[MimeTypes.Gif]: \"gif\",\n\t\t\t[MimeTypes.Bmp]: \"bmp\",\n\t\t\t[MimeTypes.Jpeg]: \"jpeg\",\n\t\t\t[MimeTypes.Png]: \"png\",\n\t\t\t[MimeTypes.Tiff]: \"tif\",\n\t\t\t[MimeTypes.Svg]: \"svg\",\n\t\t\t[MimeTypes.Ico]: \"ico\",\n\t\t\t[MimeTypes.WebP]: \"webp\",\n\t\t\t[MimeTypes.Avif]: \"avif\",\n\t\t\t[MimeTypes.Heic]: \"heic\",\n\t\t\t[MimeTypes.Apng]: \"apng\",\n\t\t\t[MimeTypes.Woff]: \"woff\",\n\t\t\t[MimeTypes.Woff2]: \"woff2\",\n\t\t\t[MimeTypes.Ttf]: \"ttf\",\n\t\t\t[MimeTypes.Otf]: \"otf\",\n\t\t\t[MimeTypes.Flac]: \"flac\",\n\t\t\t[MimeTypes.Midi]: \"midi\",\n\t\t\t[MimeTypes.Mp3]: \"mp3\",\n\t\t\t[MimeTypes.OggAudio]: \"ogg\",\n\t\t\t[MimeTypes.Wav]: \"wav\",\n\t\t\t[MimeTypes.WebmAudio]: \"webm\",\n\t\t\t[MimeTypes.Aac]: \"aac\",\n\t\t\t[MimeTypes.Mp4Audio]: \"m4a\",\n\t\t\t[MimeTypes.Mp4]: \"mp4\",\n\t\t\t[MimeTypes.Mpeg]: \"mpg\",\n\t\t\t[MimeTypes.Webm]: \"webm\",\n\t\t\t[MimeTypes.OggVideo]: \"ogv\",\n\t\t\t[MimeTypes.Quicktime]: \"mov\"\n\t\t};\n\n\t\treturn lookup[mimeType];\n\t}\n\n\t/**\n\t * Check if the bytes match.\n\t * @param data The data to look at.\n\t * @param bytes The bytes to try and match.\n\t * @param startOffset Start offset in the data.\n\t * @returns True if the bytes match.\n\t * @internal\n\t */\n\tprivate static checkBytes(data: Uint8Array, bytes: number[], startOffset = 0): boolean {\n\t\tif (data.length - startOffset < bytes.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (let i = 0; i < bytes.length; i++) {\n\t\t\tif (data[i + startOffset] !== bytes[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Detect whether already-decoded UTF-8 text is JSON or plain text.\n\t * For structured types (object/array) the end character is also checked\n\t * before attempting a full parse to avoid the cost on large plain-text content.\n\t * @param text The decoded text to inspect.\n\t * @returns The detected mime type.\n\t * @internal\n\t */\n\tprivate static detectJsonOrText(text: string): string {\n\t\tconst trimmedStart = text.trimStart();\n\t\tif (trimmedStart.length === 0) {\n\t\t\treturn MimeTypes.PlainText;\n\t\t}\n\n\t\tconst first = trimmedStart.charCodeAt(0);\n\t\tlet couldBeJson: boolean;\n\n\t\tif (first === 0x7b || first === 0x5b) {\n\t\t\t// Object or array: verify matching end character before attempting full parse\n\t\t\tconst trimmedEnd = text.trimEnd();\n\t\t\tconst last = trimmedEnd.charCodeAt(trimmedEnd.length - 1);\n\t\t\tcouldBeJson = (first === 0x7b && last === 0x7d) || (first === 0x5b && last === 0x5d);\n\t\t} else {\n\t\t\t// Primitive value: first character is sufficient to screen\n\t\t\tcouldBeJson =\n\t\t\t\tfirst === 0x22 || // \"\n\t\t\t\tfirst === 0x74 || // t (true)\n\t\t\t\tfirst === 0x66 || // f (false)\n\t\t\t\tfirst === 0x6e || // n (null)\n\t\t\t\tfirst === 0x2d || // -\n\t\t\t\t(first >= 0x30 && first <= 0x39); // 0-9\n\t\t}\n\n\t\tif (couldBeJson) {\n\t\t\ttry {\n\t\t\t\tJSON.parse(text);\n\t\t\t\treturn MimeTypes.Json;\n\t\t\t} catch {\n\t\t\t\t// valid UTF-8 but not valid JSON\n\t\t\t}\n\t\t}\n\n\t\treturn MimeTypes.PlainText;\n\t}\n\n\t/**\n\t * Scan for a byte sequence anywhere within the first limit bytes.\n\t * @param data The data to search.\n\t * @param bytes The byte sequence to find.\n\t * @param limit Maximum number of bytes to scan.\n\t * @returns True if the sequence is found within the scan limit.\n\t * @internal\n\t */\n\tprivate static scanBytes(data: Uint8Array, bytes: number[], limit = 4096): boolean {\n\t\tconst end = Math.min(data.length - bytes.length, limit);\n\t\tfor (let i = 0; i <= end; i++) {\n\t\t\tif (MimeTypeHelper.checkBytes(data, bytes, i)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Check if the text matches.\n\t * @param data The data to look at.\n\t * @param texts The text to try and match.\n\t * @param startOffset Start offset in the data.\n\t * @returns True if the bytes match.\n\t * @internal\n\t */\n\tprivate static checkText(data: Uint8Array, texts: string[], startOffset = 0): boolean {\n\t\treturn texts.some(text =>\n\t\t\tMimeTypeHelper.checkBytes(data, Array.from(Converter.utf8ToBytes(text)), startOffset)\n\t\t);\n\t}\n}\n"]}
@@ -159,10 +159,38 @@ export declare const MimeTypes: {
159
159
  * Application ZIP - application/zip
160
160
  */
161
161
  readonly Zip: "application/zip";
162
+ /**
163
+ * Application 7-Zip - application/x-7z-compressed
164
+ */
165
+ readonly SevenZip: "application/x-7z-compressed";
166
+ /**
167
+ * Application RAR - application/vnd.rar
168
+ */
169
+ readonly Rar: "application/vnd.rar";
170
+ /**
171
+ * Application SQLite3 - application/x-sqlite3
172
+ */
173
+ readonly Sqlite: "application/x-sqlite3";
162
174
  /**
163
175
  * Application PDF - application/pdf
164
176
  */
165
177
  readonly Pdf: "application/pdf";
178
+ /**
179
+ * Rich Text Format - application/rtf
180
+ */
181
+ readonly Rtf: "application/rtf";
182
+ /**
183
+ * Word Document - application/vnd.openxmlformats-officedocument.wordprocessingml.document
184
+ */
185
+ readonly Docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
186
+ /**
187
+ * Excel Spreadsheet - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
188
+ */
189
+ readonly Xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
190
+ /**
191
+ * PowerPoint Presentation - application/vnd.openxmlformats-officedocument.presentationml.presentation
192
+ */
193
+ readonly Pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation";
166
194
  /**
167
195
  * Image GIF - image/gif
168
196
  */
@@ -199,6 +227,10 @@ export declare const MimeTypes: {
199
227
  * Image AVIF - image/avif
200
228
  */
201
229
  readonly Avif: "image/avif";
230
+ /**
231
+ * Image HEIC - image/heic
232
+ */
233
+ readonly Heic: "image/heic";
202
234
  /**
203
235
  * Image APNG - image/apng
204
236
  */
@@ -219,6 +251,14 @@ export declare const MimeTypes: {
219
251
  * Font OTF - font/otf
220
252
  */
221
253
  readonly Otf: "font/otf";
254
+ /**
255
+ * Audio FLAC - audio/flac
256
+ */
257
+ readonly Flac: "audio/flac";
258
+ /**
259
+ * Audio MIDI - audio/midi
260
+ */
261
+ readonly Midi: "audio/midi";
222
262
  /**
223
263
  * Audio MP3 - audio/mpeg
224
264
  */
package/docs/changelog.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.9.3-next.2](https://github.com/iotaledger/twin-framework/compare/web-v0.9.3-next.1...web-v0.9.3-next.2) (2026-08-28)
4
+
5
+
6
+ ### Features
7
+
8
+ * improve mime type detection ([#467](https://github.com/iotaledger/twin-framework/issues/467)) ([e465a5c](https://github.com/iotaledger/twin-framework/commit/e465a5cf0926f0ba9c779bed14bdbcc409f478d5))
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * The following workspace dependencies were updated
14
+ * dependencies
15
+ * @twin.org/core bumped from 0.9.3-next.1 to 0.9.3-next.2
16
+ * @twin.org/crypto bumped from 0.9.3-next.1 to 0.9.3-next.2
17
+ * @twin.org/nameof bumped from 0.9.3-next.1 to 0.9.3-next.2
18
+ * devDependencies
19
+ * @twin.org/nameof-transformer bumped from 0.9.3-next.1 to 0.9.3-next.2
20
+ * @twin.org/nameof-vitest-plugin bumped from 0.9.3-next.1 to 0.9.3-next.2
21
+ * @twin.org/validate-locales bumped from 0.9.3-next.1 to 0.9.3-next.2
22
+
3
23
  ## [0.9.3-next.1](https://github.com/iotaledger/twin-framework/compare/web-v0.9.3-next.0...web-v0.9.3-next.1) (2026-08-26)
4
24
 
5
25
 
@@ -240,12 +240,54 @@ Application BZIP2 - application/x-bzip2
240
240
 
241
241
  Application ZIP - application/zip
242
242
 
243
+ ### SevenZip {#sevenzip}
244
+
245
+ > `readonly` **SevenZip**: `"application/x-7z-compressed"` = `"application/x-7z-compressed"`
246
+
247
+ Application 7-Zip - application/x-7z-compressed
248
+
249
+ ### Rar {#rar}
250
+
251
+ > `readonly` **Rar**: `"application/vnd.rar"` = `"application/vnd.rar"`
252
+
253
+ Application RAR - application/vnd.rar
254
+
255
+ ### Sqlite {#sqlite}
256
+
257
+ > `readonly` **Sqlite**: `"application/x-sqlite3"` = `"application/x-sqlite3"`
258
+
259
+ Application SQLite3 - application/x-sqlite3
260
+
243
261
  ### Pdf {#pdf}
244
262
 
245
263
  > `readonly` **Pdf**: `"application/pdf"` = `"application/pdf"`
246
264
 
247
265
  Application PDF - application/pdf
248
266
 
267
+ ### Rtf {#rtf}
268
+
269
+ > `readonly` **Rtf**: `"application/rtf"` = `"application/rtf"`
270
+
271
+ Rich Text Format - application/rtf
272
+
273
+ ### Docx {#docx}
274
+
275
+ > `readonly` **Docx**: `"application/vnd.openxmlformats-officedocument.wordprocessingml.document"` = `"application/vnd.openxmlformats-officedocument.wordprocessingml.document"`
276
+
277
+ Word Document - application/vnd.openxmlformats-officedocument.wordprocessingml.document
278
+
279
+ ### Xlsx {#xlsx}
280
+
281
+ > `readonly` **Xlsx**: `"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"` = `"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"`
282
+
283
+ Excel Spreadsheet - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
284
+
285
+ ### Pptx {#pptx}
286
+
287
+ > `readonly` **Pptx**: `"application/vnd.openxmlformats-officedocument.presentationml.presentation"` = `"application/vnd.openxmlformats-officedocument.presentationml.presentation"`
288
+
289
+ PowerPoint Presentation - application/vnd.openxmlformats-officedocument.presentationml.presentation
290
+
249
291
  ### Gif {#gif}
250
292
 
251
293
  > `readonly` **Gif**: `"image/gif"` = `"image/gif"`
@@ -300,6 +342,12 @@ Image WEBP - image/webp
300
342
 
301
343
  Image AVIF - image/avif
302
344
 
345
+ ### Heic {#heic}
346
+
347
+ > `readonly` **Heic**: `"image/heic"` = `"image/heic"`
348
+
349
+ Image HEIC - image/heic
350
+
303
351
  ### Apng {#apng}
304
352
 
305
353
  > `readonly` **Apng**: `"image/apng"` = `"image/apng"`
@@ -330,6 +378,18 @@ Font TTF - font/ttf
330
378
 
331
379
  Font OTF - font/otf
332
380
 
381
+ ### Flac {#flac}
382
+
383
+ > `readonly` **Flac**: `"audio/flac"` = `"audio/flac"`
384
+
385
+ Audio FLAC - audio/flac
386
+
387
+ ### Midi {#midi}
388
+
389
+ > `readonly` **Midi**: `"audio/midi"` = `"audio/midi"`
390
+
391
+ Audio MIDI - audio/midi
392
+
333
393
  ### Mp3 {#mp3}
334
394
 
335
395
  > `readonly` **Mp3**: `"audio/mpeg"` = `"audio/mpeg"`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twin.org/web",
3
- "version": "0.9.3-next.1",
3
+ "version": "0.9.3-next.2",
4
4
  "description": "Classes for use with web operations",
5
5
  "repository": {
6
6
  "type": "git",
@@ -14,9 +14,9 @@
14
14
  "node": ">=24.0.0"
15
15
  },
16
16
  "dependencies": {
17
- "@twin.org/core": "0.9.3-next.1",
18
- "@twin.org/crypto": "0.9.3-next.1",
19
- "@twin.org/nameof": "0.9.3-next.1",
17
+ "@twin.org/core": "0.9.3-next.2",
18
+ "@twin.org/crypto": "0.9.3-next.2",
19
+ "@twin.org/nameof": "0.9.3-next.2",
20
20
  "jose": "6.2.8"
21
21
  },
22
22
  "main": "./dist/es/index.js",