@twin.org/web 0.9.2 → 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.
- package/dist/es/models/mimeTypes.js +40 -0
- package/dist/es/models/mimeTypes.js.map +1 -1
- package/dist/es/utils/headerHelper.js +1 -1
- package/dist/es/utils/headerHelper.js.map +1 -1
- package/dist/es/utils/mimeTypeHelper.js +172 -11
- package/dist/es/utils/mimeTypeHelper.js.map +1 -1
- package/dist/types/models/mimeTypes.d.ts +40 -0
- package/docs/changelog.md +68 -0
- package/docs/reference/variables/MimeTypes.md +60 -0
- package/package.json +4 -4
|
@@ -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"]}
|
|
@@ -381,7 +381,7 @@ export class HeaderHelper {
|
|
|
381
381
|
const parsed = [];
|
|
382
382
|
for (const entry of entries) {
|
|
383
383
|
const [valuePart, ...paramParts] = entry.split(";").map(p => p.trim());
|
|
384
|
-
if (!valueValidator.test(valuePart)) {
|
|
384
|
+
if (valuePart.length > 512 || !valueValidator.test(valuePart)) {
|
|
385
385
|
return undefined;
|
|
386
386
|
}
|
|
387
387
|
let quality = 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headerHelper.js","sourceRoot":"","sources":["../../../src/utils/headerHelper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { ArrayHelper, GeneralError, Guards, Is } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { HeaderTypes } from \"../models/headerTypes.js\";\nimport type { HttpLinkRelType } from \"../models/httpLinkRelType.js\";\nimport type { IHttpHeaders } from \"../models/IHttpHeaders.js\";\nimport type { IHttpLinkHeader } from \"../models/IHttpLinkHeader.js\";\n\n/**\n * Class to helper with header operations.\n */\nexport class HeaderHelper {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<HeaderHelper>();\n\n\t/**\n\t * Regex for valid correlation ID (alphanumeric, dash, underscore).\n\t * Examples: `request_123`, `trace-id-456`, `ABC_789`.\n\t * @internal\n\t */\n\tprivate static readonly _CORRELATION_ID_REGEX = /^[\\w-]+$/;\n\n\t/**\n\t * Regex for valid Accept-Language tags and wildcard values.\n\t * Supports wildcard entries and common BCP 47 style tags.\n\t * Examples: `*`, `en`, `en-GB`, `es-419`, `zh-Hant`, `zh-Hant-TW`.\n\t * @internal\n\t */\n\tprivate static readonly _ACCEPT_LANGUAGE_TAG_REGEX = /^(\\*|[A-Za-z]{1,8}(?:-[\\dA-Za-z]{1,8})*)$/;\n\n\t/**\n\t * Regex for valid quality parameters in negotiation headers.\n\t * Supports quality values from `0` to `1` with up to three decimal places.\n\t * Examples: `q=1`, `q=0.9`, `q=0.875`, `q=0`, `q=1.0`.\n\t * @internal\n\t */\n\tprivate static readonly _QUALITY_REGEX = /^q=(0(?:\\.\\d{1,3})?|1(?:\\.0{1,3})?)$/i;\n\n\t/**\n\t * Regex for valid media type values in Accept headers.\n\t * Supports wildcards, standard types, and vendor extensions.\n\t * Examples: `text/html`, `application/json`, `image/*`, `application/vnd.api+json`.\n\t * @internal\n\t */\n\tprivate static readonly _ACCEPT_MEDIA_TYPE_REGEX =\n\t\t/^(\\*|[A-Za-z0-9][\\w.+-]*)\\/(\\*|[A-Za-z0-9][\\w.+-]*)$/;\n\n\t/**\n\t * Regex for valid IPv4 addresses.\n\t * Examples: `127.0.0.1`, `192.168.1.10`, `255.255.255.255`.\n\t * @internal\n\t */\n\tprivate static readonly _IP_V4_REGEX =\n\t\t/^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}$/;\n\n\t/**\n\t * Regex for valid IPv6 addresses.\n\t * Examples: `2001:0db8:85a3:0000:0000:8a2e:0370:7334`, `2001:db8::`, `::1`.\n\t * @internal\n\t */\n\tprivate static readonly _IP_V6_REGEX =\n\t\t/^((?:[\\dA-Fa-f]{1,4}:){7}[\\dA-Fa-f]{1,4}|(?:[\\dA-Fa-f]{1,4}:){1,7}:|:(?::[\\dA-Fa-f]{1,4}){1,7})$/;\n\n\t/**\n\t * Create a bearer token header.\n\t * @param token The token to create the header for.\n\t * @returns The bearer token header.\n\t */\n\tpublic static createBearer(token: unknown): string {\n\t\tif (Is.stringValue(token)) {\n\t\t\tif (token.startsWith(\"Bearer \")) {\n\t\t\t\treturn token;\n\t\t\t}\n\t\t\treturn `Bearer ${token.trim()}`;\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Extract the bearer token from a header.\n\t * @param header The header value to extract the token from.\n\t * @returns The extracted token if it exists.\n\t */\n\tpublic static extractBearer(header: unknown): string {\n\t\tif (Is.stringValue(header) && header.startsWith(\"Bearer \")) {\n\t\t\treturn header.slice(7, header.length).trim();\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Extract parsed language preferences from the Accept-Language header.\n\t * @param headers The HTTP request headers.\n\t * @returns The parsed language preferences ordered by highest quality first, or undefined if missing or invalid.\n\t */\n\tpublic static extractAcceptLanguage(\n\t\theaders?: IHttpHeaders\n\t): { language: string; quality: number }[] | undefined {\n\t\treturn HeaderHelper.parseAcceptLanguage(headers?.[HeaderTypes.AcceptLanguage]);\n\t}\n\n\t/**\n\t * Parse one or more Accept-Language header values into language preferences.\n\t * @param acceptLanguage The Accept-Language header value or values.\n\t * @returns The parsed language preferences ordered by highest quality first, or undefined if missing or if any entry is invalid.\n\t */\n\tpublic static parseAcceptLanguage(\n\t\tacceptLanguage: string | string[] | undefined\n\t): { language: string; quality: number }[] | undefined {\n\t\tconst parsed = HeaderHelper.parseWeightedHeader(\n\t\t\tacceptLanguage,\n\t\t\tHeaderHelper._ACCEPT_LANGUAGE_TAG_REGEX\n\t\t);\n\t\treturn parsed?.map(({ value, quality }) => ({ language: value, quality }));\n\t}\n\n\t/**\n\t * Extract parsed media type preferences from the Accept header.\n\t * @param headers The HTTP request headers.\n\t * @returns The parsed media type preferences ordered by highest quality first, or undefined if missing or invalid.\n\t */\n\tpublic static extractAccept(\n\t\theaders?: IHttpHeaders\n\t): { mimeType: string; quality: number; params?: { [key: string]: string } }[] | undefined {\n\t\treturn HeaderHelper.parseAccept(headers?.[HeaderTypes.Accept]);\n\t}\n\n\t/**\n\t * Parse one or more Accept header values into media type preferences.\n\t * @param accept The Accept header value or values.\n\t * @returns The parsed media type preferences ordered by highest quality first, or undefined if missing or if any entry is invalid.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Accept\n\t */\n\tpublic static parseAccept(\n\t\taccept: string | string[] | undefined\n\t): { mimeType: string; quality: number; params?: { [key: string]: string } }[] | undefined {\n\t\tconst parsed = HeaderHelper.parseWeightedHeader(accept, HeaderHelper._ACCEPT_MEDIA_TYPE_REGEX);\n\t\treturn parsed?.map(({ value, quality, params }) => ({\n\t\t\tmimeType: value,\n\t\t\tquality,\n\t\t\tparams: Object.keys(params).length > 0 ? params : undefined\n\t\t}));\n\t}\n\n\t/**\n\t * Extract client IP addresses from HTTP request headers.\n\t * Checks all `X-Forwarded-For` and `X-Real-IP` header values for proxied requests.\n\t * @param headers The HTTP request headers.\n\t * @returns The extracted client IP addresses in header order.\n\t */\n\tpublic static extractClientIps(headers?: IHttpHeaders): string[] {\n\t\tconst ips: string[] = [];\n\n\t\tconst forwardedForValues = HeaderHelper.getHeaderValues(headers?.[\"x-forwarded-for\"]);\n\t\tfor (const forwardedFor of forwardedForValues) {\n\t\t\tconst forwardedIps = forwardedFor\n\t\t\t\t.split(\",\")\n\t\t\t\t.map(ip => ip.trim())\n\t\t\t\t.filter(ip => HeaderHelper.isIpAddress(ip));\n\n\t\t\tips.push(...forwardedIps);\n\t\t}\n\n\t\tconst realIpValues = HeaderHelper.getHeaderValues(headers?.[\"x-real-ip\"]);\n\t\tfor (const realIp of realIpValues) {\n\t\t\tif (HeaderHelper.isIpAddress(realIp)) {\n\t\t\t\tips.push(realIp);\n\t\t\t}\n\t\t}\n\n\t\treturn ips;\n\t}\n\n\t/**\n\t * Extract the User-Agent header from the HTTP request context.\n\t * @param headers The HTTP request headers.\n\t * @param maxLength Optional maximum length for the User-Agent string to prevent excessively long values.\n\t * @returns The user agent string or undefined if not available.\n\t */\n\tpublic static extractUserAgent(headers?: IHttpHeaders, maxLength?: number): string | undefined {\n\t\tconst headerValues = HeaderHelper.getHeaderValues(headers?.[HeaderTypes.UserAgent]);\n\t\tfor (const headerValue of headerValues) {\n\t\t\treturn Is.integer(maxLength) ? headerValue.slice(0, maxLength) : headerValue;\n\t\t}\n\t}\n\n\t/**\n\t * Extract a correlation ID for request tracing from the X-Correlation-ID header.\n\t * @param headers The HTTP request headers.\n\t * @param maxLength Optional maximum length for the extracted correlation ID.\n\t * @returns The correlation ID, or undefined if the header is missing or invalid.\n\t */\n\tpublic static extractCorrelationId(\n\t\theaders?: IHttpHeaders,\n\t\tmaxLength?: number\n\t): string | undefined {\n\t\tconst headerValues = HeaderHelper.getHeaderValues(headers?.[\"x-correlation-id\"]);\n\t\tfor (const headerValue of headerValues) {\n\t\t\tif (HeaderHelper._CORRELATION_ID_REGEX.test(headerValue)) {\n\t\t\t\treturn Is.integer(maxLength) ? headerValue.slice(0, maxLength) : headerValue;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Validate if a string is a valid IP address (IPv4 or IPv6).\n\t * @param ip The IP address to validate.\n\t * @returns True if valid, false otherwise.\n\t */\n\tpublic static isIpAddress(ip: string): boolean {\n\t\tif (!Is.stringValue(ip)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn HeaderHelper.isIpAddressV4(ip) || HeaderHelper.isIpAddressV6(ip);\n\t}\n\n\t/**\n\t * Validate if a string is a valid IP address IPv4.\n\t * @param ip The IP address to validate.\n\t * @returns True if valid, false otherwise.\n\t */\n\tpublic static isIpAddressV4(ip: string): boolean {\n\t\tif (!Is.stringValue(ip)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn HeaderHelper._IP_V4_REGEX.test(ip);\n\t}\n\n\t/**\n\t * Validate if a string is a valid IP address IPv6.\n\t * @param ip The IP address to validate.\n\t * @returns True if valid, false otherwise.\n\t */\n\tpublic static isIpAddressV6(ip: string): boolean {\n\t\tif (!Is.stringValue(ip)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn HeaderHelper._IP_V6_REGEX.test(ip);\n\t}\n\n\t/**\n\t * Extract the first occurrence of properties from a Link header for a specific relation type.\n\t * @param linkHeader The Link header value in format `<url>; rel=\"...\"; param1=\"\"; param2=\"\"`.\n\t * @param relation The relation type to extract.\n\t * @returns The extracted URL, rel and optional params or undefined if invalid/missing.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Link\n\t */\n\tpublic static extractLinkHeaderRelation(\n\t\tlinkHeader: string | string[] | undefined,\n\t\trelation: HttpLinkRelType | string | RegExp\n\t): IHttpLinkHeader | undefined {\n\t\tconst headers = HeaderHelper.extractLinkHeaders(linkHeader);\n\t\tif (Is.arrayValue(headers)) {\n\t\t\treturn headers.find(h => HeaderHelper.matchesLinkHeaderRelation(h.rel, relation));\n\t\t}\n\t}\n\n\t/**\n\t * Extract multiple properties from a Link header for a specific relation type.\n\t * @param linkHeader The Link header value in format `<url>; rel=\"...\"; param1=\"\"; param2=\"\"`.\n\t * @param relation The relation type to extract.\n\t * @returns The extracted URL, rel and optional params or undefined if invalid/missing.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Link\n\t */\n\tpublic static extractLinkHeaderRelations(\n\t\tlinkHeader: string | string[] | undefined,\n\t\trelation: HttpLinkRelType | string | RegExp\n\t): IHttpLinkHeader[] | undefined {\n\t\tconst headers = HeaderHelper.extractLinkHeaders(linkHeader);\n\t\tif (Is.arrayValue(headers)) {\n\t\t\treturn headers.filter(h => HeaderHelper.matchesLinkHeaderRelation(h.rel, relation));\n\t\t}\n\t}\n\n\t/**\n\t * Extract the link headers.\n\t * @param linkHeader The Link header value in format `<url>; rel=\"...\"; param1=\"\"; param2=\"\"`.\n\t * @returns The extracted possible array of URL, rel and optional params or undefined if invalid/missing.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Link\n\t */\n\tpublic static extractLinkHeaders(\n\t\tlinkHeader: string | string[] | undefined\n\t): IHttpLinkHeader[] | undefined {\n\t\tconst linkHeaderArray = ArrayHelper.fromObjectOrArray<string>(linkHeader);\n\t\tif (Is.arrayValue<string>(linkHeaderArray)) {\n\t\t\tconst results = [];\n\t\t\tfor (const singleLinkHeader of linkHeaderArray) {\n\t\t\t\tconst segments = HeaderHelper.extractLinkHeaderSegments(singleLinkHeader);\n\t\t\t\tresults.push(\n\t\t\t\t\t...segments.map(l => HeaderHelper.extractLinkHeader(l)).filter(h => !Is.empty(h))\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn results;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Split a combined Link header value into individual link-value segments, comma separated.\n\t * @param linkHeader Raw Link header string.\n\t * @returns Array of individual link-value segments.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Link\n\t */\n\tpublic static extractLinkHeaderSegments(linkHeader: string): string[] {\n\t\tif (!Is.stringValue(linkHeader)) {\n\t\t\treturn [];\n\t\t}\n\t\tconst trimmed = linkHeader.trim();\n\t\tif (Is.empty(trimmed)) {\n\t\t\treturn [];\n\t\t}\n\t\treturn trimmed\n\t\t\t.split(/,(?=\\s*<)/)\n\t\t\t.map(s => s.trim())\n\t\t\t.filter(s => !Is.empty(s));\n\t}\n\n\t/**\n\t * Extract the properties from a Link header.\n\t * @param linkHeader The Link header value in format `<url>; rel=\"...\"; param1=\"\"; param2=\"\"`.\n\t * @returns The extracted URL, rel and optional params or undefined if invalid/missing.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Link\n\t */\n\tpublic static extractLinkHeader(linkHeader: string): IHttpLinkHeader | undefined {\n\t\tif (!Is.stringValue(linkHeader)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst parts = linkHeader.split(\";\");\n\n\t\tif (parts.length >= 2) {\n\t\t\tlet url;\n\t\t\tlet urlQueryParams: { [id: string]: string } | undefined;\n\n\t\t\tconst urlMatch = /<([^>]+)>/.exec(parts[0]);\n\t\t\tif (Is.stringValue(urlMatch?.[1])) {\n\t\t\t\turl = urlMatch[1];\n\n\t\t\t\tconst queryIndex = url.indexOf(\"?\");\n\t\t\t\tif (queryIndex !== -1) {\n\t\t\t\t\tconst urlParamsString = url.slice(queryIndex + 1);\n\t\t\t\t\tconst queryParts = urlParamsString.split(\"&\");\n\n\t\t\t\t\tfor (const queryPart of queryParts) {\n\t\t\t\t\t\tconst [key, value] = queryPart.split(\"=\");\n\t\t\t\t\t\tif (Is.stringValue(key) && Is.stringValue(value)) {\n\t\t\t\t\t\t\turlQueryParams ??= {};\n\t\t\t\t\t\t\turlQueryParams[key] = decodeURIComponent(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet rel: string[] | undefined;\n\t\t\tconst params: { [id: string]: string } = {};\n\n\t\t\tfor (let i = 1; i < parts.length; i++) {\n\t\t\t\tconst relMatch = /rel=\"([^\"]+)\"/.exec(parts[i].trim());\n\t\t\t\tif (relMatch?.[1]) {\n\t\t\t\t\trel = HeaderHelper.normalizeLinkHeaderRelations(relMatch[1]);\n\t\t\t\t} else {\n\t\t\t\t\tconst paramMatch = /([^=]+)=\"([^\"]+)\"/.exec(parts[i].trim());\n\t\t\t\t\tif (paramMatch?.[1] && paramMatch?.[2]) {\n\t\t\t\t\t\tparams[paramMatch[1]] = paramMatch[2];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Is.stringValue(url) && Is.arrayValue(rel)) {\n\t\t\t\treturn {\n\t\t\t\t\turl,\n\t\t\t\t\turlQueryParams,\n\t\t\t\t\trel,\n\t\t\t\t\tparams: Object.keys(params).length > 0 ? params : undefined\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Create a compliant Link header.\n\t * @param url The URL to include in the Link header.\n\t * @param urlQueryParams Optional query parameters to include in the URL.\n\t * @param rel The relation type (e.g., \"next\", \"prev\", \"self\").\n\t * @returns The formatted Link header string.\n\t * @throws GeneralError if the URL or rel are invalid.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Link\n\t */\n\tpublic static createLinkHeader(\n\t\turl: string,\n\t\turlQueryParams: { [id: string]: string } | undefined,\n\t\trel: HttpLinkRelType | HttpLinkRelType[] | string | string[],\n\t\tparams?: { [id: string]: string }\n\t): string {\n\t\tGuards.stringValue(HeaderHelper.CLASS_NAME, nameof(url), url);\n\n\t\tconst relationValues = Is.string(rel)\n\t\t\t? HeaderHelper.normalizeLinkHeaderRelations(rel)\n\t\t\t: ArrayHelper.fromObjectOrArray(rel);\n\n\t\tGuards.arrayValue(HeaderHelper.CLASS_NAME, nameof(rel), relationValues);\n\n\t\tif (url.includes(\">\")) {\n\t\t\tthrow new GeneralError(HeaderHelper.CLASS_NAME, \"invalidLinkHeaderURL\");\n\t\t}\n\n\t\tfor (let i = 0; i < relationValues.length; i++) {\n\t\t\tGuards.stringValue(\n\t\t\t\tHeaderHelper.CLASS_NAME,\n\t\t\t\t`${nameof(rel)}.${i.toString()}`,\n\t\t\t\trelationValues[i]\n\t\t\t);\n\t\t\tif (relationValues[i].includes('\"') || relationValues[i].includes(\" \")) {\n\t\t\t\tthrow new GeneralError(HeaderHelper.CLASS_NAME, \"invalidLinkHeaderRel\");\n\t\t\t}\n\t\t}\n\n\t\tif (Is.objectValue(urlQueryParams)) {\n\t\t\tconst queryParamsString = Object.entries(urlQueryParams)\n\t\t\t\t.map(([key, value]) => `${key}=${encodeURIComponent(value)}`)\n\t\t\t\t.join(\"&\");\n\t\t\tconst queryIndex = url.indexOf(\"?\");\n\t\t\tif (queryIndex === -1) {\n\t\t\t\turl += `?${queryParamsString}`;\n\t\t\t} else if (queryIndex === url.length - 1) {\n\t\t\t\turl += queryParamsString;\n\t\t\t} else {\n\t\t\t\turl += `&${queryParamsString}`;\n\t\t\t}\n\t\t}\n\n\t\treturn `<${url}>; rel=\"${relationValues.join(\" \")}\"${\n\t\t\tparams\n\t\t\t\t? Object.entries(params)\n\t\t\t\t\t\t.map(([key, value]) => `; ${key}=\"${value}\"`)\n\t\t\t\t\t\t.join(\"\")\n\t\t\t\t: \"\"\n\t\t}`;\n\t}\n\n\t/**\n\t * Parse a quality-weighted comma-separated header into entries.\n\t * @param header The header value or values.\n\t * @param valueValidator Regex to validate the value portion of each entry.\n\t * @returns Entries ordered by quality descending, or undefined if any entry is invalid.\n\t */\n\tpublic static parseWeightedHeader(\n\t\theader: string | string[] | undefined,\n\t\tvalueValidator: RegExp\n\t): { value: string; quality: number; params: { [key: string]: string } }[] | undefined {\n\t\tlet headerValues: string[] = [];\n\n\t\tif (Is.array(header)) {\n\t\t\theaderValues = header.map(v => v.trim()).filter(v => v.length > 0);\n\t\t} else if (Is.stringValue(header)) {\n\t\t\theaderValues = [header.trim()];\n\t\t}\n\n\t\tif (headerValues.length > 0) {\n\t\t\tconst entries = headerValues\n\t\t\t\t.flatMap(v => v.split(\",\"))\n\t\t\t\t.map(s => s.trim())\n\t\t\t\t.filter(s => s.length > 0);\n\n\t\t\tconst parsed: { value: string; quality: number; params: { [key: string]: string } }[] = [];\n\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst [valuePart, ...paramParts] = entry.split(\";\").map(p => p.trim());\n\n\t\t\t\tif (!valueValidator.test(valuePart)) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tlet quality = 1;\n\t\t\t\tconst params: { [key: string]: string } = {};\n\n\t\t\t\tfor (const paramPart of paramParts) {\n\t\t\t\t\tif (paramPart.length > 0) {\n\t\t\t\t\t\tif (paramPart.startsWith(\"q=\") || paramPart.startsWith(\"Q=\")) {\n\t\t\t\t\t\t\tconst qualityMatch = HeaderHelper._QUALITY_REGEX.exec(paramPart);\n\t\t\t\t\t\t\tif (!qualityMatch?.[1]) {\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tquality = Number(qualityMatch[1]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst eqIndex = paramPart.indexOf(\"=\");\n\t\t\t\t\t\t\tif (eqIndex > 0) {\n\t\t\t\t\t\t\t\tconst key = paramPart.slice(0, eqIndex).trim().toLowerCase();\n\t\t\t\t\t\t\t\tconst val = paramPart.slice(eqIndex + 1).trim();\n\t\t\t\t\t\t\t\tif (key.length > 0) {\n\t\t\t\t\t\t\t\t\tparams[key] = val;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tparsed.push({ value: valuePart, quality, params });\n\t\t\t}\n\n\t\t\tif (parsed.length > 0) {\n\t\t\t\treturn parsed.sort((a, b) => b.quality - a.quality);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Does the relation selector match any of the link header relations.\n\t * @param relations The relations from the header.\n\t * @param relation The relation selector to test.\n\t * @returns True if the selector matches any relation.\n\t * @internal\n\t */\n\tprivate static matchesLinkHeaderRelation(\n\t\trelations: (HttpLinkRelType | string)[],\n\t\trelation: HttpLinkRelType | string | RegExp\n\t): boolean {\n\t\tif (Is.string(relation)) {\n\t\t\treturn relations.includes(relation);\n\t\t}\n\n\t\treturn relations.some(relValue => relation.test(relValue));\n\t}\n\n\t/**\n\t * Normalize a relation string into tokens.\n\t * @param relation The relation string.\n\t * @returns The relation tokens.\n\t * @internal\n\t */\n\tprivate static normalizeLinkHeaderRelations(relation: string): HttpLinkRelType[] {\n\t\treturn relation\n\t\t\t.split(/\\s+/)\n\t\t\t.map(relValue => relValue.trim())\n\t\t\t.filter(relValue => !Is.empty(relValue)) as HttpLinkRelType[];\n\t}\n\n\t/**\n\t * Get all non-empty values from a header that may be a string or string array.\n\t * @param header The header value (string, string array, or undefined).\n\t * @returns The trimmed non-empty string values.\n\t * @internal\n\t */\n\tprivate static getHeaderValues(header: string | string[] | undefined): string[] {\n\t\tlet headerValues: string[] = [];\n\n\t\tif (Is.array(header)) {\n\t\t\theaderValues = header;\n\t\t} else if (Is.stringValue(header)) {\n\t\t\theaderValues = [header];\n\t\t}\n\n\t\treturn headerValues\n\t\t\t.map(headerValue => headerValue.trim())\n\t\t\t.filter(headerValue => headerValue.length > 0);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"headerHelper.js","sourceRoot":"","sources":["../../../src/utils/headerHelper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { ArrayHelper, GeneralError, Guards, Is } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { HeaderTypes } from \"../models/headerTypes.js\";\nimport type { HttpLinkRelType } from \"../models/httpLinkRelType.js\";\nimport type { IHttpHeaders } from \"../models/IHttpHeaders.js\";\nimport type { IHttpLinkHeader } from \"../models/IHttpLinkHeader.js\";\n\n/**\n * Class to helper with header operations.\n */\nexport class HeaderHelper {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<HeaderHelper>();\n\n\t/**\n\t * Regex for valid correlation ID (alphanumeric, dash, underscore).\n\t * Examples: `request_123`, `trace-id-456`, `ABC_789`.\n\t * @internal\n\t */\n\tprivate static readonly _CORRELATION_ID_REGEX = /^[\\w-]+$/;\n\n\t/**\n\t * Regex for valid Accept-Language tags and wildcard values.\n\t * Supports wildcard entries and common BCP 47 style tags.\n\t * Examples: `*`, `en`, `en-GB`, `es-419`, `zh-Hant`, `zh-Hant-TW`.\n\t * @internal\n\t */\n\tprivate static readonly _ACCEPT_LANGUAGE_TAG_REGEX = /^(\\*|[A-Za-z]{1,8}(?:-[\\dA-Za-z]{1,8})*)$/;\n\n\t/**\n\t * Regex for valid quality parameters in negotiation headers.\n\t * Supports quality values from `0` to `1` with up to three decimal places.\n\t * Examples: `q=1`, `q=0.9`, `q=0.875`, `q=0`, `q=1.0`.\n\t * @internal\n\t */\n\tprivate static readonly _QUALITY_REGEX = /^q=(0(?:\\.\\d{1,3})?|1(?:\\.0{1,3})?)$/i;\n\n\t/**\n\t * Regex for valid media type values in Accept headers.\n\t * Supports wildcards, standard types, and vendor extensions.\n\t * Examples: `text/html`, `application/json`, `image/*`, `application/vnd.api+json`.\n\t * @internal\n\t */\n\tprivate static readonly _ACCEPT_MEDIA_TYPE_REGEX =\n\t\t/^(\\*|[A-Za-z0-9][\\w.+-]*)\\/(\\*|[A-Za-z0-9][\\w.+-]*)$/;\n\n\t/**\n\t * Regex for valid IPv4 addresses.\n\t * Examples: `127.0.0.1`, `192.168.1.10`, `255.255.255.255`.\n\t * @internal\n\t */\n\tprivate static readonly _IP_V4_REGEX =\n\t\t/^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}$/;\n\n\t/**\n\t * Regex for valid IPv6 addresses.\n\t * Examples: `2001:0db8:85a3:0000:0000:8a2e:0370:7334`, `2001:db8::`, `::1`.\n\t * @internal\n\t */\n\tprivate static readonly _IP_V6_REGEX =\n\t\t/^((?:[\\dA-Fa-f]{1,4}:){7}[\\dA-Fa-f]{1,4}|(?:[\\dA-Fa-f]{1,4}:){1,7}:|:(?::[\\dA-Fa-f]{1,4}){1,7})$/;\n\n\t/**\n\t * Create a bearer token header.\n\t * @param token The token to create the header for.\n\t * @returns The bearer token header.\n\t */\n\tpublic static createBearer(token: unknown): string {\n\t\tif (Is.stringValue(token)) {\n\t\t\tif (token.startsWith(\"Bearer \")) {\n\t\t\t\treturn token;\n\t\t\t}\n\t\t\treturn `Bearer ${token.trim()}`;\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Extract the bearer token from a header.\n\t * @param header The header value to extract the token from.\n\t * @returns The extracted token if it exists.\n\t */\n\tpublic static extractBearer(header: unknown): string {\n\t\tif (Is.stringValue(header) && header.startsWith(\"Bearer \")) {\n\t\t\treturn header.slice(7, header.length).trim();\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Extract parsed language preferences from the Accept-Language header.\n\t * @param headers The HTTP request headers.\n\t * @returns The parsed language preferences ordered by highest quality first, or undefined if missing or invalid.\n\t */\n\tpublic static extractAcceptLanguage(\n\t\theaders?: IHttpHeaders\n\t): { language: string; quality: number }[] | undefined {\n\t\treturn HeaderHelper.parseAcceptLanguage(headers?.[HeaderTypes.AcceptLanguage]);\n\t}\n\n\t/**\n\t * Parse one or more Accept-Language header values into language preferences.\n\t * @param acceptLanguage The Accept-Language header value or values.\n\t * @returns The parsed language preferences ordered by highest quality first, or undefined if missing or if any entry is invalid.\n\t */\n\tpublic static parseAcceptLanguage(\n\t\tacceptLanguage: string | string[] | undefined\n\t): { language: string; quality: number }[] | undefined {\n\t\tconst parsed = HeaderHelper.parseWeightedHeader(\n\t\t\tacceptLanguage,\n\t\t\tHeaderHelper._ACCEPT_LANGUAGE_TAG_REGEX\n\t\t);\n\t\treturn parsed?.map(({ value, quality }) => ({ language: value, quality }));\n\t}\n\n\t/**\n\t * Extract parsed media type preferences from the Accept header.\n\t * @param headers The HTTP request headers.\n\t * @returns The parsed media type preferences ordered by highest quality first, or undefined if missing or invalid.\n\t */\n\tpublic static extractAccept(\n\t\theaders?: IHttpHeaders\n\t): { mimeType: string; quality: number; params?: { [key: string]: string } }[] | undefined {\n\t\treturn HeaderHelper.parseAccept(headers?.[HeaderTypes.Accept]);\n\t}\n\n\t/**\n\t * Parse one or more Accept header values into media type preferences.\n\t * @param accept The Accept header value or values.\n\t * @returns The parsed media type preferences ordered by highest quality first, or undefined if missing or if any entry is invalid.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Accept\n\t */\n\tpublic static parseAccept(\n\t\taccept: string | string[] | undefined\n\t): { mimeType: string; quality: number; params?: { [key: string]: string } }[] | undefined {\n\t\tconst parsed = HeaderHelper.parseWeightedHeader(accept, HeaderHelper._ACCEPT_MEDIA_TYPE_REGEX);\n\t\treturn parsed?.map(({ value, quality, params }) => ({\n\t\t\tmimeType: value,\n\t\t\tquality,\n\t\t\tparams: Object.keys(params).length > 0 ? params : undefined\n\t\t}));\n\t}\n\n\t/**\n\t * Extract client IP addresses from HTTP request headers.\n\t * Checks all `X-Forwarded-For` and `X-Real-IP` header values for proxied requests.\n\t * @param headers The HTTP request headers.\n\t * @returns The extracted client IP addresses in header order.\n\t */\n\tpublic static extractClientIps(headers?: IHttpHeaders): string[] {\n\t\tconst ips: string[] = [];\n\n\t\tconst forwardedForValues = HeaderHelper.getHeaderValues(headers?.[\"x-forwarded-for\"]);\n\t\tfor (const forwardedFor of forwardedForValues) {\n\t\t\tconst forwardedIps = forwardedFor\n\t\t\t\t.split(\",\")\n\t\t\t\t.map(ip => ip.trim())\n\t\t\t\t.filter(ip => HeaderHelper.isIpAddress(ip));\n\n\t\t\tips.push(...forwardedIps);\n\t\t}\n\n\t\tconst realIpValues = HeaderHelper.getHeaderValues(headers?.[\"x-real-ip\"]);\n\t\tfor (const realIp of realIpValues) {\n\t\t\tif (HeaderHelper.isIpAddress(realIp)) {\n\t\t\t\tips.push(realIp);\n\t\t\t}\n\t\t}\n\n\t\treturn ips;\n\t}\n\n\t/**\n\t * Extract the User-Agent header from the HTTP request context.\n\t * @param headers The HTTP request headers.\n\t * @param maxLength Optional maximum length for the User-Agent string to prevent excessively long values.\n\t * @returns The user agent string or undefined if not available.\n\t */\n\tpublic static extractUserAgent(headers?: IHttpHeaders, maxLength?: number): string | undefined {\n\t\tconst headerValues = HeaderHelper.getHeaderValues(headers?.[HeaderTypes.UserAgent]);\n\t\tfor (const headerValue of headerValues) {\n\t\t\treturn Is.integer(maxLength) ? headerValue.slice(0, maxLength) : headerValue;\n\t\t}\n\t}\n\n\t/**\n\t * Extract a correlation ID for request tracing from the X-Correlation-ID header.\n\t * @param headers The HTTP request headers.\n\t * @param maxLength Optional maximum length for the extracted correlation ID.\n\t * @returns The correlation ID, or undefined if the header is missing or invalid.\n\t */\n\tpublic static extractCorrelationId(\n\t\theaders?: IHttpHeaders,\n\t\tmaxLength?: number\n\t): string | undefined {\n\t\tconst headerValues = HeaderHelper.getHeaderValues(headers?.[\"x-correlation-id\"]);\n\t\tfor (const headerValue of headerValues) {\n\t\t\tif (HeaderHelper._CORRELATION_ID_REGEX.test(headerValue)) {\n\t\t\t\treturn Is.integer(maxLength) ? headerValue.slice(0, maxLength) : headerValue;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Validate if a string is a valid IP address (IPv4 or IPv6).\n\t * @param ip The IP address to validate.\n\t * @returns True if valid, false otherwise.\n\t */\n\tpublic static isIpAddress(ip: string): boolean {\n\t\tif (!Is.stringValue(ip)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn HeaderHelper.isIpAddressV4(ip) || HeaderHelper.isIpAddressV6(ip);\n\t}\n\n\t/**\n\t * Validate if a string is a valid IP address IPv4.\n\t * @param ip The IP address to validate.\n\t * @returns True if valid, false otherwise.\n\t */\n\tpublic static isIpAddressV4(ip: string): boolean {\n\t\tif (!Is.stringValue(ip)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn HeaderHelper._IP_V4_REGEX.test(ip);\n\t}\n\n\t/**\n\t * Validate if a string is a valid IP address IPv6.\n\t * @param ip The IP address to validate.\n\t * @returns True if valid, false otherwise.\n\t */\n\tpublic static isIpAddressV6(ip: string): boolean {\n\t\tif (!Is.stringValue(ip)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn HeaderHelper._IP_V6_REGEX.test(ip);\n\t}\n\n\t/**\n\t * Extract the first occurrence of properties from a Link header for a specific relation type.\n\t * @param linkHeader The Link header value in format `<url>; rel=\"...\"; param1=\"\"; param2=\"\"`.\n\t * @param relation The relation type to extract.\n\t * @returns The extracted URL, rel and optional params or undefined if invalid/missing.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Link\n\t */\n\tpublic static extractLinkHeaderRelation(\n\t\tlinkHeader: string | string[] | undefined,\n\t\trelation: HttpLinkRelType | string | RegExp\n\t): IHttpLinkHeader | undefined {\n\t\tconst headers = HeaderHelper.extractLinkHeaders(linkHeader);\n\t\tif (Is.arrayValue(headers)) {\n\t\t\treturn headers.find(h => HeaderHelper.matchesLinkHeaderRelation(h.rel, relation));\n\t\t}\n\t}\n\n\t/**\n\t * Extract multiple properties from a Link header for a specific relation type.\n\t * @param linkHeader The Link header value in format `<url>; rel=\"...\"; param1=\"\"; param2=\"\"`.\n\t * @param relation The relation type to extract.\n\t * @returns The extracted URL, rel and optional params or undefined if invalid/missing.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Link\n\t */\n\tpublic static extractLinkHeaderRelations(\n\t\tlinkHeader: string | string[] | undefined,\n\t\trelation: HttpLinkRelType | string | RegExp\n\t): IHttpLinkHeader[] | undefined {\n\t\tconst headers = HeaderHelper.extractLinkHeaders(linkHeader);\n\t\tif (Is.arrayValue(headers)) {\n\t\t\treturn headers.filter(h => HeaderHelper.matchesLinkHeaderRelation(h.rel, relation));\n\t\t}\n\t}\n\n\t/**\n\t * Extract the link headers.\n\t * @param linkHeader The Link header value in format `<url>; rel=\"...\"; param1=\"\"; param2=\"\"`.\n\t * @returns The extracted possible array of URL, rel and optional params or undefined if invalid/missing.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Link\n\t */\n\tpublic static extractLinkHeaders(\n\t\tlinkHeader: string | string[] | undefined\n\t): IHttpLinkHeader[] | undefined {\n\t\tconst linkHeaderArray = ArrayHelper.fromObjectOrArray<string>(linkHeader);\n\t\tif (Is.arrayValue<string>(linkHeaderArray)) {\n\t\t\tconst results = [];\n\t\t\tfor (const singleLinkHeader of linkHeaderArray) {\n\t\t\t\tconst segments = HeaderHelper.extractLinkHeaderSegments(singleLinkHeader);\n\t\t\t\tresults.push(\n\t\t\t\t\t...segments.map(l => HeaderHelper.extractLinkHeader(l)).filter(h => !Is.empty(h))\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn results;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Split a combined Link header value into individual link-value segments, comma separated.\n\t * @param linkHeader Raw Link header string.\n\t * @returns Array of individual link-value segments.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Link\n\t */\n\tpublic static extractLinkHeaderSegments(linkHeader: string): string[] {\n\t\tif (!Is.stringValue(linkHeader)) {\n\t\t\treturn [];\n\t\t}\n\t\tconst trimmed = linkHeader.trim();\n\t\tif (Is.empty(trimmed)) {\n\t\t\treturn [];\n\t\t}\n\t\treturn trimmed\n\t\t\t.split(/,(?=\\s*<)/)\n\t\t\t.map(s => s.trim())\n\t\t\t.filter(s => !Is.empty(s));\n\t}\n\n\t/**\n\t * Extract the properties from a Link header.\n\t * @param linkHeader The Link header value in format `<url>; rel=\"...\"; param1=\"\"; param2=\"\"`.\n\t * @returns The extracted URL, rel and optional params or undefined if invalid/missing.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Link\n\t */\n\tpublic static extractLinkHeader(linkHeader: string): IHttpLinkHeader | undefined {\n\t\tif (!Is.stringValue(linkHeader)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst parts = linkHeader.split(\";\");\n\n\t\tif (parts.length >= 2) {\n\t\t\tlet url;\n\t\t\tlet urlQueryParams: { [id: string]: string } | undefined;\n\n\t\t\tconst urlMatch = /<([^>]+)>/.exec(parts[0]);\n\t\t\tif (Is.stringValue(urlMatch?.[1])) {\n\t\t\t\turl = urlMatch[1];\n\n\t\t\t\tconst queryIndex = url.indexOf(\"?\");\n\t\t\t\tif (queryIndex !== -1) {\n\t\t\t\t\tconst urlParamsString = url.slice(queryIndex + 1);\n\t\t\t\t\tconst queryParts = urlParamsString.split(\"&\");\n\n\t\t\t\t\tfor (const queryPart of queryParts) {\n\t\t\t\t\t\tconst [key, value] = queryPart.split(\"=\");\n\t\t\t\t\t\tif (Is.stringValue(key) && Is.stringValue(value)) {\n\t\t\t\t\t\t\turlQueryParams ??= {};\n\t\t\t\t\t\t\turlQueryParams[key] = decodeURIComponent(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet rel: string[] | undefined;\n\t\t\tconst params: { [id: string]: string } = {};\n\n\t\t\tfor (let i = 1; i < parts.length; i++) {\n\t\t\t\tconst relMatch = /rel=\"([^\"]+)\"/.exec(parts[i].trim());\n\t\t\t\tif (relMatch?.[1]) {\n\t\t\t\t\trel = HeaderHelper.normalizeLinkHeaderRelations(relMatch[1]);\n\t\t\t\t} else {\n\t\t\t\t\tconst paramMatch = /([^=]+)=\"([^\"]+)\"/.exec(parts[i].trim());\n\t\t\t\t\tif (paramMatch?.[1] && paramMatch?.[2]) {\n\t\t\t\t\t\tparams[paramMatch[1]] = paramMatch[2];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Is.stringValue(url) && Is.arrayValue(rel)) {\n\t\t\t\treturn {\n\t\t\t\t\turl,\n\t\t\t\t\turlQueryParams,\n\t\t\t\t\trel,\n\t\t\t\t\tparams: Object.keys(params).length > 0 ? params : undefined\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Create a compliant Link header.\n\t * @param url The URL to include in the Link header.\n\t * @param urlQueryParams Optional query parameters to include in the URL.\n\t * @param rel The relation type (e.g., \"next\", \"prev\", \"self\").\n\t * @returns The formatted Link header string.\n\t * @throws GeneralError if the URL or rel are invalid.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Link\n\t */\n\tpublic static createLinkHeader(\n\t\turl: string,\n\t\turlQueryParams: { [id: string]: string } | undefined,\n\t\trel: HttpLinkRelType | HttpLinkRelType[] | string | string[],\n\t\tparams?: { [id: string]: string }\n\t): string {\n\t\tGuards.stringValue(HeaderHelper.CLASS_NAME, nameof(url), url);\n\n\t\tconst relationValues = Is.string(rel)\n\t\t\t? HeaderHelper.normalizeLinkHeaderRelations(rel)\n\t\t\t: ArrayHelper.fromObjectOrArray(rel);\n\n\t\tGuards.arrayValue(HeaderHelper.CLASS_NAME, nameof(rel), relationValues);\n\n\t\tif (url.includes(\">\")) {\n\t\t\tthrow new GeneralError(HeaderHelper.CLASS_NAME, \"invalidLinkHeaderURL\");\n\t\t}\n\n\t\tfor (let i = 0; i < relationValues.length; i++) {\n\t\t\tGuards.stringValue(\n\t\t\t\tHeaderHelper.CLASS_NAME,\n\t\t\t\t`${nameof(rel)}.${i.toString()}`,\n\t\t\t\trelationValues[i]\n\t\t\t);\n\t\t\tif (relationValues[i].includes('\"') || relationValues[i].includes(\" \")) {\n\t\t\t\tthrow new GeneralError(HeaderHelper.CLASS_NAME, \"invalidLinkHeaderRel\");\n\t\t\t}\n\t\t}\n\n\t\tif (Is.objectValue(urlQueryParams)) {\n\t\t\tconst queryParamsString = Object.entries(urlQueryParams)\n\t\t\t\t.map(([key, value]) => `${key}=${encodeURIComponent(value)}`)\n\t\t\t\t.join(\"&\");\n\t\t\tconst queryIndex = url.indexOf(\"?\");\n\t\t\tif (queryIndex === -1) {\n\t\t\t\turl += `?${queryParamsString}`;\n\t\t\t} else if (queryIndex === url.length - 1) {\n\t\t\t\turl += queryParamsString;\n\t\t\t} else {\n\t\t\t\turl += `&${queryParamsString}`;\n\t\t\t}\n\t\t}\n\n\t\treturn `<${url}>; rel=\"${relationValues.join(\" \")}\"${\n\t\t\tparams\n\t\t\t\t? Object.entries(params)\n\t\t\t\t\t\t.map(([key, value]) => `; ${key}=\"${value}\"`)\n\t\t\t\t\t\t.join(\"\")\n\t\t\t\t: \"\"\n\t\t}`;\n\t}\n\n\t/**\n\t * Parse a quality-weighted comma-separated header into entries.\n\t * @param header The header value or values.\n\t * @param valueValidator Regex to validate the value portion of each entry.\n\t * @returns Entries ordered by quality descending, or undefined if any entry is invalid.\n\t */\n\tpublic static parseWeightedHeader(\n\t\theader: string | string[] | undefined,\n\t\tvalueValidator: RegExp\n\t): { value: string; quality: number; params: { [key: string]: string } }[] | undefined {\n\t\tlet headerValues: string[] = [];\n\n\t\tif (Is.array(header)) {\n\t\t\theaderValues = header.map(v => v.trim()).filter(v => v.length > 0);\n\t\t} else if (Is.stringValue(header)) {\n\t\t\theaderValues = [header.trim()];\n\t\t}\n\n\t\tif (headerValues.length > 0) {\n\t\t\tconst entries = headerValues\n\t\t\t\t.flatMap(v => v.split(\",\"))\n\t\t\t\t.map(s => s.trim())\n\t\t\t\t.filter(s => s.length > 0);\n\n\t\t\tconst parsed: { value: string; quality: number; params: { [key: string]: string } }[] = [];\n\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst [valuePart, ...paramParts] = entry.split(\";\").map(p => p.trim());\n\n\t\t\t\tif (valuePart.length > 512 || !valueValidator.test(valuePart)) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tlet quality = 1;\n\t\t\t\tconst params: { [key: string]: string } = {};\n\n\t\t\t\tfor (const paramPart of paramParts) {\n\t\t\t\t\tif (paramPart.length > 0) {\n\t\t\t\t\t\tif (paramPart.startsWith(\"q=\") || paramPart.startsWith(\"Q=\")) {\n\t\t\t\t\t\t\tconst qualityMatch = HeaderHelper._QUALITY_REGEX.exec(paramPart);\n\t\t\t\t\t\t\tif (!qualityMatch?.[1]) {\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tquality = Number(qualityMatch[1]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst eqIndex = paramPart.indexOf(\"=\");\n\t\t\t\t\t\t\tif (eqIndex > 0) {\n\t\t\t\t\t\t\t\tconst key = paramPart.slice(0, eqIndex).trim().toLowerCase();\n\t\t\t\t\t\t\t\tconst val = paramPart.slice(eqIndex + 1).trim();\n\t\t\t\t\t\t\t\tif (key.length > 0) {\n\t\t\t\t\t\t\t\t\tparams[key] = val;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tparsed.push({ value: valuePart, quality, params });\n\t\t\t}\n\n\t\t\tif (parsed.length > 0) {\n\t\t\t\treturn parsed.sort((a, b) => b.quality - a.quality);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Does the relation selector match any of the link header relations.\n\t * @param relations The relations from the header.\n\t * @param relation The relation selector to test.\n\t * @returns True if the selector matches any relation.\n\t * @internal\n\t */\n\tprivate static matchesLinkHeaderRelation(\n\t\trelations: (HttpLinkRelType | string)[],\n\t\trelation: HttpLinkRelType | string | RegExp\n\t): boolean {\n\t\tif (Is.string(relation)) {\n\t\t\treturn relations.includes(relation);\n\t\t}\n\n\t\treturn relations.some(relValue => relation.test(relValue));\n\t}\n\n\t/**\n\t * Normalize a relation string into tokens.\n\t * @param relation The relation string.\n\t * @returns The relation tokens.\n\t * @internal\n\t */\n\tprivate static normalizeLinkHeaderRelations(relation: string): HttpLinkRelType[] {\n\t\treturn relation\n\t\t\t.split(/\\s+/)\n\t\t\t.map(relValue => relValue.trim())\n\t\t\t.filter(relValue => !Is.empty(relValue)) as HttpLinkRelType[];\n\t}\n\n\t/**\n\t * Get all non-empty values from a header that may be a string or string array.\n\t * @param header The header value (string, string array, or undefined).\n\t * @returns The trimmed non-empty string values.\n\t * @internal\n\t */\n\tprivate static getHeaderValues(header: string | string[] | undefined): string[] {\n\t\tlet headerValues: string[] = [];\n\n\t\tif (Is.array(header)) {\n\t\t\theaderValues = header;\n\t\t} else if (Is.stringValue(header)) {\n\t\t\theaderValues = [header];\n\t\t}\n\n\t\treturn headerValues\n\t\t\t.map(headerValue => headerValue.trim())\n\t\t\t.filter(headerValue => headerValue.length > 0);\n\t}\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Copyright 2024 IOTA Stiftung.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0.
|
|
3
|
-
import { Converter, Is
|
|
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
|
-
|
|
56
|
-
if (
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD;;GAEG;AACH,MAAM,OAAO,cAAc;IAC1B;;;;OAIG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAgB;QAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,QAAQ;QACR,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACzD,OAAO,SAAS,CAAC,GAAG,CAAC;QACtB,CAAC;QAED,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACnD,OAAO,SAAS,CAAC,GAAG,CAAC;QACtB,CAAC;QACD,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACzD,OAAO,SAAS,CAAC,IAAI,CAAC;QACvB,CAAC;QAED,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACvF,OAAO,SAAS,CAAC,GAAG,CAAC;QACtB,CAAC;QAED,IACC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACzD,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EACxD,CAAC;YACF,OAAO,SAAS,CAAC,IAAI,CAAC;QACvB,CAAC;QAED,cAAc;QACd,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO,SAAS,CAAC,IAAI,CAAC;QACvB,CAAC;QAED,IACC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC7C,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC7C,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAC5C,CAAC;YACF,OAAO,SAAS,CAAC,IAAI,CAAC;QACvB,CAAC;QAED,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACzD,OAAO,SAAS,CAAC,KAAK,CAAC;QACxB,CAAC;QAED,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,SAAS,CAAC,GAAG,CAAC;QACtB,CAAC;QAED,YAAY;QACZ,IAAI,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,SAAS,CAAC,GAAG,CAAC;QACtB,CAAC;QAED,sDAAsD;QACtD,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC,GAAG,CAAC;QACtB,CAAC;QAED,IAAI,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;YAC5D,OAAO,SAAS,CAAC,GAAG,CAAC;QACtB,CAAC;QAED,IACC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACnD,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAC5C,CAAC;YACF,YAAY;YACZ,OAAO,SAAS,CAAC,GAAG,CAAC;QACtB,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACJ,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC3C,OAAO,SAAS,CAAC,IAAI,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,SAAS,CAAC,SAAS,CAAC;YAC5B,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,gBAAgB,CAAC,QAA4B;QAC1D,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAmC;YAC9C,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,KAAK;YAC5B,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK;YAC9B,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI;YAC5B,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI;YAC1B,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM;YAC/B,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,aAAa;YACtC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ;YAC5B,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,KAAK;YACjC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM;YAC5B,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM;YAC3B,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM;YAC9B,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM;YAC3B,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM;YAC3B,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,QAAQ;YAC/B,CAAC,SAAS,CAAC,0BAA0B,CAAC,EAAE,QAAQ;YAChD,CAAC,SAAS,CAAC,4BAA4B,CAAC,EAAE,QAAQ;YAClD,CAAC,SAAS,CAAC,uBAAuB,CAAC,EAAE,KAAK;YAC1C,CAAC,SAAS,CAAC,yBAAyB,CAAC,EAAE,KAAK;YAC5C,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM;YAC7B,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM;YAC9B,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM;YAC3B,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM;YAC9B,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,KAAK;YACjC,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,KAAK;YACpC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK;YAC9B,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK;YACxB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK;YACvB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO;YAC1B,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,KAAK;YAC3B,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM;YAC7B,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,KAAK;YAC3B,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK;YACvB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,KAAK;YAC3B,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,KAAK;SAC5B,CAAC;QAEF,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED;;;;;;;OAOG;IACK,MAAM,CAAC,UAAU,CAAC,IAAgB,EAAE,KAAe,EAAE,WAAW,GAAG,CAAC;QAC3E,IAAI,IAAI,CAAC,MAAM,GAAG,WAAW,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC;QACd,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,OAAO,KAAK,CAAC;YACd,CAAC;QACF,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;;OAOG;IACK,MAAM,CAAC,SAAS,CAAC,IAAgB,EAAE,KAAe,EAAE,WAAW,GAAG,CAAC;QAC1E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxB,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CACrF,CAAC;IACH,CAAC;CACD","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,73 @@
|
|
|
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
|
+
|
|
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)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
### Features
|
|
27
|
+
|
|
28
|
+
* add additional header types ([#222](https://github.com/iotaledger/twin-framework/issues/222)) ([05f01cf](https://github.com/iotaledger/twin-framework/commit/05f01cf34b7bcec561ee989f679281b1cacdf032))
|
|
29
|
+
* add context id features ([#206](https://github.com/iotaledger/twin-framework/issues/206)) ([ef0d4ee](https://github.com/iotaledger/twin-framework/commit/ef0d4ee11a4f5fc6cc6f52a4958ce905c04ee13b))
|
|
30
|
+
* add cookie helper method to web package ([#217](https://github.com/iotaledger/twin-framework/issues/217)) ([043c632](https://github.com/iotaledger/twin-framework/commit/043c63298bff96f70bdefed56b82afef42ec3f44))
|
|
31
|
+
* add header helper for common bearer support ([0c940b2](https://github.com/iotaledger/twin-framework/commit/0c940b29cccf0c3bb5b4aa8a01f1998010e44d51))
|
|
32
|
+
* add IEntitySchemaDiff and entitySchemaDiff utility ([#282](https://github.com/iotaledger/twin-framework/issues/282)) ([9d63e94](https://github.com/iotaledger/twin-framework/commit/9d63e94021ee2ffc138004ee68cf53d08a6b17f9))
|
|
33
|
+
* add jwk enc property overrides ([18b6309](https://github.com/iotaledger/twin-framework/commit/18b63092a386b56ea7fcd7e12865ac6e1b47cc1e))
|
|
34
|
+
* add Link header array support ([aff32a3](https://github.com/iotaledger/twin-framework/commit/aff32a3ff8ad3d076cade7c889444220706bfb1e))
|
|
35
|
+
* add/update http and mime types ([#229](https://github.com/iotaledger/twin-framework/issues/229)) ([d50154a](https://github.com/iotaledger/twin-framework/commit/d50154a484711b67feb42ea20a94e4415e53d392))
|
|
36
|
+
* adding link header helper ([#225](https://github.com/iotaledger/twin-framework/issues/225)) ([703c072](https://github.com/iotaledger/twin-framework/commit/703c0725aceac6b6ec0c4fa729ef832d12fb3fd7))
|
|
37
|
+
* additional http header extraction ([#262](https://github.com/iotaledger/twin-framework/issues/262)) ([124fa3f](https://github.com/iotaledger/twin-framework/commit/124fa3fdd118ed17f973d4b46842f5b7f35365c2))
|
|
38
|
+
* additional http link feature support ([b68b4cc](https://github.com/iotaledger/twin-framework/commit/b68b4cc6a6e3cf02f91e794353714e26a49fe66c))
|
|
39
|
+
* additional nameof operators ([a5aab60](https://github.com/iotaledger/twin-framework/commit/a5aab60bf66a86f1b7ff8af7c4f044cb03706d50))
|
|
40
|
+
* improve bearer creation and extraction ([b9ddd6d](https://github.com/iotaledger/twin-framework/commit/b9ddd6dae0cb558e2227f0ec5e9cd21f85957400))
|
|
41
|
+
* improve bearer creation and extraction ([29a347a](https://github.com/iotaledger/twin-framework/commit/29a347a760cb3bc5eb819112e84f1ac99430e72b))
|
|
42
|
+
* improve signatures ([cdd24be](https://github.com/iotaledger/twin-framework/commit/cdd24be6fb898d33955b6f2f93c3ddbd73582269))
|
|
43
|
+
* linting and dependency update ([676b4e9](https://github.com/iotaledger/twin-framework/commit/676b4e9d9bce158065200bbf875bb31da81d166d))
|
|
44
|
+
* locales validation ([#197](https://github.com/iotaledger/twin-framework/issues/197)) ([55fdadb](https://github.com/iotaledger/twin-framework/commit/55fdadb13595ce0047f787bd1d4135d429a99f12))
|
|
45
|
+
* timeout return type ([4b40b23](https://github.com/iotaledger/twin-framework/commit/4b40b23a7e6b073c7e96cbccc1d41ba7caed2556))
|
|
46
|
+
* typescript 6 update ([1d10f31](https://github.com/iotaledger/twin-framework/commit/1d10f31e6516ec622773f45e88af82fe749b384a))
|
|
47
|
+
* update dependencies ([4da77ab](https://github.com/iotaledger/twin-framework/commit/4da77ab30f499e52825ac5a76f51436ceb59c26e))
|
|
48
|
+
* urn and header helper extensions ([#395](https://github.com/iotaledger/twin-framework/issues/395)) ([5976756](https://github.com/iotaledger/twin-framework/commit/5976756886d22e5063671052abc4dfa04ce23a53))
|
|
49
|
+
* use body on patch verb ([28627e5](https://github.com/iotaledger/twin-framework/commit/28627e527d033d433acefe0e9fde52ba88c0d047))
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
### Bug Fixes
|
|
53
|
+
|
|
54
|
+
* ensure __decorate is defined for decorators ([103a563](https://github.com/iotaledger/twin-framework/commit/103a563ce01ebdef6240d2e590e7b026e8692684))
|
|
55
|
+
* large regex tests ([#463](https://github.com/iotaledger/twin-framework/issues/463)) ([f4a3a5c](https://github.com/iotaledger/twin-framework/commit/f4a3a5c95619abed1e16791e54e884d4ffc503a8))
|
|
56
|
+
* settle AsyncCache waiters correctly when a request resolves undefined or null ([#401](https://github.com/iotaledger/twin-framework/issues/401)) ([6ae3f8a](https://github.com/iotaledger/twin-framework/commit/6ae3f8aca688ca76d93ec3964178a3b1a8895453))
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
### Dependencies
|
|
60
|
+
|
|
61
|
+
* The following workspace dependencies were updated
|
|
62
|
+
* dependencies
|
|
63
|
+
* @twin.org/core bumped from 0.9.3-next.0 to 0.9.3-next.1
|
|
64
|
+
* @twin.org/crypto bumped from 0.9.3-next.0 to 0.9.3-next.1
|
|
65
|
+
* @twin.org/nameof bumped from 0.9.3-next.0 to 0.9.3-next.1
|
|
66
|
+
* devDependencies
|
|
67
|
+
* @twin.org/nameof-transformer bumped from 0.9.3-next.0 to 0.9.3-next.1
|
|
68
|
+
* @twin.org/nameof-vitest-plugin bumped from 0.9.3-next.0 to 0.9.3-next.1
|
|
69
|
+
* @twin.org/validate-locales bumped from 0.9.3-next.0 to 0.9.3-next.1
|
|
70
|
+
|
|
3
71
|
## [0.9.2](https://github.com/iotaledger/twin-framework/compare/web-v0.9.2...web-v0.9.2) (2026-08-24)
|
|
4
72
|
|
|
5
73
|
|
|
@@ -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.2",
|
|
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": "
|
|
18
|
-
"@twin.org/crypto": "
|
|
19
|
-
"@twin.org/nameof": "
|
|
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",
|