@twin.org/web 0.0.2-next.8 → 0.0.3-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/es/errors/fetchError.js +27 -0
  2. package/dist/es/errors/fetchError.js.map +1 -0
  3. package/dist/es/index.js +20 -0
  4. package/dist/es/index.js.map +1 -0
  5. package/dist/es/models/IFetchOptions.js +2 -0
  6. package/dist/es/models/IFetchOptions.js.map +1 -0
  7. package/dist/es/models/IHttpHeaders.js +4 -0
  8. package/dist/es/models/IHttpHeaders.js.map +1 -0
  9. package/dist/es/models/IJwk.js +2 -0
  10. package/dist/es/models/IJwk.js.map +1 -0
  11. package/dist/es/models/IJwtHeader.js +2 -0
  12. package/dist/es/models/IJwtHeader.js.map +1 -0
  13. package/dist/es/models/IJwtPayload.js +2 -0
  14. package/dist/es/models/IJwtPayload.js.map +1 -0
  15. package/dist/es/models/headerTypes.js +41 -0
  16. package/dist/es/models/headerTypes.js.map +1 -0
  17. package/dist/es/models/httpMethod.js +18 -0
  18. package/dist/es/models/httpMethod.js.map +1 -0
  19. package/dist/es/models/httpStatusCode.js +257 -0
  20. package/dist/es/models/httpStatusCode.js.map +1 -0
  21. package/dist/es/models/jwkCryptoKey.js +4 -0
  22. package/dist/es/models/jwkCryptoKey.js.map +1 -0
  23. package/dist/es/models/mimeTypes.js +101 -0
  24. package/dist/es/models/mimeTypes.js.map +1 -0
  25. package/dist/es/utils/fetchHelper.js +271 -0
  26. package/dist/es/utils/fetchHelper.js.map +1 -0
  27. package/dist/es/utils/headerHelper.js +34 -0
  28. package/dist/es/utils/headerHelper.js.map +1 -0
  29. package/dist/es/utils/jwk.js +99 -0
  30. package/dist/es/utils/jwk.js.map +1 -0
  31. package/dist/es/utils/jws.js +58 -0
  32. package/dist/es/utils/jws.js.map +1 -0
  33. package/dist/es/utils/jwt.js +243 -0
  34. package/dist/es/utils/jwt.js.map +1 -0
  35. package/dist/es/utils/mimeTypeHelper.js +144 -0
  36. package/dist/es/utils/mimeTypeHelper.js.map +1 -0
  37. package/dist/types/errors/fetchError.d.ts +1 -1
  38. package/dist/types/index.d.ts +17 -16
  39. package/dist/types/models/IFetchOptions.d.ts +1 -1
  40. package/dist/types/models/IJwk.d.ts +1 -2
  41. package/dist/types/models/IJwtHeader.d.ts +1 -2
  42. package/dist/types/models/IJwtPayload.d.ts +1 -2
  43. package/dist/types/utils/fetchHelper.d.ts +6 -2
  44. package/dist/types/utils/headerHelper.d.ts +17 -0
  45. package/dist/types/utils/jwk.d.ts +10 -4
  46. package/dist/types/utils/jws.d.ts +5 -1
  47. package/dist/types/utils/jwt.d.ts +7 -3
  48. package/docs/changelog.md +311 -0
  49. package/docs/reference/classes/FetchHelper.md +10 -2
  50. package/docs/reference/classes/HeaderHelper.md +57 -0
  51. package/docs/reference/classes/Jwk.md +27 -7
  52. package/docs/reference/classes/Jws.md +8 -0
  53. package/docs/reference/classes/Jwt.md +30 -22
  54. package/docs/reference/classes/MimeTypeHelper.md +5 -5
  55. package/docs/reference/index.md +4 -3
  56. package/docs/reference/type-aliases/IJwk.md +5 -0
  57. package/docs/reference/type-aliases/IJwtHeader.md +5 -0
  58. package/docs/reference/type-aliases/IJwtPayload.md +5 -0
  59. package/locales/.validate-ignore +1 -0
  60. package/locales/en.json +3 -2
  61. package/package.json +25 -12
  62. package/dist/cjs/index.cjs +0 -1269
  63. package/dist/esm/index.mjs +0 -1258
  64. package/docs/reference/interfaces/IJwk.md +0 -7
  65. package/docs/reference/interfaces/IJwtHeader.md +0 -13
  66. package/docs/reference/interfaces/IJwtPayload.md +0 -13
