@twin.org/web 0.9.1 → 0.9.2-next.10

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.
@@ -1 +1 @@
1
- {"version":3,"file":"fetchHelper.js","sourceRoot":"","sources":["../../../src/utils/fetchHelper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { AsyncCache, BaseError, Guards, Is, ObjectHelper, type IError } from \"@twin.org/core\";\nimport { nameof, nameofCamelCase } from \"@twin.org/nameof\";\nimport { FetchError } from \"../errors/fetchError.js\";\nimport { HeaderTypes } from \"../models/headerTypes.js\";\nimport { HttpMethod } from \"../models/httpMethod.js\";\nimport { HttpStatusCode } from \"../models/httpStatusCode.js\";\nimport type { IFetchOptions } from \"../models/IFetchOptions.js\";\nimport type { IHttpHeaders } from \"../models/IHttpHeaders.js\";\nimport { MimeTypes } from \"../models/mimeTypes.js\";\n\n/**\n * Class to helper with fetch operations.\n */\nexport class FetchHelper {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<FetchHelper>();\n\n\t/**\n\t * Prefix to use for cache entries.\n\t * @internal\n\t */\n\tprivate static readonly _CACHE_PREFIX: string = \"fetch_\";\n\n\t/**\n\t * Perform a fetch request.\n\t * @param source The source for the request.\n\t * @param url The url for the request.\n\t * @param method The http method.\n\t * @param body Request to send to the endpoint.\n\t * @param options Options for sending the requests.\n\t * @returns The response.\n\t */\n\tpublic static async fetch(\n\t\tsource: string,\n\t\turl: string,\n\t\tmethod: HttpMethod,\n\t\tbody?: string | Uint8Array,\n\t\toptions?: Omit<IFetchOptions, \"cacheTtlSeconds\">\n\t): Promise<Response> {\n\t\tGuards.string(FetchHelper.CLASS_NAME, nameof(source), source);\n\t\tGuards.string(FetchHelper.CLASS_NAME, nameof(url), url);\n\t\tGuards.arrayOneOf<HttpMethod>(\n\t\t\tFetchHelper.CLASS_NAME,\n\t\t\tnameof(method),\n\t\t\tmethod,\n\t\t\tObject.values(HttpMethod)\n\t\t);\n\t\tif (!Is.undefined(body) && !Is.uint8Array(body)) {\n\t\t\tGuards.string(FetchHelper.CLASS_NAME, nameof(body), body);\n\t\t}\n\t\tif (!Is.undefined(options)) {\n\t\t\tGuards.object<IFetchOptions>(FetchHelper.CLASS_NAME, nameof(options), options);\n\t\t\tif (!Is.undefined(options.headers)) {\n\t\t\t\tGuards.object<IHttpHeaders>(\n\t\t\t\t\tFetchHelper.CLASS_NAME,\n\t\t\t\t\tnameof(options.headers),\n\t\t\t\t\toptions.headers\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!Is.undefined(options.timeoutMs)) {\n\t\t\t\tGuards.integer(FetchHelper.CLASS_NAME, nameof(options.timeoutMs), options.timeoutMs);\n\t\t\t}\n\t\t\tif (!Is.undefined(options.includeCredentials)) {\n\t\t\t\tGuards.boolean(\n\t\t\t\t\tFetchHelper.CLASS_NAME,\n\t\t\t\t\tnameof(options.includeCredentials),\n\t\t\t\t\toptions.includeCredentials\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!Is.undefined(options.retryCount)) {\n\t\t\t\tGuards.integer(FetchHelper.CLASS_NAME, nameof(options.retryCount), options.retryCount);\n\t\t\t}\n\t\t\tif (!Is.undefined(options.retryDelayMs)) {\n\t\t\t\tGuards.integer(FetchHelper.CLASS_NAME, nameof(options.retryDelayMs), options.retryDelayMs);\n\t\t\t}\n\t\t}\n\n\t\tlet controller: AbortController | undefined;\n\t\tlet timerId: number | NodeJS.Timeout | undefined;\n\t\tconst retryCount = options?.retryCount ?? 1;\n\t\tconst baseDelayMilliseconds = options?.retryDelayMs ?? 3000;\n\n\t\tlet lastError: IError | undefined;\n\t\tlet attempt;\n\t\tfor (attempt = 0; attempt < retryCount; attempt++) {\n\t\t\tif (attempt > 0) {\n\t\t\t\tconst exponentialBackoffDelay = baseDelayMilliseconds * Math.pow(2, attempt - 1);\n\t\t\t\tawait new Promise(resolve => globalThis.setTimeout(resolve, exponentialBackoffDelay));\n\t\t\t}\n\n\t\t\tif (options?.timeoutMs !== undefined) {\n\t\t\t\tcontroller = new AbortController();\n\t\t\t\ttimerId = globalThis.setTimeout(() => {\n\t\t\t\t\tif (controller) {\n\t\t\t\t\t\tcontroller.abort();\n\t\t\t\t\t}\n\t\t\t\t}, options?.timeoutMs);\n\t\t\t}\n\n\t\t\tlet finalBody;\n\t\t\tif (method === HttpMethod.POST || method === HttpMethod.PUT || method === HttpMethod.PATCH) {\n\t\t\t\tif (Is.string(body)) {\n\t\t\t\t\tfinalBody = body;\n\t\t\t\t} else if (Is.uint8Array(body)) {\n\t\t\t\t\tfinalBody = new Uint8Array(body);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst requestOptions: RequestInit = {\n\t\t\t\t\tmethod,\n\t\t\t\t\theaders: options?.headers as HeadersInit,\n\t\t\t\t\tbody: finalBody,\n\t\t\t\t\tsignal: controller ? controller.signal : undefined\n\t\t\t\t};\n\t\t\t\tif (Is.boolean(options?.includeCredentials)) {\n\t\t\t\t\trequestOptions.credentials = \"include\";\n\t\t\t\t}\n\n\t\t\t\tconst response = await fetch(url, requestOptions);\n\n\t\t\t\tif (!response.ok && retryCount > 1) {\n\t\t\t\t\tlastError = new FetchError(\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\t`${nameofCamelCase<FetchHelper>()}.general`,\n\t\t\t\t\t\t(response.status as HttpStatusCode) ?? HttpStatusCode.internalServerError,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\turl,\n\t\t\t\t\t\t\tstatusText: response.statusText\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treturn response;\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst isErr = Is.object<IError>(err);\n\t\t\t\tif (isErr && Is.stringValue(err.message) && err.message.includes(\"Failed to fetch\")) {\n\t\t\t\t\tlastError = new FetchError(\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\t`${nameofCamelCase<FetchHelper>()}.connectivity`,\n\t\t\t\t\t\tHttpStatusCode.serviceUnavailable,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\turl\n\t\t\t\t\t\t},\n\t\t\t\t\t\terr\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconst isAbort = isErr && err.name === \"AbortError\";\n\t\t\t\t\tconst props: { [id: string]: unknown } = { url };\n\t\t\t\t\tlet httpStatus: HttpStatusCode = HttpStatusCode.internalServerError;\n\t\t\t\t\tif (isAbort) {\n\t\t\t\t\t\thttpStatus = HttpStatusCode.requestTimeout;\n\t\t\t\t\t} else if (isErr && \"httpStatus\" in err) {\n\t\t\t\t\t\thttpStatus = err.httpStatus as HttpStatusCode;\n\t\t\t\t\t}\n\t\t\t\t\tif (isErr && \"statusText\" in err) {\n\t\t\t\t\t\tprops.statusText = err.statusText;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isAbort) {\n\t\t\t\t\t\tlastError = new FetchError(\n\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\t`${nameofCamelCase<FetchHelper>()}.timeout`,\n\t\t\t\t\t\t\thttpStatus,\n\t\t\t\t\t\t\tprops,\n\t\t\t\t\t\t\terr\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastError = new FetchError(\n\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\t`${nameofCamelCase<FetchHelper>()}.general`,\n\t\t\t\t\t\t\thttpStatus,\n\t\t\t\t\t\t\tprops,\n\t\t\t\t\t\t\terr\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (timerId) {\n\t\t\t\t\tglobalThis.clearTimeout(timerId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (retryCount > 1 && attempt === retryCount) {\n\t\t\tthrow new FetchError(\n\t\t\t\tsource,\n\t\t\t\t`${nameofCamelCase<FetchHelper>()}.retryLimitExceeded`,\n\t\t\t\tHttpStatusCode.internalServerError,\n\t\t\t\t{ url },\n\t\t\t\tlastError\n\t\t\t);\n\t\t}\n\n\t\tthrow lastError as Error;\n\t}\n\n\t/**\n\t * Perform a request in json format.\n\t * @param source The source for the request.\n\t * @param url The url for the request.\n\t * @param method The http method.\n\t * @param requestData Request to send to the endpoint.\n\t * @param options Options for sending the requests.\n\t * @returns The response.\n\t */\n\tpublic static async fetchJson<T, U>(\n\t\tsource: string,\n\t\turl: string,\n\t\tmethod: HttpMethod,\n\t\trequestData?: T,\n\t\toptions?: IFetchOptions\n\t): Promise<U> {\n\t\tif (Is.integer(options?.cacheTtlMs) && options.cacheTtlMs >= 0) {\n\t\t\t// The cache option is set, so call the same method again but without\n\t\t\t// the cache option to get the result and cache it.\n\t\t\tconst cacheResponse = AsyncCache.exec(\n\t\t\t\t`${FetchHelper._CACHE_PREFIX}${url}`,\n\t\t\t\toptions.cacheTtlMs,\n\t\t\t\tasync () =>\n\t\t\t\t\tFetchHelper.fetchJson<T, U>(\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tmethod,\n\t\t\t\t\t\trequestData,\n\t\t\t\t\t\tObjectHelper.omit(options, [\"cacheTtlMs\"])\n\t\t\t\t\t)\n\t\t\t);\n\n\t\t\t// If the return value is a promise return it, otherwise continue\n\t\t\t// with the regular processing.\n\t\t\tif (Is.promise(cacheResponse)) {\n\t\t\t\treturn cacheResponse;\n\t\t\t}\n\t\t}\n\n\t\toptions ??= {};\n\t\toptions.headers ??= {};\n\n\t\tif (\n\t\t\tIs.undefined(options.headers[HeaderTypes.ContentType]) &&\n\t\t\t(method === HttpMethod.POST || method === HttpMethod.PUT || method === HttpMethod.PATCH)\n\t\t) {\n\t\t\toptions.headers[HeaderTypes.ContentType] = MimeTypes.Json;\n\t\t}\n\n\t\tconst response = await FetchHelper.fetch(\n\t\t\tsource,\n\t\t\turl,\n\t\t\tmethod,\n\t\t\trequestData ? JSON.stringify(requestData) : undefined,\n\t\t\toptions\n\t\t);\n\n\t\tif (response.ok) {\n\t\t\tif (response.status === HttpStatusCode.noContent) {\n\t\t\t\treturn {} as U;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn (await response.json()) as U;\n\t\t\t} catch (err) {\n\t\t\t\tthrow new FetchError(\n\t\t\t\t\tsource,\n\t\t\t\t\t`${nameofCamelCase<FetchHelper>()}.decodingJSON`,\n\t\t\t\t\tHttpStatusCode.badRequest,\n\t\t\t\t\t{ url },\n\t\t\t\t\terr\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst errorResponseData = await response.json();\n\t\tconst errorResponse = BaseError.fromError(errorResponseData);\n\t\tconst isErrorEmpty = BaseError.isEmpty(errorResponse);\n\n\t\tthrow new FetchError(\n\t\t\tsource,\n\t\t\t`${nameofCamelCase<FetchHelper>()}.failureStatusText`,\n\t\t\tresponse.status as HttpStatusCode,\n\t\t\t{\n\t\t\t\tstatusText: response.statusText,\n\t\t\t\turl,\n\t\t\t\tdata: isErrorEmpty ? errorResponseData : undefined\n\t\t\t},\n\t\t\tisErrorEmpty ? undefined : errorResponse\n\t\t);\n\t}\n\n\t/**\n\t * Perform a request for binary data.\n\t * @param source The source for the request.\n\t * @param url The url for the request.\n\t * @param method The http method.\n\t * @param requestData Request to send to the endpoint.\n\t * @param options Options for sending the requests.\n\t * @returns The response.\n\t */\n\tpublic static async fetchBinary<T>(\n\t\tsource: string,\n\t\turl: string,\n\t\tmethod: Extract<HttpMethod, \"GET\" | \"POST\">,\n\t\trequestData?: Uint8Array,\n\t\toptions?: IFetchOptions\n\t): Promise<Uint8Array | T> {\n\t\tif (Is.integer(options?.cacheTtlMs) && options.cacheTtlMs >= 0) {\n\t\t\t// The cache option is set, so call the same method again but without\n\t\t\t// the cache option to get the result and cache it.\n\t\t\tconst cacheResponse = AsyncCache.exec(\n\t\t\t\t`${FetchHelper._CACHE_PREFIX}${url}`,\n\t\t\t\toptions.cacheTtlMs,\n\t\t\t\tasync () =>\n\t\t\t\t\tFetchHelper.fetchBinary<T>(\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tmethod,\n\t\t\t\t\t\trequestData,\n\t\t\t\t\t\tObjectHelper.omit(options, [\"cacheTtlMs\"])\n\t\t\t\t\t)\n\t\t\t);\n\n\t\t\t// If the return value is a promise return it, otherwise continue\n\t\t\t// with the regular processing.\n\t\t\tif (Is.promise(cacheResponse)) {\n\t\t\t\treturn cacheResponse;\n\t\t\t}\n\t\t}\n\n\t\toptions ??= {};\n\t\toptions.headers ??= {};\n\n\t\tif (Is.undefined(options.headers[HeaderTypes.ContentType])) {\n\t\t\toptions.headers[HeaderTypes.ContentType] = MimeTypes.OctetStream;\n\t\t}\n\n\t\tconst response = await FetchHelper.fetch(source, url, method, requestData, options);\n\n\t\tif (response.ok) {\n\t\t\tif (method === HttpMethod.GET) {\n\t\t\t\tif (response.status === HttpStatusCode.noContent) {\n\t\t\t\t\treturn new Uint8Array();\n\t\t\t\t}\n\t\t\t\treturn new Uint8Array(await response.arrayBuffer());\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn (await response.json()) as T;\n\t\t\t} catch (err) {\n\t\t\t\tthrow new FetchError(\n\t\t\t\t\tsource,\n\t\t\t\t\t`${nameofCamelCase<FetchHelper>()}.decodingJSON`,\n\t\t\t\t\tHttpStatusCode.badRequest,\n\t\t\t\t\t{ url },\n\t\t\t\t\terr\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst errorResponseData = await response.json();\n\t\tconst errorResponse = BaseError.fromError(errorResponseData);\n\t\tconst isErrorEmpty = BaseError.isEmpty(errorResponse);\n\n\t\tthrow new FetchError(\n\t\t\tsource,\n\t\t\t`${nameofCamelCase<FetchHelper>()}.failureStatusText`,\n\t\t\tresponse.status as HttpStatusCode,\n\t\t\t{\n\t\t\t\tstatusText: response.statusText,\n\t\t\t\turl,\n\t\t\t\tdata: isErrorEmpty ? errorResponseData : undefined\n\t\t\t},\n\t\t\tisErrorEmpty ? undefined : errorResponse\n\t\t);\n\t}\n\n\t/**\n\t * Clears the cache.\n\t */\n\tpublic static clearCache(): void {\n\t\tAsyncCache.clearCache(FetchHelper._CACHE_PREFIX);\n\t}\n\n\t/**\n\t * Get a cache entry.\n\t * @param url The url for the request.\n\t * @returns The cache entry if it exists.\n\t */\n\tpublic static async getCacheEntry<T>(url: string): Promise<T | undefined> {\n\t\treturn AsyncCache.get<T>(`${FetchHelper._CACHE_PREFIX}${url}`);\n\t}\n\n\t/**\n\t * Set a cache entry.\n\t * @param url The url for the request.\n\t * @param value The value to cache.\n\t * @returns The cache entry if it exists.\n\t */\n\tpublic static async setCacheEntry<T>(url: string, value: T): Promise<void> {\n\t\tawait AsyncCache.set<T>(`${FetchHelper._CACHE_PREFIX}${url}`, value);\n\t}\n\n\t/**\n\t * Remove a cache entry.\n\t * @param url The url for the request.\n\t */\n\tpublic static removeCacheEntry(url: string): void {\n\t\tAsyncCache.remove(`${FetchHelper._CACHE_PREFIX}${url}`);\n\t}\n}\n"]}
1
+ {"version":3,"file":"fetchHelper.js","sourceRoot":"","sources":["../../../src/utils/fetchHelper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { AsyncCache, BaseError, Guards, Is, ObjectHelper, type IError } from \"@twin.org/core\";\nimport { nameof, nameofCamelCase } from \"@twin.org/nameof\";\nimport { FetchError } from \"../errors/fetchError.js\";\nimport { HeaderTypes } from \"../models/headerTypes.js\";\nimport { HttpMethod } from \"../models/httpMethod.js\";\nimport { HttpStatusCode } from \"../models/httpStatusCode.js\";\nimport type { IFetchOptions } from \"../models/IFetchOptions.js\";\nimport type { IHttpHeaders } from \"../models/IHttpHeaders.js\";\nimport { MimeTypes } from \"../models/mimeTypes.js\";\n\n/**\n * Class to helper with fetch operations.\n */\nexport class FetchHelper {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<FetchHelper>();\n\n\t/**\n\t * Prefix to use for cache entries.\n\t * @internal\n\t */\n\tprivate static readonly _CACHE_PREFIX: string = \"fetch_\";\n\n\t/**\n\t * Perform a fetch request.\n\t * @param source The source for the request.\n\t * @param url The url for the request.\n\t * @param method The http method.\n\t * @param body Request to send to the endpoint.\n\t * @param options Options for sending the requests.\n\t * @returns The response.\n\t */\n\tpublic static async fetch(\n\t\tsource: string,\n\t\turl: string,\n\t\tmethod: HttpMethod,\n\t\tbody?: string | Uint8Array,\n\t\toptions?: Omit<IFetchOptions, \"cacheTtlSeconds\">\n\t): Promise<Response> {\n\t\tGuards.string(FetchHelper.CLASS_NAME, nameof(source), source);\n\t\tGuards.string(FetchHelper.CLASS_NAME, nameof(url), url);\n\t\tGuards.arrayOneOf<HttpMethod>(\n\t\t\tFetchHelper.CLASS_NAME,\n\t\t\tnameof(method),\n\t\t\tmethod,\n\t\t\tObject.values(HttpMethod)\n\t\t);\n\t\tif (!Is.undefined(body) && !Is.uint8Array(body)) {\n\t\t\tGuards.string(FetchHelper.CLASS_NAME, nameof(body), body);\n\t\t}\n\t\tif (!Is.undefined(options)) {\n\t\t\tGuards.object<IFetchOptions>(FetchHelper.CLASS_NAME, nameof(options), options);\n\t\t\tif (!Is.undefined(options.headers)) {\n\t\t\t\tGuards.object<IHttpHeaders>(\n\t\t\t\t\tFetchHelper.CLASS_NAME,\n\t\t\t\t\tnameof(options.headers),\n\t\t\t\t\toptions.headers\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!Is.undefined(options.timeoutMs)) {\n\t\t\t\tGuards.integer(FetchHelper.CLASS_NAME, nameof(options.timeoutMs), options.timeoutMs);\n\t\t\t}\n\t\t\tif (!Is.undefined(options.includeCredentials)) {\n\t\t\t\tGuards.boolean(\n\t\t\t\t\tFetchHelper.CLASS_NAME,\n\t\t\t\t\tnameof(options.includeCredentials),\n\t\t\t\t\toptions.includeCredentials\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!Is.undefined(options.retryCount)) {\n\t\t\t\tGuards.integer(FetchHelper.CLASS_NAME, nameof(options.retryCount), options.retryCount);\n\t\t\t}\n\t\t\tif (!Is.undefined(options.retryDelayMs)) {\n\t\t\t\tGuards.integer(FetchHelper.CLASS_NAME, nameof(options.retryDelayMs), options.retryDelayMs);\n\t\t\t}\n\t\t}\n\n\t\tlet controller: AbortController | undefined;\n\t\tlet timerId: number | ReturnType<typeof setTimeout> | undefined;\n\t\tconst retryCount = options?.retryCount ?? 1;\n\t\tconst baseDelayMilliseconds = options?.retryDelayMs ?? 3000;\n\n\t\tlet lastError: IError | undefined;\n\t\tlet attempt;\n\t\tfor (attempt = 0; attempt < retryCount; attempt++) {\n\t\t\tif (attempt > 0) {\n\t\t\t\tconst exponentialBackoffDelay = baseDelayMilliseconds * Math.pow(2, attempt - 1);\n\t\t\t\tawait new Promise(resolve => globalThis.setTimeout(resolve, exponentialBackoffDelay));\n\t\t\t}\n\n\t\t\tif (options?.timeoutMs !== undefined) {\n\t\t\t\tcontroller = new AbortController();\n\t\t\t\ttimerId = globalThis.setTimeout(() => {\n\t\t\t\t\tif (controller) {\n\t\t\t\t\t\tcontroller.abort();\n\t\t\t\t\t}\n\t\t\t\t}, options?.timeoutMs);\n\t\t\t}\n\n\t\t\tlet finalBody;\n\t\t\tif (method === HttpMethod.POST || method === HttpMethod.PUT || method === HttpMethod.PATCH) {\n\t\t\t\tif (Is.string(body)) {\n\t\t\t\t\tfinalBody = body;\n\t\t\t\t} else if (Is.uint8Array(body)) {\n\t\t\t\t\tfinalBody = new Uint8Array(body);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst requestOptions: RequestInit = {\n\t\t\t\t\tmethod,\n\t\t\t\t\theaders: options?.headers as HeadersInit,\n\t\t\t\t\tbody: finalBody,\n\t\t\t\t\tsignal: controller ? controller.signal : undefined\n\t\t\t\t};\n\t\t\t\tif (Is.boolean(options?.includeCredentials)) {\n\t\t\t\t\trequestOptions.credentials = \"include\";\n\t\t\t\t}\n\n\t\t\t\tconst response = await fetch(url, requestOptions);\n\n\t\t\t\tif (!response.ok && retryCount > 1) {\n\t\t\t\t\tlastError = new FetchError(\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\t`${nameofCamelCase<FetchHelper>()}.general`,\n\t\t\t\t\t\t(response.status as HttpStatusCode) ?? HttpStatusCode.internalServerError,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\turl,\n\t\t\t\t\t\t\tstatusText: response.statusText\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treturn response;\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst isErr = Is.object<IError>(err);\n\t\t\t\tif (isErr && Is.stringValue(err.message) && err.message.includes(\"Failed to fetch\")) {\n\t\t\t\t\tlastError = new FetchError(\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\t`${nameofCamelCase<FetchHelper>()}.connectivity`,\n\t\t\t\t\t\tHttpStatusCode.serviceUnavailable,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\turl\n\t\t\t\t\t\t},\n\t\t\t\t\t\terr\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconst isAbort = isErr && err.name === \"AbortError\";\n\t\t\t\t\tconst props: { [id: string]: unknown } = { url };\n\t\t\t\t\tlet httpStatus: HttpStatusCode = HttpStatusCode.internalServerError;\n\t\t\t\t\tif (isAbort) {\n\t\t\t\t\t\thttpStatus = HttpStatusCode.requestTimeout;\n\t\t\t\t\t} else if (isErr && \"httpStatus\" in err) {\n\t\t\t\t\t\thttpStatus = err.httpStatus as HttpStatusCode;\n\t\t\t\t\t}\n\t\t\t\t\tif (isErr && \"statusText\" in err) {\n\t\t\t\t\t\tprops.statusText = err.statusText;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isAbort) {\n\t\t\t\t\t\tlastError = new FetchError(\n\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\t`${nameofCamelCase<FetchHelper>()}.timeout`,\n\t\t\t\t\t\t\thttpStatus,\n\t\t\t\t\t\t\tprops,\n\t\t\t\t\t\t\terr\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastError = new FetchError(\n\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\t`${nameofCamelCase<FetchHelper>()}.general`,\n\t\t\t\t\t\t\thttpStatus,\n\t\t\t\t\t\t\tprops,\n\t\t\t\t\t\t\terr\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (timerId) {\n\t\t\t\t\tglobalThis.clearTimeout(timerId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (retryCount > 1 && attempt === retryCount) {\n\t\t\tthrow new FetchError(\n\t\t\t\tsource,\n\t\t\t\t`${nameofCamelCase<FetchHelper>()}.retryLimitExceeded`,\n\t\t\t\tHttpStatusCode.internalServerError,\n\t\t\t\t{ url },\n\t\t\t\tlastError\n\t\t\t);\n\t\t}\n\n\t\tthrow lastError as Error;\n\t}\n\n\t/**\n\t * Perform a request in json format.\n\t * @param source The source for the request.\n\t * @param url The url for the request.\n\t * @param method The http method.\n\t * @param requestData Request to send to the endpoint.\n\t * @param options Options for sending the requests.\n\t * @returns The response.\n\t */\n\tpublic static async fetchJson<T, U>(\n\t\tsource: string,\n\t\turl: string,\n\t\tmethod: HttpMethod,\n\t\trequestData?: T,\n\t\toptions?: IFetchOptions\n\t): Promise<U> {\n\t\tif (Is.integer(options?.cacheTtlMs) && options.cacheTtlMs >= 0) {\n\t\t\t// The cache option is set, so call the same method again but without\n\t\t\t// the cache option to get the result and cache it.\n\t\t\tconst cacheResponse = AsyncCache.exec(\n\t\t\t\t`${FetchHelper._CACHE_PREFIX}${url}`,\n\t\t\t\toptions.cacheTtlMs,\n\t\t\t\tasync () =>\n\t\t\t\t\tFetchHelper.fetchJson<T, U>(\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tmethod,\n\t\t\t\t\t\trequestData,\n\t\t\t\t\t\tObjectHelper.omit(options, [\"cacheTtlMs\"])\n\t\t\t\t\t)\n\t\t\t);\n\n\t\t\t// If the return value is a promise return it, otherwise continue\n\t\t\t// with the regular processing.\n\t\t\tif (Is.promise(cacheResponse)) {\n\t\t\t\treturn cacheResponse;\n\t\t\t}\n\t\t}\n\n\t\toptions ??= {};\n\t\toptions.headers ??= {};\n\n\t\tif (\n\t\t\tIs.undefined(options.headers[HeaderTypes.ContentType]) &&\n\t\t\t(method === HttpMethod.POST || method === HttpMethod.PUT || method === HttpMethod.PATCH)\n\t\t) {\n\t\t\toptions.headers[HeaderTypes.ContentType] = MimeTypes.Json;\n\t\t}\n\n\t\tconst response = await FetchHelper.fetch(\n\t\t\tsource,\n\t\t\turl,\n\t\t\tmethod,\n\t\t\trequestData ? JSON.stringify(requestData) : undefined,\n\t\t\toptions\n\t\t);\n\n\t\tif (response.ok) {\n\t\t\tif (response.status === HttpStatusCode.noContent) {\n\t\t\t\treturn {} as U;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn (await response.json()) as U;\n\t\t\t} catch (err) {\n\t\t\t\tthrow new FetchError(\n\t\t\t\t\tsource,\n\t\t\t\t\t`${nameofCamelCase<FetchHelper>()}.decodingJSON`,\n\t\t\t\t\tHttpStatusCode.badRequest,\n\t\t\t\t\t{ url },\n\t\t\t\t\terr\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst errorResponseData = await response.json();\n\t\tconst errorResponse = BaseError.fromError(errorResponseData);\n\t\tconst isErrorEmpty = BaseError.isEmpty(errorResponse);\n\n\t\tthrow new FetchError(\n\t\t\tsource,\n\t\t\t`${nameofCamelCase<FetchHelper>()}.failureStatusText`,\n\t\t\tresponse.status as HttpStatusCode,\n\t\t\t{\n\t\t\t\tstatusText: response.statusText,\n\t\t\t\turl,\n\t\t\t\tdata: isErrorEmpty ? errorResponseData : undefined\n\t\t\t},\n\t\t\tisErrorEmpty ? undefined : errorResponse\n\t\t);\n\t}\n\n\t/**\n\t * Perform a request for binary data.\n\t * @param source The source for the request.\n\t * @param url The url for the request.\n\t * @param method The http method.\n\t * @param requestData Request to send to the endpoint.\n\t * @param options Options for sending the requests.\n\t * @returns The response.\n\t */\n\tpublic static async fetchBinary<T>(\n\t\tsource: string,\n\t\turl: string,\n\t\tmethod: Extract<HttpMethod, \"GET\" | \"POST\">,\n\t\trequestData?: Uint8Array,\n\t\toptions?: IFetchOptions\n\t): Promise<Uint8Array | T> {\n\t\tif (Is.integer(options?.cacheTtlMs) && options.cacheTtlMs >= 0) {\n\t\t\t// The cache option is set, so call the same method again but without\n\t\t\t// the cache option to get the result and cache it.\n\t\t\tconst cacheResponse = AsyncCache.exec(\n\t\t\t\t`${FetchHelper._CACHE_PREFIX}${url}`,\n\t\t\t\toptions.cacheTtlMs,\n\t\t\t\tasync () =>\n\t\t\t\t\tFetchHelper.fetchBinary<T>(\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tmethod,\n\t\t\t\t\t\trequestData,\n\t\t\t\t\t\tObjectHelper.omit(options, [\"cacheTtlMs\"])\n\t\t\t\t\t)\n\t\t\t);\n\n\t\t\t// If the return value is a promise return it, otherwise continue\n\t\t\t// with the regular processing.\n\t\t\tif (Is.promise(cacheResponse)) {\n\t\t\t\treturn cacheResponse;\n\t\t\t}\n\t\t}\n\n\t\toptions ??= {};\n\t\toptions.headers ??= {};\n\n\t\tif (Is.undefined(options.headers[HeaderTypes.ContentType])) {\n\t\t\toptions.headers[HeaderTypes.ContentType] = MimeTypes.OctetStream;\n\t\t}\n\n\t\tconst response = await FetchHelper.fetch(source, url, method, requestData, options);\n\n\t\tif (response.ok) {\n\t\t\tif (method === HttpMethod.GET) {\n\t\t\t\tif (response.status === HttpStatusCode.noContent) {\n\t\t\t\t\treturn new Uint8Array();\n\t\t\t\t}\n\t\t\t\treturn new Uint8Array(await response.arrayBuffer());\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn (await response.json()) as T;\n\t\t\t} catch (err) {\n\t\t\t\tthrow new FetchError(\n\t\t\t\t\tsource,\n\t\t\t\t\t`${nameofCamelCase<FetchHelper>()}.decodingJSON`,\n\t\t\t\t\tHttpStatusCode.badRequest,\n\t\t\t\t\t{ url },\n\t\t\t\t\terr\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst errorResponseData = await response.json();\n\t\tconst errorResponse = BaseError.fromError(errorResponseData);\n\t\tconst isErrorEmpty = BaseError.isEmpty(errorResponse);\n\n\t\tthrow new FetchError(\n\t\t\tsource,\n\t\t\t`${nameofCamelCase<FetchHelper>()}.failureStatusText`,\n\t\t\tresponse.status as HttpStatusCode,\n\t\t\t{\n\t\t\t\tstatusText: response.statusText,\n\t\t\t\turl,\n\t\t\t\tdata: isErrorEmpty ? errorResponseData : undefined\n\t\t\t},\n\t\t\tisErrorEmpty ? undefined : errorResponse\n\t\t);\n\t}\n\n\t/**\n\t * Clears the cache.\n\t */\n\tpublic static clearCache(): void {\n\t\tAsyncCache.clearCache(FetchHelper._CACHE_PREFIX);\n\t}\n\n\t/**\n\t * Get a cache entry.\n\t * @param url The url for the request.\n\t * @returns The cache entry if it exists.\n\t */\n\tpublic static async getCacheEntry<T>(url: string): Promise<T | undefined> {\n\t\treturn AsyncCache.get<T>(`${FetchHelper._CACHE_PREFIX}${url}`);\n\t}\n\n\t/**\n\t * Set a cache entry.\n\t * @param url The url for the request.\n\t * @param value The value to cache.\n\t * @returns The cache entry if it exists.\n\t */\n\tpublic static async setCacheEntry<T>(url: string, value: T): Promise<void> {\n\t\tawait AsyncCache.set<T>(`${FetchHelper._CACHE_PREFIX}${url}`, value);\n\t}\n\n\t/**\n\t * Remove a cache entry.\n\t * @param url The url for the request.\n\t */\n\tpublic static removeCacheEntry(url: string): void {\n\t\tAsyncCache.remove(`${FetchHelper._CACHE_PREFIX}${url}`);\n\t}\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  // Copyright 2024 IOTA Stiftung.
2
2
  // SPDX-License-Identifier: Apache-2.0.
3
3
  import { GeneralError, Guards, Is } from "@twin.org/core";
4
- import { CompactSign, flattenedVerify } from "jose";
4
+ import { FlattenedSign, flattenedVerify } from "jose";
5
5
  /**
6
6
  * Class to handle JSON Web Signatures.
7
7
  */
@@ -21,14 +21,14 @@ export class Jws {
21
21
  Guards.defined(Jws.CLASS_NAME, "privateKey", privateKey);
22
22
  Guards.uint8Array(Jws.CLASS_NAME, "hash", hash);
23
23
  try {
24
- const jws = await new CompactSign(hash)
24
+ const jws = await new FlattenedSign(hash)
25
25
  .setProtectedHeader({
26
26
  alg: algOverride ?? (Is.uint8Array(privateKey) ? "EdDSA" : privateKey.algorithm.name),
27
27
  b64: false,
28
28
  crit: ["b64"]
29
29
  })
30
30
  .sign(privateKey);
31
- return jws;
31
+ return `${jws.protected}.${jws.payload}.${jws.signature}`;
32
32
  }
33
33
  catch (err) {
34
34
  throw new GeneralError(Jws.CLASS_NAME, "createFailed", undefined, err);
@@ -1 +1 @@
1
- {"version":3,"file":"jws.js","sourceRoot":"","sources":["../../../src/utils/jws.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAGpD;;GAEG;AACH,MAAM,OAAO,GAAG;IACf;;OAEG;IACI,MAAM,CAAU,UAAU,SAAyB;IAE1D;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CACzB,UAAwB,EACxB,IAAgB,EAChB,WAAoB;QAEpB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,gBAAsB,UAAU,CAAC,CAAC;QAC/D,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,UAAgB,IAAI,CAAC,CAAC;QAEtD,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC;iBACrC,kBAAkB,CAAC;gBACnB,GAAG,EAAE,WAAW,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC;gBACrF,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE,CAAC,KAAK,CAAC;aACb,CAAC;iBACD,IAAI,CAAC,UAAU,CAAC,CAAC;YAEnB,OAAO,GAAG,CAAC;QACZ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACxE,CAAC;IACF,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CACzB,GAAW,EACX,SAAuB,EACvB,IAAgB;QAEhB,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,SAAe,GAAG,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,eAAqB,SAAS,CAAC,CAAC;QAC7D,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,UAAgB,IAAI,CAAC,CAAC;QAEtD,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAa,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAE1C,MAAM,eAAe,CACpB,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EACjE,SAAS,CACT,CAAC;YAEF,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACxE,CAAC;IACF,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { GeneralError, Guards, Is } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { CompactSign, flattenedVerify } from \"jose\";\nimport type { JwkCryptoKey } from \"../models/jwkCryptoKey.js\";\n\n/**\n * Class to handle JSON Web Signatures.\n */\nexport class Jws {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<Jws>();\n\n\t/**\n\t * Create a signature.\n\t * @param privateKey The private key to use.\n\t * @param hash The hash to sign.\n\t * @param algOverride An optional algorithm override.\n\t * @returns The signature.\n\t */\n\tpublic static async create(\n\t\tprivateKey: JwkCryptoKey,\n\t\thash: Uint8Array,\n\t\talgOverride?: string\n\t): Promise<string> {\n\t\tGuards.defined(Jws.CLASS_NAME, nameof(privateKey), privateKey);\n\t\tGuards.uint8Array(Jws.CLASS_NAME, nameof(hash), hash);\n\n\t\ttry {\n\t\t\tconst jws = await new CompactSign(hash)\n\t\t\t\t.setProtectedHeader({\n\t\t\t\t\talg: algOverride ?? (Is.uint8Array(privateKey) ? \"EdDSA\" : privateKey.algorithm.name),\n\t\t\t\t\tb64: false,\n\t\t\t\t\tcrit: [\"b64\"]\n\t\t\t\t})\n\t\t\t\t.sign(privateKey);\n\n\t\t\treturn jws;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(Jws.CLASS_NAME, \"createFailed\", undefined, err);\n\t\t}\n\t}\n\n\t/**\n\t * Verify a signature.\n\t * @param jws The signature to verify.\n\t * @param publicKey The public key to verify the signature with.\n\t * @param hash The hash to verify.\n\t * @returns True if the signature was verified.\n\t */\n\tpublic static async verify(\n\t\tjws: string,\n\t\tpublicKey: JwkCryptoKey,\n\t\thash: Uint8Array\n\t): Promise<boolean> {\n\t\tGuards.stringValue(Jws.CLASS_NAME, nameof(jws), jws);\n\t\tGuards.defined(Jws.CLASS_NAME, nameof(publicKey), publicKey);\n\t\tGuards.uint8Array(Jws.CLASS_NAME, nameof(hash), hash);\n\n\t\ttry {\n\t\t\tconst jwsParts: string[] = jws.split(\".\");\n\n\t\t\tawait flattenedVerify(\n\t\t\t\t{ protected: jwsParts[0], payload: hash, signature: jwsParts[2] },\n\t\t\t\tpublicKey\n\t\t\t);\n\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(Jws.CLASS_NAME, \"verifyFailed\", undefined, err);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"jws.js","sourceRoot":"","sources":["../../../src/utils/jws.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAGtD;;GAEG;AACH,MAAM,OAAO,GAAG;IACf;;OAEG;IACI,MAAM,CAAU,UAAU,SAAyB;IAE1D;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CACzB,UAAwB,EACxB,IAAgB,EAChB,WAAoB;QAEpB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,gBAAsB,UAAU,CAAC,CAAC;QAC/D,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,UAAgB,IAAI,CAAC,CAAC;QAEtD,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC;iBACvC,kBAAkB,CAAC;gBACnB,GAAG,EAAE,WAAW,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC;gBACrF,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE,CAAC,KAAK,CAAC;aACb,CAAC;iBACD,IAAI,CAAC,UAAU,CAAC,CAAC;YAEnB,OAAO,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACxE,CAAC;IACF,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CACzB,GAAW,EACX,SAAuB,EACvB,IAAgB;QAEhB,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,SAAe,GAAG,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,eAAqB,SAAS,CAAC,CAAC;QAC7D,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,UAAgB,IAAI,CAAC,CAAC;QAEtD,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAa,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAE1C,MAAM,eAAe,CACpB,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EACjE,SAAS,CACT,CAAC;YAEF,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACxE,CAAC;IACF,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { GeneralError, Guards, Is } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { FlattenedSign, flattenedVerify } from \"jose\";\nimport type { JwkCryptoKey } from \"../models/jwkCryptoKey.js\";\n\n/**\n * Class to handle JSON Web Signatures.\n */\nexport class Jws {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<Jws>();\n\n\t/**\n\t * Create a signature.\n\t * @param privateKey The private key to use.\n\t * @param hash The hash to sign.\n\t * @param algOverride An optional algorithm override.\n\t * @returns The signature.\n\t */\n\tpublic static async create(\n\t\tprivateKey: JwkCryptoKey,\n\t\thash: Uint8Array,\n\t\talgOverride?: string\n\t): Promise<string> {\n\t\tGuards.defined(Jws.CLASS_NAME, nameof(privateKey), privateKey);\n\t\tGuards.uint8Array(Jws.CLASS_NAME, nameof(hash), hash);\n\n\t\ttry {\n\t\t\tconst jws = await new FlattenedSign(hash)\n\t\t\t\t.setProtectedHeader({\n\t\t\t\t\talg: algOverride ?? (Is.uint8Array(privateKey) ? \"EdDSA\" : privateKey.algorithm.name),\n\t\t\t\t\tb64: false,\n\t\t\t\t\tcrit: [\"b64\"]\n\t\t\t\t})\n\t\t\t\t.sign(privateKey);\n\n\t\t\treturn `${jws.protected}.${jws.payload}.${jws.signature}`;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(Jws.CLASS_NAME, \"createFailed\", undefined, err);\n\t\t}\n\t}\n\n\t/**\n\t * Verify a signature.\n\t * @param jws The signature to verify.\n\t * @param publicKey The public key to verify the signature with.\n\t * @param hash The hash to verify.\n\t * @returns True if the signature was verified.\n\t */\n\tpublic static async verify(\n\t\tjws: string,\n\t\tpublicKey: JwkCryptoKey,\n\t\thash: Uint8Array\n\t): Promise<boolean> {\n\t\tGuards.stringValue(Jws.CLASS_NAME, nameof(jws), jws);\n\t\tGuards.defined(Jws.CLASS_NAME, nameof(publicKey), publicKey);\n\t\tGuards.uint8Array(Jws.CLASS_NAME, nameof(hash), hash);\n\n\t\ttry {\n\t\t\tconst jwsParts: string[] = jws.split(\".\");\n\n\t\t\tawait flattenedVerify(\n\t\t\t\t{ protected: jwsParts[0], payload: hash, signature: jwsParts[2] },\n\t\t\t\tpublicKey\n\t\t\t);\n\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(Jws.CLASS_NAME, \"verifyFailed\", undefined, err);\n\t\t}\n\t}\n}\n"]}
package/docs/changelog.md CHANGED
@@ -1,5 +1,234 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.9.2-next.10](https://github.com/iotaledger/twin-framework/compare/web-v0.9.2-next.9...web-v0.9.2-next.10) (2026-08-11)
4
+
5
+
6
+ ### Features
7
+
8
+ * timeout return type ([4b40b23](https://github.com/iotaledger/twin-framework/commit/4b40b23a7e6b073c7e96cbccc1d41ba7caed2556))
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * The following workspace dependencies were updated
14
+ * dependencies
15
+ * @twin.org/core bumped from 0.9.2-next.9 to 0.9.2-next.10
16
+ * @twin.org/crypto bumped from 0.9.2-next.9 to 0.9.2-next.10
17
+ * @twin.org/nameof bumped from 0.9.2-next.9 to 0.9.2-next.10
18
+ * devDependencies
19
+ * @twin.org/nameof-transformer bumped from 0.9.2-next.9 to 0.9.2-next.10
20
+ * @twin.org/nameof-vitest-plugin bumped from 0.9.2-next.9 to 0.9.2-next.10
21
+ * @twin.org/validate-locales bumped from 0.9.2-next.9 to 0.9.2-next.10
22
+
23
+ ## [0.9.2-next.9](https://github.com/iotaledger/twin-framework/compare/web-v0.9.2-next.8...web-v0.9.2-next.9) (2026-08-10)
24
+
25
+
26
+ ### Miscellaneous Chores
27
+
28
+ * **web:** Synchronize repo versions
29
+
30
+
31
+ ### Dependencies
32
+
33
+ * The following workspace dependencies were updated
34
+ * dependencies
35
+ * @twin.org/core bumped from 0.9.2-next.8 to 0.9.2-next.9
36
+ * @twin.org/crypto bumped from 0.9.2-next.8 to 0.9.2-next.9
37
+ * @twin.org/nameof bumped from 0.9.2-next.8 to 0.9.2-next.9
38
+ * devDependencies
39
+ * @twin.org/nameof-transformer bumped from 0.9.2-next.8 to 0.9.2-next.9
40
+ * @twin.org/nameof-vitest-plugin bumped from 0.9.2-next.8 to 0.9.2-next.9
41
+ * @twin.org/validate-locales bumped from 0.9.2-next.8 to 0.9.2-next.9
42
+
43
+ ## [0.9.2-next.8](https://github.com/iotaledger/twin-framework/compare/web-v0.9.2-next.7...web-v0.9.2-next.8) (2026-08-10)
44
+
45
+
46
+ ### Miscellaneous Chores
47
+
48
+ * **web:** Synchronize repo versions
49
+
50
+
51
+ ### Dependencies
52
+
53
+ * The following workspace dependencies were updated
54
+ * dependencies
55
+ * @twin.org/core bumped from 0.9.2-next.7 to 0.9.2-next.8
56
+ * @twin.org/crypto bumped from 0.9.2-next.7 to 0.9.2-next.8
57
+ * @twin.org/nameof bumped from 0.9.2-next.7 to 0.9.2-next.8
58
+ * devDependencies
59
+ * @twin.org/nameof-transformer bumped from 0.9.2-next.7 to 0.9.2-next.8
60
+ * @twin.org/nameof-vitest-plugin bumped from 0.9.2-next.7 to 0.9.2-next.8
61
+ * @twin.org/validate-locales bumped from 0.9.2-next.7 to 0.9.2-next.8
62
+
63
+ ## [0.9.2-next.7](https://github.com/iotaledger/twin-framework/compare/web-v0.9.2-next.6...web-v0.9.2-next.7) (2026-08-07)
64
+
65
+
66
+ ### Features
67
+
68
+ * linting and dependency update ([676b4e9](https://github.com/iotaledger/twin-framework/commit/676b4e9d9bce158065200bbf875bb31da81d166d))
69
+
70
+
71
+ ### Dependencies
72
+
73
+ * The following workspace dependencies were updated
74
+ * dependencies
75
+ * @twin.org/core bumped from 0.9.2-next.6 to 0.9.2-next.7
76
+ * @twin.org/crypto bumped from 0.9.2-next.6 to 0.9.2-next.7
77
+ * @twin.org/nameof bumped from 0.9.2-next.6 to 0.9.2-next.7
78
+ * devDependencies
79
+ * @twin.org/nameof-transformer bumped from 0.9.2-next.6 to 0.9.2-next.7
80
+ * @twin.org/nameof-vitest-plugin bumped from 0.9.2-next.6 to 0.9.2-next.7
81
+ * @twin.org/validate-locales bumped from 0.9.2-next.6 to 0.9.2-next.7
82
+
83
+ ## [0.9.2-next.6](https://github.com/iotaledger/twin-framework/compare/web-v0.9.2-next.5...web-v0.9.2-next.6) (2026-08-04)
84
+
85
+
86
+ ### Miscellaneous Chores
87
+
88
+ * **web:** Synchronize repo versions
89
+
90
+
91
+ ### Dependencies
92
+
93
+ * The following workspace dependencies were updated
94
+ * dependencies
95
+ * @twin.org/core bumped from 0.9.2-next.5 to 0.9.2-next.6
96
+ * @twin.org/crypto bumped from 0.9.2-next.5 to 0.9.2-next.6
97
+ * @twin.org/nameof bumped from 0.9.2-next.5 to 0.9.2-next.6
98
+ * devDependencies
99
+ * @twin.org/nameof-transformer bumped from 0.9.2-next.5 to 0.9.2-next.6
100
+ * @twin.org/nameof-vitest-plugin bumped from 0.9.2-next.5 to 0.9.2-next.6
101
+ * @twin.org/validate-locales bumped from 0.9.2-next.5 to 0.9.2-next.6
102
+
103
+ ## [0.9.2-next.5](https://github.com/iotaledger/twin-framework/compare/web-v0.9.2-next.4...web-v0.9.2-next.5) (2026-08-03)
104
+
105
+
106
+ ### Miscellaneous Chores
107
+
108
+ * **web:** Synchronize repo versions
109
+
110
+
111
+ ### Dependencies
112
+
113
+ * The following workspace dependencies were updated
114
+ * dependencies
115
+ * @twin.org/core bumped from 0.9.2-next.4 to 0.9.2-next.5
116
+ * @twin.org/crypto bumped from 0.9.2-next.4 to 0.9.2-next.5
117
+ * @twin.org/nameof bumped from 0.9.2-next.4 to 0.9.2-next.5
118
+ * devDependencies
119
+ * @twin.org/nameof-transformer bumped from 0.9.2-next.4 to 0.9.2-next.5
120
+ * @twin.org/nameof-vitest-plugin bumped from 0.9.2-next.4 to 0.9.2-next.5
121
+ * @twin.org/validate-locales bumped from 0.9.2-next.4 to 0.9.2-next.5
122
+
123
+ ## [0.9.2-next.4](https://github.com/iotaledger/twin-framework/compare/web-v0.9.2-next.3...web-v0.9.2-next.4) (2026-07-31)
124
+
125
+
126
+ ### Miscellaneous Chores
127
+
128
+ * **web:** Synchronize repo versions
129
+
130
+
131
+ ### Dependencies
132
+
133
+ * The following workspace dependencies were updated
134
+ * dependencies
135
+ * @twin.org/core bumped from 0.9.2-next.3 to 0.9.2-next.4
136
+ * @twin.org/crypto bumped from 0.9.2-next.3 to 0.9.2-next.4
137
+ * @twin.org/nameof bumped from 0.9.2-next.3 to 0.9.2-next.4
138
+ * devDependencies
139
+ * @twin.org/nameof-transformer bumped from 0.9.2-next.3 to 0.9.2-next.4
140
+ * @twin.org/nameof-vitest-plugin bumped from 0.9.2-next.3 to 0.9.2-next.4
141
+ * @twin.org/validate-locales bumped from 0.9.2-next.3 to 0.9.2-next.4
142
+
143
+ ## [0.9.2-next.3](https://github.com/iotaledger/twin-framework/compare/web-v0.9.2-next.2...web-v0.9.2-next.3) (2026-07-30)
144
+
145
+
146
+ ### Miscellaneous Chores
147
+
148
+ * **web:** Synchronize repo versions
149
+
150
+
151
+ ### Dependencies
152
+
153
+ * The following workspace dependencies were updated
154
+ * dependencies
155
+ * @twin.org/core bumped from 0.9.2-next.2 to 0.9.2-next.3
156
+ * @twin.org/crypto bumped from 0.9.2-next.2 to 0.9.2-next.3
157
+ * @twin.org/nameof bumped from 0.9.2-next.2 to 0.9.2-next.3
158
+ * devDependencies
159
+ * @twin.org/nameof-transformer bumped from 0.9.2-next.2 to 0.9.2-next.3
160
+ * @twin.org/nameof-vitest-plugin bumped from 0.9.2-next.2 to 0.9.2-next.3
161
+ * @twin.org/validate-locales bumped from 0.9.2-next.2 to 0.9.2-next.3
162
+
163
+ ## [0.9.2-next.2](https://github.com/iotaledger/twin-framework/compare/web-v0.9.2-next.1...web-v0.9.2-next.2) (2026-07-29)
164
+
165
+
166
+ ### Miscellaneous Chores
167
+
168
+ * **web:** Synchronize repo versions
169
+
170
+
171
+ ### Dependencies
172
+
173
+ * The following workspace dependencies were updated
174
+ * dependencies
175
+ * @twin.org/core bumped from 0.9.2-next.1 to 0.9.2-next.2
176
+ * @twin.org/crypto bumped from 0.9.2-next.1 to 0.9.2-next.2
177
+ * @twin.org/nameof bumped from 0.9.2-next.1 to 0.9.2-next.2
178
+ * devDependencies
179
+ * @twin.org/nameof-transformer bumped from 0.9.2-next.1 to 0.9.2-next.2
180
+ * @twin.org/nameof-vitest-plugin bumped from 0.9.2-next.1 to 0.9.2-next.2
181
+ * @twin.org/validate-locales bumped from 0.9.2-next.1 to 0.9.2-next.2
182
+
183
+ ## [0.9.2-next.1](https://github.com/iotaledger/twin-framework/compare/web-v0.9.2-next.0...web-v0.9.2-next.1) (2026-07-28)
184
+
185
+
186
+ ### Features
187
+
188
+ * add additional header types ([#222](https://github.com/iotaledger/twin-framework/issues/222)) ([05f01cf](https://github.com/iotaledger/twin-framework/commit/05f01cf34b7bcec561ee989f679281b1cacdf032))
189
+ * add context id features ([#206](https://github.com/iotaledger/twin-framework/issues/206)) ([ef0d4ee](https://github.com/iotaledger/twin-framework/commit/ef0d4ee11a4f5fc6cc6f52a4958ce905c04ee13b))
190
+ * 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))
191
+ * add header helper for common bearer support ([0c940b2](https://github.com/iotaledger/twin-framework/commit/0c940b29cccf0c3bb5b4aa8a01f1998010e44d51))
192
+ * add IEntitySchemaDiff and entitySchemaDiff utility ([#282](https://github.com/iotaledger/twin-framework/issues/282)) ([9d63e94](https://github.com/iotaledger/twin-framework/commit/9d63e94021ee2ffc138004ee68cf53d08a6b17f9))
193
+ * add jwk enc property overrides ([18b6309](https://github.com/iotaledger/twin-framework/commit/18b63092a386b56ea7fcd7e12865ac6e1b47cc1e))
194
+ * add Link header array support ([aff32a3](https://github.com/iotaledger/twin-framework/commit/aff32a3ff8ad3d076cade7c889444220706bfb1e))
195
+ * add rsa cipher support ([7af6cc6](https://github.com/iotaledger/twin-framework/commit/7af6cc67512d3363bd4a2f2e87bd7733c2800147))
196
+ * add/update http and mime types ([#229](https://github.com/iotaledger/twin-framework/issues/229)) ([d50154a](https://github.com/iotaledger/twin-framework/commit/d50154a484711b67feb42ea20a94e4415e53d392))
197
+ * adding link header helper ([#225](https://github.com/iotaledger/twin-framework/issues/225)) ([703c072](https://github.com/iotaledger/twin-framework/commit/703c0725aceac6b6ec0c4fa729ef832d12fb3fd7))
198
+ * additional http header extraction ([#262](https://github.com/iotaledger/twin-framework/issues/262)) ([124fa3f](https://github.com/iotaledger/twin-framework/commit/124fa3fdd118ed17f973d4b46842f5b7f35365c2))
199
+ * additional http link feature support ([b68b4cc](https://github.com/iotaledger/twin-framework/commit/b68b4cc6a6e3cf02f91e794353714e26a49fe66c))
200
+ * additional nameof operators ([a5aab60](https://github.com/iotaledger/twin-framework/commit/a5aab60bf66a86f1b7ff8af7c4f044cb03706d50))
201
+ * eslint migration to flat config ([74427d7](https://github.com/iotaledger/twin-framework/commit/74427d78d342167f7850e49ab87269326355befe))
202
+ * improve bearer creation and extraction ([b9ddd6d](https://github.com/iotaledger/twin-framework/commit/b9ddd6dae0cb558e2227f0ec5e9cd21f85957400))
203
+ * improve bearer creation and extraction ([29a347a](https://github.com/iotaledger/twin-framework/commit/29a347a760cb3bc5eb819112e84f1ac99430e72b))
204
+ * improve signatures ([cdd24be](https://github.com/iotaledger/twin-framework/commit/cdd24be6fb898d33955b6f2f93c3ddbd73582269))
205
+ * locales validation ([#197](https://github.com/iotaledger/twin-framework/issues/197)) ([55fdadb](https://github.com/iotaledger/twin-framework/commit/55fdadb13595ce0047f787bd1d4135d429a99f12))
206
+ * typescript 6 update ([1d10f31](https://github.com/iotaledger/twin-framework/commit/1d10f31e6516ec622773f45e88af82fe749b384a))
207
+ * update dependencies ([4da77ab](https://github.com/iotaledger/twin-framework/commit/4da77ab30f499e52825ac5a76f51436ceb59c26e))
208
+ * update dependencies ([f3bd015](https://github.com/iotaledger/twin-framework/commit/f3bd015efd169196b7e0335f5cab876ba6ca1d75))
209
+ * urn and header helper extensions ([#395](https://github.com/iotaledger/twin-framework/issues/395)) ([5976756](https://github.com/iotaledger/twin-framework/commit/5976756886d22e5063671052abc4dfa04ce23a53))
210
+ * use body on patch verb ([28627e5](https://github.com/iotaledger/twin-framework/commit/28627e527d033d433acefe0e9fde52ba88c0d047))
211
+ * use cause instead of inner for errors ([1f4acc4](https://github.com/iotaledger/twin-framework/commit/1f4acc4d7a6b71a134d9547da9bf40de1e1e49da))
212
+
213
+
214
+ ### Bug Fixes
215
+
216
+ * ensure __decorate is defined for decorators ([103a563](https://github.com/iotaledger/twin-framework/commit/103a563ce01ebdef6240d2e590e7b026e8692684))
217
+ * 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))
218
+
219
+
220
+ ### Dependencies
221
+
222
+ * The following workspace dependencies were updated
223
+ * dependencies
224
+ * @twin.org/core bumped from 0.9.2-next.0 to 0.9.2-next.1
225
+ * @twin.org/crypto bumped from 0.9.2-next.0 to 0.9.2-next.1
226
+ * @twin.org/nameof bumped from 0.9.2-next.0 to 0.9.2-next.1
227
+ * devDependencies
228
+ * @twin.org/nameof-transformer bumped from 0.9.2-next.0 to 0.9.2-next.1
229
+ * @twin.org/nameof-vitest-plugin bumped from 0.9.2-next.0 to 0.9.2-next.1
230
+ * @twin.org/validate-locales bumped from 0.9.2-next.0 to 0.9.2-next.1
231
+
3
232
  ## [0.9.1](https://github.com/iotaledger/twin-framework/compare/web-v0.9.1...web-v0.9.1) (2026-07-26)
4
233
 
5
234
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twin.org/web",
3
- "version": "0.9.1",
3
+ "version": "0.9.2-next.10",
4
4
  "description": "Classes for use with web operations",
5
5
  "repository": {
6
6
  "type": "git",
@@ -14,10 +14,10 @@
14
14
  "node": ">=24.0.0"
15
15
  },
16
16
  "dependencies": {
17
- "@twin.org/core": "^0.9.1",
18
- "@twin.org/crypto": "^0.9.1",
19
- "@twin.org/nameof": "^0.9.1",
20
- "jose": "6.2.4"
17
+ "@twin.org/core": "0.9.2-next.10",
18
+ "@twin.org/crypto": "0.9.2-next.10",
19
+ "@twin.org/nameof": "0.9.2-next.10",
20
+ "jose": "6.2.8"
21
21
  },
22
22
  "main": "./dist/es/index.js",
23
23
  "types": "./dist/types/index.d.ts",