@@ -0,0 +1,243 @@
1
+ // Copyright 2024 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ import { Converter, GeneralError, Guards, Is, ObjectHelper } from "@twin.org/core";
4
+ import { Ed25519 } from "@twin.org/crypto";
5
+ import { jwtVerify, SignJWT } from "jose";
6
+ /**
7
+ * Class to handle JSON Web Tokens.
8
+ */
9
+ export class Jwt {
10
+ /**
11
+ * Runtime name for the class.
12
+ */
13
+ static CLASS_NAME = "Jwt";
14
+ /**
15
+ * Encode a token.
16
+ * @param header The header to encode.
17
+ * @param payload The payload to encode.
18
+ * @param key The key for signing the token, can be omitted if a signer is provided.
19
+ * @returns The encoded token.
20
+ */
21
+ static async encode(header, payload, key) {
22
+ Guards.object(Jwt.CLASS_NAME, "header", header);
23
+ Guards.object(Jwt.CLASS_NAME, "payload", payload);
24
+ Guards.defined(Jwt.CLASS_NAME, "key", key);
25
+ return Jwt.internalEncode(header, payload, key);
26
+ }
27
+ /**
28
+ * Encode a token.
29
+ * @param header The header to encode.
30
+ * @param payload The payload to encode.
31
+ * @param signer Custom signer method.
32
+ * @returns The encoded token.
33
+ */
34
+ static async encodeWithSigner(header, payload, signer) {
35
+ Guards.object(Jwt.CLASS_NAME, "header", header);
36
+ Guards.stringValue(Jwt.CLASS_NAME, "header.alg", header.alg);
37
+ Guards.object(Jwt.CLASS_NAME, "payload", payload);
38
+ Guards.function(Jwt.CLASS_NAME, "signer", signer);
39
+ return Jwt.internalEncode(header, payload, undefined, signer);
40
+ }
41
+ /**
42
+ * Decode a token.
43
+ * @param token The token to decode.
44
+ * @returns The decoded payload.
45
+ */
46
+ static async decode(token) {
47
+ Guards.stringValue(Jwt.CLASS_NAME, "token", token);
48
+ let header;
49
+ let payload;
50
+ let signature;
51
+ const segments = token.split(".");
52
+ if (segments.length > 0) {
53
+ try {
54
+ const bytesHeader = Converter.base64UrlToBytes(segments[0]);
55
+ header = JSON.parse(Converter.bytesToUtf8(bytesHeader));
56
+ }
57
+ catch { }
58
+ }
59
+ if (segments.length > 1) {
60
+ try {
61
+ const bytesPayload = Converter.base64UrlToBytes(segments[1]);
62
+ payload = JSON.parse(Converter.bytesToUtf8(bytesPayload));
63
+ }
64
+ catch { }
65
+ }
66
+ if (segments.length > 2) {
67
+ signature = Converter.base64UrlToBytes(segments[2]);
68
+ }
69
+ return {
70
+ header,
71
+ payload,
72
+ signature
73
+ };
74
+ }
75
+ /**
76
+ * Verify a token.
77
+ * @param token The token to verify.
78
+ * @param key The key for verifying the token
79
+ * @returns The decoded payload.
80
+ */
81
+ static async verify(token, key) {
82
+ Guards.stringValue(Jwt.CLASS_NAME, "token", token);
83
+ Guards.defined(Jwt.CLASS_NAME, "key", key);
84
+ return Jwt.verifySignature(token, key);
85
+ }
86
+ /**
87
+ * Verify a token.
88
+ * @param token The token to verify.
89
+ * @param verifier Custom verification method.
90
+ * @returns The decoded payload.
91
+ */
92
+ static async verifyWithVerifier(token, verifier) {
93
+ Guards.stringValue(Jwt.CLASS_NAME, "token", token);
94
+ Guards.function(Jwt.CLASS_NAME, "verifier", verifier);
95
+ return Jwt.verifySignature(token, undefined, verifier);
96
+ }
97
+ /**
98
+ * Verify a token by parts.
99
+ * @param token The token to verify.
100
+ * @param key The key for verifying the token, if not provided no verification occurs.
101
+ * @param verifier Custom verification method.
102
+ * @returns True if the parts are verified.
103
+ */
104
+ static async verifySignature(token, key, verifier) {
105
+ Guards.stringValue(Jwt.CLASS_NAME, "token", token);
106
+ const hasKey = Is.notEmpty(key);
107
+ const hasVerifier = Is.notEmpty(verifier);
108
+ if (!hasKey && !hasVerifier) {
109
+ throw new GeneralError(Jwt.CLASS_NAME, "noKeyOrVerifier");
110
+ }
111
+ verifier ??= async (t, k) => Jwt.defaultVerifier(t, k);
112
+ return verifier(token, key);
113
+ }
114
+ /**
115
+ * The default signer for the JWT.
116
+ * @param header The header to sign.
117
+ * @param payload The payload to sign.
118
+ * @param key The optional key to sign with.
119
+ * @returns The signature.
120
+ */
121
+ static async defaultSigner(header, payload, key) {
122
+ Guards.object(Jwt.CLASS_NAME, "header", header);
123
+ Guards.object(Jwt.CLASS_NAME, "payload", payload);
124
+ Guards.defined(Jwt.CLASS_NAME, "key", key);
125
+ const signer = new SignJWT(payload);
126
+ signer.setProtectedHeader(header);
127
+ let finalKey = key;
128
+ if (header.alg === "EdDSA" && Is.uint8Array(key)) {
129
+ // Jose does not support Ed25519 keys in raw format, so we need to convert it to PKCS8.
130
+ finalKey = await Ed25519.privateKeyToPkcs8(key);
131
+ }
132
+ return signer.sign(finalKey);
133
+ }
134
+ /**
135
+ * The default verifier for the JWT.
136
+ * @param token The token to verify.
137
+ * @param key The key to verify with.
138
+ * @returns The header and payload if verification successful.
139
+ */
140
+ static async defaultVerifier(token, key) {
141
+ Guards.stringValue(Jwt.CLASS_NAME, "token", token);
142
+ Guards.defined(Jwt.CLASS_NAME, "key", key);
143
+ try {
144
+ const result = await jwtVerify(token, key);
145
+ return {
146
+ header: result.protectedHeader,
147
+ payload: result.payload
148
+ };
149
+ }
150
+ catch (err) {
151
+ throw new GeneralError(Jwt.CLASS_NAME, "verifyFailed", undefined, err);
152
+ }
153
+ }
154
+ /**
155
+ * Create bytes for signing from header and payload.
156
+ * @param header The header.
157
+ * @param payload The payload.
158
+ * @returns The bytes to sign.
159
+ */
160
+ static toSigningBytes(header, payload) {
161
+ Guards.object(Jwt.CLASS_NAME, "header", header);
162
+ Guards.object(Jwt.CLASS_NAME, "payload", payload);
163
+ const segments = [];
164
+ const headerBytes = Converter.utf8ToBytes(JSON.stringify(header));
165
+ segments.push(Converter.bytesToBase64Url(headerBytes));
166
+ const payloadBytes = Converter.utf8ToBytes(JSON.stringify(payload));
167
+ segments.push(Converter.bytesToBase64Url(payloadBytes));
168
+ return Converter.utf8ToBytes(segments.join("."));
169
+ }
170
+ /**
171
+ * Create header and payload from signing bytes.
172
+ * @param signingBytes The signing bytes from a token.
173
+ * @returns The header and payload.
174
+ * @throws If the signing bytes are invalid
175
+ */
176
+ static fromSigningBytes(signingBytes) {
177
+ Guards.uint8Array(Jwt.CLASS_NAME, "signingBytes", signingBytes);
178
+ const segments = Converter.bytesToUtf8(signingBytes).split(".");
179
+ if (segments.length !== 2) {
180
+ throw new GeneralError(Jwt.CLASS_NAME, "invalidSigningBytes");
181
+ }
182
+ const headerBytes = Converter.base64UrlToBytes(segments[0]);
183
+ const payloadBytes = Converter.base64UrlToBytes(segments[1]);
184
+ return {
185
+ header: ObjectHelper.fromBytes(headerBytes),
186
+ payload: ObjectHelper.fromBytes(payloadBytes)
187
+ };
188
+ }
189
+ /**
190
+ * Convert signed bytes and signature bytes to token.
191
+ * @param signingBytes The signed bytes.
192
+ * @param signature The signature.
193
+ * @returns The token.
194
+ */
195
+ static tokenFromBytes(signingBytes, signature) {
196
+ Guards.uint8Array(Jwt.CLASS_NAME, "signingBytes", signingBytes);
197
+ Guards.uint8Array(Jwt.CLASS_NAME, "signature", signature);
198
+ const signedBytesUtf8 = Converter.bytesToUtf8(signingBytes);
199
+ const signatureBase64 = Converter.bytesToBase64Url(signature);
200
+ return `${signedBytesUtf8}.${signatureBase64}`;
201
+ }
202
+ /**
203
+ * Convert the token to signing bytes and signature bytes.
204
+ * @param token The token to convert to bytes.
205
+ * @returns The decoded bytes.
206
+ * @throws If the token is invalid.
207
+ */
208
+ static tokenToBytes(token) {
209
+ Guards.stringValue(Jwt.CLASS_NAME, "token", token);
210
+ const segments = token.split(".");
211
+ if (segments.length !== 3) {
212
+ throw new GeneralError(Jwt.CLASS_NAME, "invalidTokenParts");
213
+ }
214
+ const signingBytes = Converter.utf8ToBytes(`${segments[0]}.${segments[1]}`);
215
+ const signature = Converter.base64UrlToBytes(segments[2]);
216
+ return {
217
+ signingBytes,
218
+ signature
219
+ };
220
+ }
221
+ /**
222
+ * Encode a token.
223
+ * @param header The header to encode.
224
+ * @param payload The payload to encode.
225
+ * @param key The key for signing the token, can be omitted if a signer is provided.
226
+ * @param signer Custom signer method.
227
+ * @returns The encoded token.
228
+ * @internal
229
+ */
230
+ static async internalEncode(header, payload, key, signer) {
231
+ const hasKey = Is.notEmpty(key);
232
+ const hasSigner = Is.notEmpty(signer);
233
+ if (!hasKey && !hasSigner) {
234
+ throw new GeneralError(Jwt.CLASS_NAME, "noKeyOrSigner");
235
+ }
236
+ signer ??= async (h, p, k) => Jwt.defaultSigner(h, p, k);
237
+ if (Is.undefined(header.typ)) {
238
+ header.typ = "JWT";
239
+ }
240
+ return signer(header, payload, key);
241
+ }
242
+ }
243
+ //# sourceMappingURL=jwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../../src/utils/jwt.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Converter, GeneralError, Guards, Is, ObjectHelper } from \"@twin.org/core\";\nimport { Ed25519 } from \"@twin.org/crypto\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { jwtVerify, SignJWT } from \"jose\";\nimport type { IJwtHeader } from \"../models/IJwtHeader.js\";\nimport type { IJwtPayload } from \"../models/IJwtPayload.js\";\nimport type { JwkCryptoKey } from \"../models/jwkCryptoKey.js\";\n\n/**\n * Class to handle JSON Web Tokens.\n */\nexport class Jwt {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<Jwt>();\n\n\t/**\n\t * Encode a token.\n\t * @param header The header to encode.\n\t * @param payload The payload to encode.\n\t * @param key The key for signing the token, can be omitted if a signer is provided.\n\t * @returns The encoded token.\n\t */\n\tpublic static async encode<T extends IJwtHeader, U extends IJwtPayload>(\n\t\theader: T,\n\t\tpayload: U,\n\t\tkey: JwkCryptoKey\n\t): Promise<string> {\n\t\tGuards.object<IJwtHeader>(Jwt.CLASS_NAME, nameof(header), header);\n\t\tGuards.object<IJwtPayload>(Jwt.CLASS_NAME, nameof(payload), payload);\n\t\tGuards.defined(Jwt.CLASS_NAME, nameof(key), key);\n\n\t\treturn Jwt.internalEncode<T, U>(header, payload, key);\n\t}\n\n\t/**\n\t * Encode a token.\n\t * @param header The header to encode.\n\t * @param payload The payload to encode.\n\t * @param signer Custom signer method.\n\t * @returns The encoded token.\n\t */\n\tpublic static async encodeWithSigner<T extends IJwtHeader, U extends IJwtPayload>(\n\t\theader: T,\n\t\tpayload: U,\n\t\tsigner: (\n\t\t\theader: IJwtHeader,\n\t\t\tpayload: IJwtPayload,\n\t\t\tkey: JwkCryptoKey | undefined\n\t\t) => Promise<string>\n\t): Promise<string> {\n\t\tGuards.object<IJwtHeader>(Jwt.CLASS_NAME, nameof(header), header);\n\t\tGuards.stringValue(Jwt.CLASS_NAME, nameof(header.alg), header.alg);\n\n\t\tGuards.object<IJwtPayload>(Jwt.CLASS_NAME, nameof(payload), payload);\n\t\tGuards.function(Jwt.CLASS_NAME, nameof(signer), signer);\n\n\t\treturn Jwt.internalEncode<T, U>(header, payload, undefined, signer);\n\t}\n\n\t/**\n\t * Decode a token.\n\t * @param token The token to decode.\n\t * @returns The decoded payload.\n\t */\n\tpublic static async decode<T extends IJwtHeader, U extends IJwtPayload>(\n\t\ttoken: string\n\t): Promise<{\n\t\theader?: T;\n\t\tpayload?: U;\n\t\tsignature?: Uint8Array;\n\t}> {\n\t\tGuards.stringValue(Jwt.CLASS_NAME, nameof(token), token);\n\n\t\tlet header: T | undefined;\n\t\tlet payload: U | undefined;\n\t\tlet signature: Uint8Array | undefined;\n\n\t\tconst segments = token.split(\".\");\n\t\tif (segments.length > 0) {\n\t\t\ttry {\n\t\t\t\tconst bytesHeader = Converter.base64UrlToBytes(segments[0]);\n\t\t\t\theader = JSON.parse(Converter.bytesToUtf8(bytesHeader));\n\t\t\t} catch {}\n\t\t}\n\n\t\tif (segments.length > 1) {\n\t\t\ttry {\n\t\t\t\tconst bytesPayload = Converter.base64UrlToBytes(segments[1]);\n\t\t\t\tpayload = JSON.parse(Converter.bytesToUtf8(bytesPayload));\n\t\t\t} catch {}\n\t\t}\n\n\t\tif (segments.length > 2) {\n\t\t\tsignature = Converter.base64UrlToBytes(segments[2]);\n\t\t}\n\n\t\treturn {\n\t\t\theader,\n\t\t\tpayload,\n\t\t\tsignature\n\t\t};\n\t}\n\n\t/**\n\t * Verify a token.\n\t * @param token The token to verify.\n\t * @param key The key for verifying the token\n\t * @returns The decoded payload.\n\t */\n\tpublic static async verify<T extends IJwtHeader, U extends IJwtPayload>(\n\t\ttoken: string,\n\t\tkey: JwkCryptoKey\n\t): Promise<{\n\t\theader: T;\n\t\tpayload: U;\n\t}> {\n\t\tGuards.stringValue(Jwt.CLASS_NAME, nameof(token), token);\n\t\tGuards.defined(Jwt.CLASS_NAME, nameof(key), key);\n\n\t\treturn Jwt.verifySignature<T, U>(token, key);\n\t}\n\n\t/**\n\t * Verify a token.\n\t * @param token The token to verify.\n\t * @param verifier Custom verification method.\n\t * @returns The decoded payload.\n\t */\n\tpublic static async verifyWithVerifier<T extends IJwtHeader, U extends IJwtPayload>(\n\t\ttoken: string,\n\t\tverifier: (\n\t\t\ttoken: string,\n\t\t\tkey: JwkCryptoKey | undefined\n\t\t) => Promise<{\n\t\t\theader: T;\n\t\t\tpayload: U;\n\t\t}>\n\t): Promise<{\n\t\theader: T;\n\t\tpayload: U;\n\t}> {\n\t\tGuards.stringValue(Jwt.CLASS_NAME, nameof(token), token);\n\t\tGuards.function(Jwt.CLASS_NAME, nameof(verifier), verifier);\n\n\t\treturn Jwt.verifySignature<T, U>(token, undefined, verifier);\n\t}\n\n\t/**\n\t * Verify a token by parts.\n\t * @param token The token to verify.\n\t * @param key The key for verifying the token, if not provided no verification occurs.\n\t * @param verifier Custom verification method.\n\t * @returns True if the parts are verified.\n\t */\n\tpublic static async verifySignature<T extends IJwtHeader, U extends IJwtPayload>(\n\t\ttoken: string,\n\t\tkey?: JwkCryptoKey,\n\t\tverifier?: (\n\t\t\ttoken: string,\n\t\t\tkey: JwkCryptoKey | undefined\n\t\t) => Promise<{\n\t\t\theader: T;\n\t\t\tpayload: U;\n\t\t}>\n\t): Promise<{\n\t\theader: T;\n\t\tpayload: U;\n\t}> {\n\t\tGuards.stringValue(Jwt.CLASS_NAME, nameof(token), token);\n\t\tconst hasKey = Is.notEmpty(key);\n\t\tconst hasVerifier = Is.notEmpty(verifier);\n\t\tif (!hasKey && !hasVerifier) {\n\t\t\tthrow new GeneralError(Jwt.CLASS_NAME, \"noKeyOrVerifier\");\n\t\t}\n\n\t\tverifier ??= async (\n\t\t\tt,\n\t\t\tk\n\t\t): Promise<{\n\t\t\theader: T;\n\t\t\tpayload: U;\n\t\t}> => Jwt.defaultVerifier(t, k);\n\n\t\treturn verifier(token, key);\n\t}\n\n\t/**\n\t * The default signer for the JWT.\n\t * @param header The header to sign.\n\t * @param payload The payload to sign.\n\t * @param key The optional key to sign with.\n\t * @returns The signature.\n\t */\n\tpublic static async defaultSigner(\n\t\theader: IJwtHeader,\n\t\tpayload: IJwtPayload,\n\t\tkey: JwkCryptoKey | undefined\n\t): Promise<string> {\n\t\tGuards.object(Jwt.CLASS_NAME, nameof(header), header);\n\t\tGuards.object(Jwt.CLASS_NAME, nameof(payload), payload);\n\t\tGuards.defined(Jwt.CLASS_NAME, nameof(key), key);\n\n\t\tconst signer = new SignJWT(payload);\n\t\tsigner.setProtectedHeader(header);\n\n\t\tlet finalKey = key;\n\t\tif (header.alg === \"EdDSA\" && Is.uint8Array(key)) {\n\t\t\t// Jose does not support Ed25519 keys in raw format, so we need to convert it to PKCS8.\n\t\t\tfinalKey = await Ed25519.privateKeyToPkcs8(key);\n\t\t}\n\t\treturn signer.sign(finalKey);\n\t}\n\n\t/**\n\t * The default verifier for the JWT.\n\t * @param token The token to verify.\n\t * @param key The key to verify with.\n\t * @returns The header and payload if verification successful.\n\t */\n\tpublic static async defaultVerifier<T extends IJwtHeader, U extends IJwtPayload>(\n\t\ttoken: string,\n\t\tkey: JwkCryptoKey | undefined\n\t): Promise<{\n\t\theader: T;\n\t\tpayload: U;\n\t}> {\n\t\tGuards.stringValue(Jwt.CLASS_NAME, nameof(token), token);\n\t\tGuards.defined(Jwt.CLASS_NAME, nameof(key), key);\n\n\t\ttry {\n\t\t\tconst result = await jwtVerify(token, key);\n\t\t\treturn {\n\t\t\t\theader: result.protectedHeader as T,\n\t\t\t\tpayload: result.payload as U\n\t\t\t};\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(Jwt.CLASS_NAME, \"verifyFailed\", undefined, err);\n\t\t}\n\t}\n\n\t/**\n\t * Create bytes for signing from header and payload.\n\t * @param header The header.\n\t * @param payload The payload.\n\t * @returns The bytes to sign.\n\t */\n\tpublic static toSigningBytes<T extends IJwtHeader, U extends IJwtPayload>(\n\t\theader: T,\n\t\tpayload: U\n\t): Uint8Array {\n\t\tGuards.object<T>(Jwt.CLASS_NAME, nameof(header), header);\n\t\tGuards.object<U>(Jwt.CLASS_NAME, nameof(payload), payload);\n\n\t\tconst segments: string[] = [];\n\n\t\tconst headerBytes = Converter.utf8ToBytes(JSON.stringify(header));\n\t\tsegments.push(Converter.bytesToBase64Url(headerBytes));\n\n\t\tconst payloadBytes = Converter.utf8ToBytes(JSON.stringify(payload));\n\t\tsegments.push(Converter.bytesToBase64Url(payloadBytes));\n\n\t\treturn Converter.utf8ToBytes(segments.join(\".\"));\n\t}\n\n\t/**\n\t * Create header and payload from signing bytes.\n\t * @param signingBytes The signing bytes from a token.\n\t * @returns The header and payload.\n\t * @throws If the signing bytes are invalid\n\t */\n\tpublic static fromSigningBytes<T extends IJwtHeader, U extends IJwtPayload>(\n\t\tsigningBytes: Uint8Array\n\t): {\n\t\theader: T;\n\t\tpayload: U;\n\t} {\n\t\tGuards.uint8Array(Jwt.CLASS_NAME, nameof(signingBytes), signingBytes);\n\n\t\tconst segments = Converter.bytesToUtf8(signingBytes).split(\".\");\n\t\tif (segments.length !== 2) {\n\t\t\tthrow new GeneralError(Jwt.CLASS_NAME, \"invalidSigningBytes\");\n\t\t}\n\n\t\tconst headerBytes = Converter.base64UrlToBytes(segments[0]);\n\t\tconst payloadBytes = Converter.base64UrlToBytes(segments[1]);\n\n\t\treturn {\n\t\t\theader: ObjectHelper.fromBytes<T>(headerBytes),\n\t\t\tpayload: ObjectHelper.fromBytes<U>(payloadBytes)\n\t\t};\n\t}\n\n\t/**\n\t * Convert signed bytes and signature bytes to token.\n\t * @param signingBytes The signed bytes.\n\t * @param signature The signature.\n\t * @returns The token.\n\t */\n\tpublic static tokenFromBytes(signingBytes: Uint8Array, signature: Uint8Array): string {\n\t\tGuards.uint8Array(Jwt.CLASS_NAME, nameof(signingBytes), signingBytes);\n\t\tGuards.uint8Array(Jwt.CLASS_NAME, nameof(signature), signature);\n\t\tconst signedBytesUtf8 = Converter.bytesToUtf8(signingBytes);\n\t\tconst signatureBase64 = Converter.bytesToBase64Url(signature);\n\t\treturn `${signedBytesUtf8}.${signatureBase64}`;\n\t}\n\n\t/**\n\t * Convert the token to signing bytes and signature bytes.\n\t * @param token The token to convert to bytes.\n\t * @returns The decoded bytes.\n\t * @throws If the token is invalid.\n\t */\n\tpublic static tokenToBytes(token: string): {\n\t\tsigningBytes: Uint8Array;\n\t\tsignature: Uint8Array;\n\t} {\n\t\tGuards.stringValue(Jwt.CLASS_NAME, nameof(token), token);\n\n\t\tconst segments: string[] = token.split(\".\");\n\n\t\tif (segments.length !== 3) {\n\t\t\tthrow new GeneralError(Jwt.CLASS_NAME, \"invalidTokenParts\");\n\t\t}\n\n\t\tconst signingBytes = Converter.utf8ToBytes(`${segments[0]}.${segments[1]}`);\n\t\tconst signature = Converter.base64UrlToBytes(segments[2]);\n\n\t\treturn {\n\t\t\tsigningBytes,\n\t\t\tsignature\n\t\t};\n\t}\n\n\t/**\n\t * Encode a token.\n\t * @param header The header to encode.\n\t * @param payload The payload to encode.\n\t * @param key The key for signing the token, can be omitted if a signer is provided.\n\t * @param signer Custom signer method.\n\t * @returns The encoded token.\n\t * @internal\n\t */\n\tprivate static async internalEncode<T extends IJwtHeader, U extends IJwtPayload>(\n\t\theader: T,\n\t\tpayload: U,\n\t\tkey?: JwkCryptoKey,\n\t\tsigner?: (\n\t\t\theader: IJwtHeader,\n\t\t\tpayload: IJwtPayload,\n\t\t\tkey: JwkCryptoKey | undefined\n\t\t) => Promise<string>\n\t): Promise<string> {\n\t\tconst hasKey = Is.notEmpty(key);\n\t\tconst hasSigner = Is.notEmpty(signer);\n\t\tif (!hasKey && !hasSigner) {\n\t\t\tthrow new GeneralError(Jwt.CLASS_NAME, \"noKeyOrSigner\");\n\t\t}\n\n\t\tsigner ??= async (h, p, k): Promise<string> => Jwt.defaultSigner(h, p, k);\n\n\t\tif (Is.undefined(header.typ)) {\n\t\t\theader.typ = \"JWT\";\n\t\t}\n\n\t\treturn signer(header, payload, key);\n\t}\n}\n"]}
@@ -0,0 +1,144 @@
1
+ // Copyright 2024 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ import { Converter, Is, StringHelper } from "@twin.org/core";
4
+ import { MimeTypes } from "../models/mimeTypes.js";
5
+ /**
6
+ * Class to help with mime types.
7
+ */
8
+ export class MimeTypeHelper {
9
+ /**
10
+ * Detect the mime type from a byte array.
11
+ * @param data The data to test.
12
+ * @returns The mime type if detected.
13
+ */
14
+ static async detect(data) {
15
+ if (!Is.uint8Array(data) || data.length === 0) {
16
+ return undefined;
17
+ }
18
+ // Image
19
+ if (MimeTypeHelper.checkBytes(data, [0x47, 0x49, 0x46])) {
20
+ return MimeTypes.Gif;
21
+ }
22
+ if (MimeTypeHelper.checkBytes(data, [0x42, 0x4d])) {
23
+ return MimeTypes.Bmp;
24
+ }
25
+ if (MimeTypeHelper.checkBytes(data, [0xff, 0xd8, 0xff])) {
26
+ return MimeTypes.Jpeg;
27
+ }
28
+ if (MimeTypeHelper.checkBytes(data, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) {
29
+ return MimeTypes.Png;
30
+ }
31
+ if (MimeTypeHelper.checkBytes(data, [0x49, 0x49, 0x2a, 0x00]) ||
32
+ MimeTypeHelper.checkBytes(data, [0x4d, 0x4d, 0x00, 0x2a])) {
33
+ return MimeTypes.Tiff;
34
+ }
35
+ // Compression
36
+ if (MimeTypeHelper.checkBytes(data, [0x1f, 0x8b, 0x8])) {
37
+ return MimeTypes.Gzip;
38
+ }
39
+ if (MimeTypeHelper.checkBytes(data, [0x78, 0x01]) ||
40
+ MimeTypeHelper.checkBytes(data, [0x78, 0x9c]) ||
41
+ MimeTypeHelper.checkBytes(data, [0x78, 0xda])) {
42
+ return MimeTypes.Zlib;
43
+ }
44
+ if (MimeTypeHelper.checkBytes(data, [0x42, 0x5a, 0x68])) {
45
+ return MimeTypes.Bzip2;
46
+ }
47
+ if (MimeTypeHelper.checkBytes(data, [0x50, 0x4b, 0x3, 0x4])) {
48
+ return MimeTypes.Zip;
49
+ }
50
+ // Documents
51
+ if (MimeTypeHelper.checkText(data, ["%PDF"])) {
52
+ return MimeTypes.Pdf;
53
+ }
54
+ // Lookup svg before xml, as svg are xml files as well
55
+ const asText = Converter.bytesToUtf8(data);
56
+ if (asText.includes("<svg")) {
57
+ return MimeTypes.Svg;
58
+ }
59
+ if (MimeTypeHelper.checkText(data, ["<?xml ", "<message"])) {
60
+ return MimeTypes.Xml;
61
+ }
62
+ if (MimeTypeHelper.checkBytes(data, [0xef, 0xbb, 0xbf]) &&
63
+ MimeTypeHelper.checkText(data, ["<?xml "], 3)) {
64
+ // UTF-8-BOM
65
+ return MimeTypes.Xml;
66
+ }
67
+ if (StringHelper.isUtf8(data)) {
68
+ try {
69
+ JSON.parse(new TextDecoder().decode(data));
70
+ return MimeTypes.Json;
71
+ }
72
+ catch {
73
+ return MimeTypes.PlainText;
74
+ }
75
+ }
76
+ }
77
+ /**
78
+ * Return the default extension for a mime type.
79
+ * @param mimeType The mimetype to get the extension for.
80
+ * @returns The extension for the mime type.
81
+ */
82
+ static defaultExtension(mimeType) {
83
+ if (!Is.stringValue(mimeType)) {
84
+ return undefined;
85
+ }
86
+ const lookup = {
87
+ [MimeTypes.PlainText]: "txt",
88
+ [MimeTypes.Html]: "html",
89
+ [MimeTypes.Javascript]: "js",
90
+ [MimeTypes.Json]: "json",
91
+ [MimeTypes.JsonLd]: "jsonld",
92
+ [MimeTypes.Jwt]: "jwt",
93
+ [MimeTypes.Xml]: "xml",
94
+ [MimeTypes.OctetStream]: "bin",
95
+ [MimeTypes.Gzip]: "gzip",
96
+ [MimeTypes.Zlib]: "zlib",
97
+ [MimeTypes.Bzip2]: "bz2",
98
+ [MimeTypes.Zip]: "zip",
99
+ [MimeTypes.Pdf]: "pdf",
100
+ [MimeTypes.Gif]: "gif",
101
+ [MimeTypes.Bmp]: "bmp",
102
+ [MimeTypes.Jpeg]: "jpeg",
103
+ [MimeTypes.Png]: "png",
104
+ [MimeTypes.Tiff]: "tif",
105
+ [MimeTypes.Svg]: "svg",
106
+ [MimeTypes.WebP]: "webp",
107
+ [MimeTypes.Mp4]: "mp4",
108
+ [MimeTypes.Mpeg]: "mpg",
109
+ [MimeTypes.Webm]: "webm"
110
+ };
111
+ return lookup[mimeType];
112
+ }
113
+ /**
114
+ * Check if the bytes match.
115
+ * @param data The data to look at.
116
+ * @param bytes The bytes to try and match.
117
+ * @param startOffset Start offset in the data.
118
+ * @returns True if the bytes match.
119
+ * @internal
120
+ */
121
+ static checkBytes(data, bytes, startOffset = 0) {
122
+ if (data.length - startOffset < bytes.length) {
123
+ return false;
124
+ }
125
+ for (let i = 0; i < bytes.length; i++) {
126
+ if (data[i + startOffset] !== bytes[i]) {
127
+ return false;
128
+ }
129
+ }
130
+ return true;
131
+ }
132
+ /**
133
+ * Check if the text matches.
134
+ * @param data The data to look at.
135
+ * @param texts The text to try and match.
136
+ * @param startOffset Start offset in the data.
137
+ * @returns True if the bytes match.
138
+ * @internal
139
+ */
140
+ static checkText(data, texts, startOffset = 0) {
141
+ return texts.some(text => MimeTypeHelper.checkBytes(data, Array.from(Converter.utf8ToBytes(text)), startOffset));
142
+ }
143
+ }
144
+ //# sourceMappingURL=mimeTypeHelper.js.map
@@ -0,0 +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,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI;YAC5B,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ;YAC5B,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,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,IAAI,CAAC,EAAE,MAAM;YACxB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK;YACtB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK;YACvB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM;SACxB,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.Html]: \"html\",\n\t\t\t[MimeTypes.Javascript]: \"js\",\n\t\t\t[MimeTypes.Json]: \"json\",\n\t\t\t[MimeTypes.JsonLd]: \"jsonld\",\n\t\t\t[MimeTypes.Jwt]: \"jwt\",\n\t\t\t[MimeTypes.Xml]: \"xml\",\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.WebP]: \"webp\",\n\t\t\t[MimeTypes.Mp4]: \"mp4\",\n\t\t\t[MimeTypes.Mpeg]: \"mpg\",\n\t\t\t[MimeTypes.Webm]: \"webm\"\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,5 +1,5 @@
1
1
  import { BaseError } from "@twin.org/core";
2
- import type { HttpStatusCode } from "../models/httpStatusCode";
2
+ import type { HttpStatusCode } from "../models/httpStatusCode.js";
3
3
  /**
4
4
  * Class to represent errors from fetch.
5
5
  */
@@ -1,16 +1,17 @@
1
- export * from "./errors/fetchError";
2
- export * from "./models/headerTypes";
3
- export * from "./models/httpMethod";
4
- export * from "./models/httpStatusCode";
5
- export * from "./models/IFetchOptions";
6
- export * from "./models/IHttpHeaders";
7
- export * from "./models/IJwk";
8
- export * from "./models/IJwtHeader";
9
- export * from "./models/IJwtPayload";
10
- export * from "./models/jwkCryptoKey";
11
- export * from "./models/mimeTypes";
12
- export * from "./utils/fetchHelper";
13
- export * from "./utils/jwk";
14
- export * from "./utils/jws";
15
- export * from "./utils/jwt";
16
- export * from "./utils/mimeTypeHelper";
1
+ export * from "./errors/fetchError.js";
2
+ export * from "./models/headerTypes.js";
3
+ export * from "./models/httpMethod.js";
4
+ export * from "./models/httpStatusCode.js";
5
+ export * from "./models/IFetchOptions.js";
6
+ export * from "./models/IHttpHeaders.js";
7
+ export * from "./models/IJwk.js";
8
+ export * from "./models/IJwtHeader.js";
9
+ export * from "./models/IJwtPayload.js";
10
+ export * from "./models/jwkCryptoKey.js";
11
+ export * from "./models/mimeTypes.js";
12
+ export * from "./utils/fetchHelper.js";
13
+ export * from "./utils/headerHelper.js";
14
+ export * from "./utils/jwk.js";
15
+ export * from "./utils/jws.js";
16
+ export * from "./utils/jwt.js";
17
+ export * from "./utils/mimeTypeHelper.js";
@@ -1,4 +1,4 @@
1
- import type { IHttpHeaders } from "./IHttpHeaders";
1
+ import type { IHttpHeaders } from "./IHttpHeaders.js";
2
2
  /**
3
3
  * Options for call to the fetch helper.
4
4
  */
@@ -2,5 +2,4 @@ import type { JWK } from "jose";
2
2
  /**
3
3
  * The fields in a JSON Web Key.
4
4
  */
5
- export interface IJwk extends JWK {
6
- }
5
+ export type IJwk = JWK;
@@ -2,5 +2,4 @@ import type { JWTHeaderParameters } from "jose";
2
2
  /**
3
3
  * The fields in a JSON Web Token header.
4
4
  */
5
- export interface IJwtHeader extends JWTHeaderParameters {
6
- }
5
+ export type IJwtHeader = JWTHeaderParameters;
@@ -2,5 +2,4 @@ import type { JWTPayload } from "jose";
2
2
  /**
3
3
  * The fields in a JSON Web Token payload.
4
4
  */
5
- export interface IJwtPayload extends JWTPayload {
6
- }
5
+ export type IJwtPayload = JWTPayload;
@@ -1,9 +1,13 @@
1
- import { HttpMethod } from "../models/httpMethod";
2
- import type { IFetchOptions } from "../models/IFetchOptions";
1
+ import { HttpMethod } from "../models/httpMethod.js";
2
+ import type { IFetchOptions } from "../models/IFetchOptions.js";
3
3
  /**
4
4
  * Class to helper with fetch operations.
5
5
  */
6
6
  export declare class FetchHelper {
7
+ /**
8
+ * Runtime name for the class.
9
+ */
10
+ static readonly CLASS_NAME: string;
7
11
  /**
8
12
  * Perform a fetch request.
9
13
  * @param source The source for the request.
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Class to helper with header operations.
3
+ */
4
+ export declare class HeaderHelper {
5
+ /**
6
+ * Create a bearer token header.
7
+ * @param token The token to create the header for.
8
+ * @returns The bearer token header.
9
+ */
10
+ static createBearer(token: unknown): string;
11
+ /**
12
+ * Extract the bearer token from a header.
13
+ * @param header The header value to extract the token from.
14
+ * @returns The extracted token if it exists.
15
+ */
16
+ static extractBearer(header: unknown): string;
17
+ }
@@ -1,9 +1,13 @@
1
- import type { IJwk } from "../models/IJwk";
2
- import type { JwkCryptoKey } from "../models/jwkCryptoKey";
1
+ import type { IJwk } from "../models/IJwk.js";
2
+ import type { JwkCryptoKey } from "../models/jwkCryptoKey.js";
3
3
  /**
4
4
  * Class to handle JSON Web Keys.
5
5
  */
6
6
  export declare class Jwk {
7
+ /**
8
+ * Runtime name for the class.
9
+ */
10
+ static readonly CLASS_NAME: string;
7
11
  /**
8
12
  * Convert the JWK to a crypto key.
9
13
  * @param jwk The JWK to convert.
@@ -14,15 +18,17 @@ export declare class Jwk {
14
18
  /**
15
19
  * Convert the Ed25519 private key to a crypto key.
16
20
  * @param privateKey The private key to use.
21
+ * @param overrideUse Optional override for the use property, defaults to "sig".
17
22
  * @returns The crypto key.
18
23
  */
19
- static fromEd25519Private(privateKey: Uint8Array): Promise<IJwk>;
24
+ static fromEd25519Private(privateKey: Uint8Array, overrideUse?: "enc" | "sig" | string): Promise<IJwk>;
20
25
  /**
21
26
  * Convert the Ed25519 public key to a crypto key.
22
27
  * @param publicKey The private key to use.
28
+ * @param overrideUse Optional override for the use property, defaults to "sig".
23
29
  * @returns The crypto key.
24
30
  */
25
- static fromEd25519Public(publicKey: Uint8Array): Promise<IJwk>;
31
+ static fromEd25519Public(publicKey: Uint8Array, overrideUse?: "enc" | "sig" | string): Promise<IJwk>;
26
32
  /**
27
33
  * Convert the JWK to raw keys.
28
34
  * @param jwk The JWK to convert to raw.
@@ -1,8 +1,12 @@
1
- import type { JwkCryptoKey } from "../models/jwkCryptoKey";
1
+ import type { JwkCryptoKey } from "../models/jwkCryptoKey.js";
2
2
  /**
3
3
  * Class to handle JSON Web Signatures.
4
4
  */
5
5
  export declare class Jws {
6
+ /**
7
+ * Runtime name for the class.
8
+ */
9
+ static readonly CLASS_NAME: string;
6
10
  /**
7
11
  * Create a signature.
8
12
  * @param privateKey The private key to use.
@@ -1,10 +1,14 @@
1
- import type { IJwtHeader } from "../models/IJwtHeader";
2
- import type { IJwtPayload } from "../models/IJwtPayload";
3
- import type { JwkCryptoKey } from "../models/jwkCryptoKey";
1
+ import type { IJwtHeader } from "../models/IJwtHeader.js";
2
+ import type { IJwtPayload } from "../models/IJwtPayload.js";
3
+ import type { JwkCryptoKey } from "../models/jwkCryptoKey.js";
4
4
  /**
5
5
  * Class to handle JSON Web Tokens.
6
6
  */
7
7
  export declare class Jwt {
8
+ /**
9
+ * Runtime name for the class.
10
+ */
11
+ static readonly CLASS_NAME: string;
8
12
  /**
9
13
  * Encode a token.
10
14
  * @param header The header to encode.