@ledgerhq/device-management-kit 1.6.0 → 1.7.0

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 (51) hide show
  1. package/lib/cjs/package.json +1 -2
  2. package/lib/cjs/src/api/logger-subscriber/service/WebLogsExporterLogger.js.map +2 -2
  3. package/lib/cjs/src/api/network/DmkNetworkClient.js +1 -1
  4. package/lib/cjs/src/api/network/DmkNetworkClient.js.map +3 -3
  5. package/lib/cjs/src/api/network/DmkNetworkClient.test.js +1 -1
  6. package/lib/cjs/src/api/network/DmkNetworkClient.test.js.map +3 -3
  7. package/lib/cjs/src/api/network/DmkNetworkClientError.js +1 -1
  8. package/lib/cjs/src/api/network/DmkNetworkClientError.js.map +2 -2
  9. package/lib/cjs/src/api/network/DmkNetworkClientHelpers.js +1 -1
  10. package/lib/cjs/src/api/network/DmkNetworkClientHelpers.js.map +3 -3
  11. package/lib/cjs/src/api/network/DmkNetworkClientHelpers.test.js +1 -1
  12. package/lib/cjs/src/api/network/DmkNetworkClientHelpers.test.js.map +3 -3
  13. package/lib/cjs/src/api/utils/Base64String.js +1 -1
  14. package/lib/cjs/src/api/utils/Base64String.js.map +3 -3
  15. package/lib/cjs/src/api/utils/Base64String.test.js +3 -1
  16. package/lib/cjs/src/api/utils/Base64String.test.js.map +3 -3
  17. package/lib/cjs/src/internal/secure-channel/data/DefaultSecureChannelDataSource.js +1 -1
  18. package/lib/cjs/src/internal/secure-channel/data/DefaultSecureChannelDataSource.js.map +3 -3
  19. package/lib/cjs/src/internal/secure-channel/data/DefaultSecureChannelDataSource.test.js +1 -1
  20. package/lib/cjs/src/internal/secure-channel/data/DefaultSecureChannelDataSource.test.js.map +2 -2
  21. package/lib/esm/package.json +1 -2
  22. package/lib/esm/src/api/logger-subscriber/service/WebLogsExporterLogger.js.map +2 -2
  23. package/lib/esm/src/api/network/DmkNetworkClient.js +1 -1
  24. package/lib/esm/src/api/network/DmkNetworkClient.js.map +3 -3
  25. package/lib/esm/src/api/network/DmkNetworkClient.test.js +1 -1
  26. package/lib/esm/src/api/network/DmkNetworkClient.test.js.map +3 -3
  27. package/lib/esm/src/api/network/DmkNetworkClientError.js +1 -1
  28. package/lib/esm/src/api/network/DmkNetworkClientError.js.map +2 -2
  29. package/lib/esm/src/api/network/DmkNetworkClientHelpers.js +1 -1
  30. package/lib/esm/src/api/network/DmkNetworkClientHelpers.js.map +3 -3
  31. package/lib/esm/src/api/network/DmkNetworkClientHelpers.test.js +1 -1
  32. package/lib/esm/src/api/network/DmkNetworkClientHelpers.test.js.map +3 -3
  33. package/lib/esm/src/api/utils/Base64String.js +1 -1
  34. package/lib/esm/src/api/utils/Base64String.js.map +3 -3
  35. package/lib/esm/src/api/utils/Base64String.test.js +3 -1
  36. package/lib/esm/src/api/utils/Base64String.test.js.map +3 -3
  37. package/lib/esm/src/internal/secure-channel/data/DefaultSecureChannelDataSource.js +1 -1
  38. package/lib/esm/src/internal/secure-channel/data/DefaultSecureChannelDataSource.js.map +3 -3
  39. package/lib/esm/src/internal/secure-channel/data/DefaultSecureChannelDataSource.test.js +1 -1
  40. package/lib/esm/src/internal/secure-channel/data/DefaultSecureChannelDataSource.test.js.map +2 -2
  41. package/lib/types/src/api/logger-subscriber/service/WebLogsExporterLogger.d.ts.map +1 -1
  42. package/lib/types/src/api/network/DmkNetworkClient.d.ts +1 -6
  43. package/lib/types/src/api/network/DmkNetworkClient.d.ts.map +1 -1
  44. package/lib/types/src/api/network/DmkNetworkClientError.d.ts +2 -6
  45. package/lib/types/src/api/network/DmkNetworkClientError.d.ts.map +1 -1
  46. package/lib/types/src/api/network/DmkNetworkClientHelpers.d.ts +10 -7
  47. package/lib/types/src/api/network/DmkNetworkClientHelpers.d.ts.map +1 -1
  48. package/lib/types/src/api/utils/Base64String.d.ts.map +1 -1
  49. package/lib/types/src/internal/secure-channel/data/DefaultSecureChannelDataSource.d.ts.map +1 -1
  50. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  51. package/package.json +4 -5
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/api/network/DmkNetworkClientHelpers.test.ts"],
4
- "sourcesContent": ["import { DmkNetworkClientError } from \"./DmkNetworkClientError\";\nimport {\n buildBodyAndHeaders,\n buildSignal,\n buildUrl,\n hasHeader,\n isRawBody,\n joinPath,\n JSON_CONTENT_TYPE,\n parseBody,\n safeReadText,\n wrapFetchError,\n} from \"./DmkNetworkClientHelpers\";\n\ndescribe(\"DmkNetworkClientHelpers\", () => {\n describe(\"joinPath\", () => {\n it(\"should return the base when the path is empty\", () => {\n expect(joinPath(\"https://api.example.com\", \"\")).toBe(\n \"https://api.example.com\",\n );\n });\n\n it(\"should insert a single slash when neither side has one\", () => {\n expect(joinPath(\"https://api.example.com\", \"items\")).toBe(\n \"https://api.example.com/items\",\n );\n });\n\n it(\"should collapse a trailing base slash with a leading path slash\", () => {\n expect(joinPath(\"https://api.example.com/\", \"/items\")).toBe(\n \"https://api.example.com/items\",\n );\n });\n\n it(\"should keep a single slash when only one side has one\", () => {\n expect(joinPath(\"https://api.example.com/\", \"items\")).toBe(\n \"https://api.example.com/items\",\n );\n expect(joinPath(\"https://api.example.com\", \"/items\")).toBe(\n \"https://api.example.com/items\",\n );\n });\n });\n\n describe(\"buildUrl\", () => {\n it(\"should keep an absolute URL as-is\", () => {\n const url = buildUrl({ url: \"https://api.example.com/items\" });\n expect(url).toBe(\"https://api.example.com/items\");\n });\n\n it(\"should prepend the base URL to a relative path\", () => {\n const url = buildUrl({\n url: \"/items\",\n baseUrl: \"https://api.example.com/\",\n });\n expect(url).toBe(\"https://api.example.com/items\");\n });\n\n it(\"should ignore the base URL when the input URL is absolute\", () => {\n const url = buildUrl({\n url: \"https://other.example.com/items\",\n baseUrl: \"https://api.example.com\",\n });\n expect(url).toBe(\"https://other.example.com/items\");\n });\n\n it(\"should append query params and skip null/undefined entries\", () => {\n const url = buildUrl({\n url: \"https://api.example.com/items\",\n params: {\n chain: 1,\n contract: \"0xabc\",\n active: true,\n skip: null,\n alsoSkip: undefined,\n },\n });\n expect(typeof url).toBe(\"string\");\n const parsed = new URL(url);\n expect(parsed.searchParams.get(\"chain\")).toBe(\"1\");\n expect(parsed.searchParams.get(\"contract\")).toBe(\"0xabc\");\n expect(parsed.searchParams.get(\"active\")).toBe(\"true\");\n expect(parsed.searchParams.has(\"skip\")).toBe(false);\n expect(parsed.searchParams.has(\"alsoSkip\")).toBe(false);\n });\n\n it(\"should preserve a pre-existing query string in the input URL\", () => {\n const url = buildUrl({\n url: \"https://api.example.com/items?keep=1\",\n params: { chain: 2 },\n });\n const parsed = new URL(url);\n expect(parsed.searchParams.get(\"keep\")).toBe(\"1\");\n expect(parsed.searchParams.get(\"chain\")).toBe(\"2\");\n });\n\n it(\"should percent-encode keys and values\", () => {\n const url = buildUrl({\n url: \"https://api.example.com/items\",\n params: { \"a key\": \"a value&b\" },\n });\n expect(url).toBe(\"https://api.example.com/items?a%20key=a%20value%26b\");\n });\n\n it(\"should not append a trailing slash after the last query value (facebook/react-native#54242)\", () => {\n const url = buildUrl({\n url: \"https://manager.api.live.ledger.com/api/get_device_version\",\n params: { target_id: 858783748, provider: 1 },\n });\n expect(typeof url).toBe(\"string\");\n expect(url).toBe(\n \"https://manager.api.live.ledger.com/api/get_device_version?target_id=858783748&provider=1\",\n );\n expect(url.endsWith(\"/\")).toBe(false);\n });\n\n it(\"should return a plain string (not a URL instance) so RN URL serialization is bypassed\", () => {\n const url = buildUrl({\n url: \"https://api.example.com/items\",\n params: { chain: 1 },\n });\n expect(typeof url).toBe(\"string\");\n expect(url).not.toBeInstanceOf(URL);\n });\n\n it(\"should still build the URL when URLSearchParams.set is unavailable (React Native regression)\", () => {\n const original = URLSearchParams.prototype.set;\n URLSearchParams.prototype.set = function notImplemented(): never {\n throw new Error(\"URLSearchParams.set is not implemented\");\n };\n try {\n const url = buildUrl({\n url: \"https://api.example.com/items\",\n params: { chain: 1, contract: \"0xabc\" },\n });\n expect(url).toContain(\"chain=1\");\n expect(url).toContain(\"contract=0xabc\");\n } finally {\n URLSearchParams.prototype.set = original;\n }\n });\n });\n\n describe(\"hasHeader\", () => {\n it(\"should find a header regardless of case\", () => {\n expect(hasHeader({ \"Content-Type\": \"json\" }, \"content-type\")).toBe(true);\n expect(hasHeader({ \"content-type\": \"json\" }, \"Content-Type\")).toBe(true);\n });\n\n it(\"should return false when no matching header exists\", () => {\n expect(hasHeader({ Accept: \"json\" }, \"content-type\")).toBe(false);\n expect(hasHeader({}, \"content-type\")).toBe(false);\n });\n });\n\n describe(\"isRawBody\", () => {\n it(\"should accept native BodyInit values\", () => {\n expect(isRawBody(\"raw-string\")).toBe(true);\n expect(isRawBody(new ArrayBuffer(4))).toBe(true);\n expect(isRawBody(new Uint8Array([1, 2, 3]))).toBe(true);\n expect(isRawBody(new Blob([\"a\"]))).toBe(true);\n expect(isRawBody(new FormData())).toBe(true);\n expect(isRawBody(new URLSearchParams({ a: \"1\" }))).toBe(true);\n expect(isRawBody(new ReadableStream())).toBe(true);\n });\n\n it(\"should reject plain objects and primitives\", () => {\n expect(isRawBody({ foo: \"bar\" })).toBe(false);\n expect(isRawBody([1, 2, 3])).toBe(false);\n expect(isRawBody(42)).toBe(false);\n expect(isRawBody(null)).toBe(false);\n expect(isRawBody(undefined)).toBe(false);\n });\n\n it(\"should not throw when optional Web globals are missing (React Native regression)\", () => {\n const globals = globalThis as unknown as Record<string, unknown>;\n const names = [\"Blob\", \"FormData\", \"URLSearchParams\", \"ReadableStream\"];\n const saved: Record<string, unknown> = {};\n for (const name of names) {\n saved[name] = globals[name];\n delete globals[name];\n }\n try {\n expect(() => isRawBody({ foo: \"bar\" })).not.toThrow();\n expect(isRawBody({ foo: \"bar\" })).toBe(false);\n expect(isRawBody(\"raw\")).toBe(true);\n expect(isRawBody(new Uint8Array([1]))).toBe(true);\n } finally {\n for (const name of names) {\n globals[name] = saved[name];\n }\n }\n });\n });\n\n describe(\"buildBodyAndHeaders\", () => {\n it(\"should merge default and per-request headers with per-request winning\", () => {\n const { headers } = buildBodyAndHeaders({\n method: \"GET\",\n body: undefined,\n defaultHeaders: { \"X-Default\": \"default\", \"X-Shared\": \"from-default\" },\n perRequestHeaders: { \"X-Shared\": \"overridden\", \"X-Per\": \"per\" },\n });\n expect(headers).toEqual({\n \"X-Default\": \"default\",\n \"X-Shared\": \"overridden\",\n \"X-Per\": \"per\",\n });\n });\n\n it(\"should not emit a body on GET/HEAD even when a body is provided\", () => {\n const result = buildBodyAndHeaders({\n method: \"GET\",\n body: { foo: \"bar\" },\n defaultHeaders: {},\n });\n expect(result.body).toBeUndefined();\n expect(result.headers[\"Content-Type\"]).toBeUndefined();\n });\n\n it(\"should JSON-stringify plain objects and set the Content-Type\", () => {\n const result = buildBodyAndHeaders({\n method: \"POST\",\n body: { foo: \"bar\" },\n defaultHeaders: {},\n });\n expect(result.body).toBe(JSON.stringify({ foo: \"bar\" }));\n expect(result.headers[\"Content-Type\"]).toBe(JSON_CONTENT_TYPE);\n });\n\n it(\"should not override an explicit Content-Type header\", () => {\n const result = buildBodyAndHeaders({\n method: \"POST\",\n body: { foo: \"bar\" },\n defaultHeaders: {},\n perRequestHeaders: { \"content-type\": \"application/vnd.custom+json\" },\n });\n expect(result.body).toBe(JSON.stringify({ foo: \"bar\" }));\n expect(result.headers[\"content-type\"]).toBe(\n \"application/vnd.custom+json\",\n );\n expect(result.headers[\"Content-Type\"]).toBeUndefined();\n });\n\n it(\"should pass raw BodyInit values through unchanged without JSON headers\", () => {\n const formData = new FormData();\n formData.set(\"field\", \"value\");\n const result = buildBodyAndHeaders({\n method: \"POST\",\n body: formData,\n defaultHeaders: {},\n });\n expect(result.body).toBe(formData);\n expect(result.headers[\"Content-Type\"]).toBeUndefined();\n });\n\n it(\"should return an undefined body when the body itself is undefined\", () => {\n const result = buildBodyAndHeaders({\n method: \"POST\",\n body: undefined,\n defaultHeaders: { \"X-Default\": \"d\" },\n });\n expect(result.body).toBeUndefined();\n expect(result.headers).toEqual({ \"X-Default\": \"d\" });\n });\n });\n\n describe(\"buildSignal\", () => {\n it(\"should return undefined when no timeout and no external signal\", () => {\n expect(\n buildSignal({\n timeoutMs: undefined,\n externalSignal: undefined,\n }),\n ).toBeUndefined();\n });\n\n it(\"should return undefined when timeout is zero and no external signal\", () => {\n expect(\n buildSignal({\n timeoutMs: 0,\n externalSignal: undefined,\n }),\n ).toBeUndefined();\n });\n\n it(\"should return the external signal alone when no timeout is configured\", () => {\n const controller = new AbortController();\n const signal = buildSignal({\n timeoutMs: undefined,\n externalSignal: controller.signal,\n });\n expect(signal).toBe(controller.signal);\n });\n\n it(\"should return a timeout signal when only a timeout is configured\", () => {\n const signal = buildSignal({\n timeoutMs: 1000,\n externalSignal: undefined,\n });\n expect(signal).toBeInstanceOf(AbortSignal);\n });\n\n it(\"should use the provided timeout value for AbortSignal.timeout\", () => {\n const timeoutSpy = vi.spyOn(AbortSignal, \"timeout\");\n buildSignal({\n timeoutMs: 50,\n externalSignal: undefined,\n });\n expect(timeoutSpy).toHaveBeenCalledWith(50);\n timeoutSpy.mockRestore();\n });\n\n it(\"should compose both signals with AbortSignal.any when both are set\", () => {\n const anySpy = vi.spyOn(AbortSignal, \"any\");\n const controller = new AbortController();\n const signal = buildSignal({\n timeoutMs: 100,\n externalSignal: controller.signal,\n });\n expect(signal).toBeInstanceOf(AbortSignal);\n expect(anySpy).toHaveBeenCalledTimes(1);\n anySpy.mockRestore();\n });\n });\n\n describe(\"parseBody\", () => {\n it(\"should return undefined for 'void' response type without consuming the body\", async () => {\n const response = new Response(\"ignored\");\n const result = await parseBody(response, \"void\");\n expect(result).toBeUndefined();\n expect(response.bodyUsed).toBe(false);\n });\n\n it(\"should return text for 'text' response type\", async () => {\n const response = new Response(\"plain-body\");\n await expect(parseBody(response, \"text\")).resolves.toBe(\"plain-body\");\n });\n\n it(\"should return a Blob for 'blob' response type\", async () => {\n const response = new Response(\"blob-body\");\n const result = await parseBody(response, \"blob\");\n expect(result).toBeInstanceOf(Blob);\n });\n\n it(\"should return an ArrayBuffer for 'arrayBuffer' response type\", async () => {\n const response = new Response(new Uint8Array([1, 2, 3]));\n const result = await parseBody(response, \"arrayBuffer\");\n expect(result).toBeInstanceOf(ArrayBuffer);\n expect(new Uint8Array(result as ArrayBuffer)).toEqual(\n new Uint8Array([1, 2, 3]),\n );\n });\n\n it(\"should parse JSON for 'json' response type\", async () => {\n const response = new Response(JSON.stringify({ hello: \"world\" }));\n await expect(parseBody(response, \"json\")).resolves.toEqual({\n hello: \"world\",\n });\n });\n\n it(\"should resolve to undefined for an empty JSON body\", async () => {\n const response = new Response(\"\");\n await expect(parseBody(response, \"json\")).resolves.toBeUndefined();\n });\n\n it(\"should throw a DmkNetworkClientError for malformed JSON\", async () => {\n const response = new Response(\"not-json\", {\n status: 200,\n statusText: \"OK\",\n });\n const error = await parseBody(response, \"json\").catch((e: unknown) => e);\n expect(error).toBeInstanceOf(DmkNetworkClientError);\n const dmkError = error as DmkNetworkClientError;\n expect(dmkError.status).toBe(200);\n expect(dmkError.statusText).toBe(\"OK\");\n expect(dmkError.responseBody).toBe(\"not-json\");\n expect(dmkError.cause).toBeInstanceOf(SyntaxError);\n });\n });\n\n describe(\"safeReadText\", () => {\n it(\"should return the text body\", async () => {\n await expect(safeReadText(new Response(\"hello\"))).resolves.toBe(\"hello\");\n });\n\n it(\"should return undefined when reading the body throws\", async () => {\n const response = {\n text: () => Promise.reject(new Error(\"read failed\")),\n } as unknown as Response;\n await expect(safeReadText(response)).resolves.toBeUndefined();\n });\n });\n\n describe(\"wrapFetchError\", () => {\n it(\"should wrap a generic Error with its message\", () => {\n const cause = new TypeError(\"network down\");\n const error = wrapFetchError({\n cause,\n externalSignal: undefined,\n timeoutMs: undefined,\n });\n expect(error).toBeInstanceOf(DmkNetworkClientError);\n expect(error.message).toBe(\"network down\");\n expect(error.cause).toBe(cause);\n expect(error.isTimeout).toBe(false);\n expect(error.isAbort).toBe(false);\n });\n\n it(\"should fall back to a generic message for non-Error causes\", () => {\n const error = wrapFetchError({\n cause: \"something\",\n externalSignal: undefined,\n timeoutMs: undefined,\n });\n expect(error.message).toBe(\"Network request failed\");\n expect(error.cause).toBe(\"something\");\n });\n\n it(\"should flag TimeoutError as a timeout\", () => {\n const cause = new Error(\"timed out\");\n cause.name = \"TimeoutError\";\n const error = wrapFetchError({\n cause,\n externalSignal: undefined,\n timeoutMs: 10,\n });\n expect(error.isTimeout).toBe(true);\n expect(error.isAbort).toBe(false);\n expect(error.message).toBe(\"Request timed out\");\n });\n\n it(\"should flag AbortError as a timeout when a timeout is configured and no external abort\", () => {\n const cause = new Error(\"aborted\");\n cause.name = \"AbortError\";\n const error = wrapFetchError({\n cause,\n externalSignal: undefined,\n timeoutMs: 1000,\n });\n expect(error.isTimeout).toBe(true);\n expect(error.isAbort).toBe(false);\n });\n\n it(\"should flag AbortError as an external abort when the caller signal is aborted\", () => {\n const controller = new AbortController();\n controller.abort();\n const cause = new Error(\"aborted\");\n cause.name = \"AbortError\";\n const error = wrapFetchError({\n cause,\n externalSignal: controller.signal,\n timeoutMs: undefined,\n });\n expect(error.isAbort).toBe(true);\n expect(error.isTimeout).toBe(false);\n expect(error.message).toBe(\"Request aborted\");\n });\n\n it(\"should treat AbortError with no timeout and no external abort as a plain abort\", () => {\n const cause = new Error(\"aborted\");\n cause.name = \"AbortError\";\n const error = wrapFetchError({\n cause,\n externalSignal: undefined,\n timeoutMs: undefined,\n });\n expect(error.isTimeout).toBe(false);\n expect(error.isAbort).toBe(false);\n expect(error.message).toBe(\"Request aborted\");\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_DmkNetworkClientError", "import_DmkNetworkClientHelpers", "url", "parsed", "original", "globals", "names", "saved", "name", "headers", "result", "formData", "controller", "signal", "timeoutSpy", "anySpy", "response", "error", "e", "dmkError", "cause"]
4
+ "sourcesContent": ["import { DmkNetworkClientError } from \"./DmkNetworkClientError\";\nimport {\n buildBodyAndHeaders,\n buildSignal,\n buildUrl,\n hasHeader,\n isRawBody,\n joinPath,\n JSON_CONTENT_TYPE,\n parseBody,\n safeReadText,\n wrapFetchError,\n} from \"./DmkNetworkClientHelpers\";\n\ndescribe(\"DmkNetworkClientHelpers\", () => {\n describe(\"joinPath\", () => {\n it(\"should return the base when the path is empty\", () => {\n expect(joinPath(\"https://api.example.com\", \"\")).toBe(\n \"https://api.example.com\",\n );\n });\n\n it(\"should insert a single slash when neither side has one\", () => {\n expect(joinPath(\"https://api.example.com\", \"items\")).toBe(\n \"https://api.example.com/items\",\n );\n });\n\n it(\"should collapse a trailing base slash with a leading path slash\", () => {\n expect(joinPath(\"https://api.example.com/\", \"/items\")).toBe(\n \"https://api.example.com/items\",\n );\n });\n\n it(\"should keep a single slash when only one side has one\", () => {\n expect(joinPath(\"https://api.example.com/\", \"items\")).toBe(\n \"https://api.example.com/items\",\n );\n expect(joinPath(\"https://api.example.com\", \"/items\")).toBe(\n \"https://api.example.com/items\",\n );\n });\n });\n\n describe(\"buildUrl\", () => {\n it(\"should keep an absolute URL as-is\", () => {\n const url = buildUrl({ url: \"https://api.example.com/items\" });\n expect(url).toBe(\"https://api.example.com/items\");\n });\n\n it(\"should prepend the base URL to a relative path\", () => {\n const url = buildUrl({\n url: \"/items\",\n baseUrl: \"https://api.example.com/\",\n });\n expect(url).toBe(\"https://api.example.com/items\");\n });\n\n it(\"should ignore the base URL when the input URL is absolute\", () => {\n const url = buildUrl({\n url: \"https://other.example.com/items\",\n baseUrl: \"https://api.example.com\",\n });\n expect(url).toBe(\"https://other.example.com/items\");\n });\n\n it(\"should append query params and skip null/undefined entries\", () => {\n const url = buildUrl({\n url: \"https://api.example.com/items\",\n params: {\n chain: 1,\n contract: \"0xabc\",\n active: true,\n skip: null,\n alsoSkip: undefined,\n },\n });\n expect(typeof url).toBe(\"string\");\n const parsed = new URL(url);\n expect(parsed.searchParams.get(\"chain\")).toBe(\"1\");\n expect(parsed.searchParams.get(\"contract\")).toBe(\"0xabc\");\n expect(parsed.searchParams.get(\"active\")).toBe(\"true\");\n expect(parsed.searchParams.has(\"skip\")).toBe(false);\n expect(parsed.searchParams.has(\"alsoSkip\")).toBe(false);\n });\n\n it(\"should preserve a pre-existing query string in the input URL\", () => {\n const url = buildUrl({\n url: \"https://api.example.com/items?keep=1\",\n params: { chain: 2 },\n });\n const parsed = new URL(url);\n expect(parsed.searchParams.get(\"keep\")).toBe(\"1\");\n expect(parsed.searchParams.get(\"chain\")).toBe(\"2\");\n });\n\n it(\"should percent-encode keys and values\", () => {\n const url = buildUrl({\n url: \"https://api.example.com/items\",\n params: { \"a key\": \"a value&b\" },\n });\n expect(url).toBe(\"https://api.example.com/items?a%20key=a%20value%26b\");\n });\n\n it(\"should not append a trailing slash after the last query value (facebook/react-native#54242)\", () => {\n const url = buildUrl({\n url: \"https://manager.api.live.ledger.com/api/get_device_version\",\n params: { target_id: 858783748, provider: 1 },\n });\n expect(typeof url).toBe(\"string\");\n expect(url).toBe(\n \"https://manager.api.live.ledger.com/api/get_device_version?target_id=858783748&provider=1\",\n );\n expect(url.endsWith(\"/\")).toBe(false);\n });\n\n it(\"should return a plain string (not a URL instance) so RN URL serialization is bypassed\", () => {\n const url = buildUrl({\n url: \"https://api.example.com/items\",\n params: { chain: 1 },\n });\n expect(typeof url).toBe(\"string\");\n expect(url).not.toBeInstanceOf(URL);\n });\n\n it(\"should still build the URL when URLSearchParams.set is unavailable (React Native regression)\", () => {\n const original = URLSearchParams.prototype.set;\n URLSearchParams.prototype.set = function notImplemented(): never {\n throw new Error(\"URLSearchParams.set is not implemented\");\n };\n try {\n const url = buildUrl({\n url: \"https://api.example.com/items\",\n params: { chain: 1, contract: \"0xabc\" },\n });\n expect(url).toContain(\"chain=1\");\n expect(url).toContain(\"contract=0xabc\");\n } finally {\n URLSearchParams.prototype.set = original;\n }\n });\n });\n\n describe(\"hasHeader\", () => {\n it(\"should find a header regardless of case\", () => {\n expect(hasHeader({ \"Content-Type\": \"json\" }, \"content-type\")).toBe(true);\n expect(hasHeader({ \"content-type\": \"json\" }, \"Content-Type\")).toBe(true);\n });\n\n it(\"should return false when no matching header exists\", () => {\n expect(hasHeader({ Accept: \"json\" }, \"content-type\")).toBe(false);\n expect(hasHeader({}, \"content-type\")).toBe(false);\n });\n });\n\n describe(\"isRawBody\", () => {\n it(\"should accept native BodyInit values\", () => {\n expect(isRawBody(\"raw-string\")).toBe(true);\n expect(isRawBody(new ArrayBuffer(4))).toBe(true);\n expect(isRawBody(new Uint8Array([1, 2, 3]))).toBe(true);\n expect(isRawBody(new Blob([\"a\"]))).toBe(true);\n expect(isRawBody(new FormData())).toBe(true);\n expect(isRawBody(new URLSearchParams({ a: \"1\" }))).toBe(true);\n expect(isRawBody(new ReadableStream())).toBe(true);\n });\n\n it(\"should reject plain objects and primitives\", () => {\n expect(isRawBody({ foo: \"bar\" })).toBe(false);\n expect(isRawBody([1, 2, 3])).toBe(false);\n expect(isRawBody(42)).toBe(false);\n expect(isRawBody(null)).toBe(false);\n expect(isRawBody(undefined)).toBe(false);\n });\n\n it(\"should not throw when optional Web globals are missing (React Native regression)\", () => {\n const globals = globalThis as unknown as Record<string, unknown>;\n const names = [\"Blob\", \"FormData\", \"URLSearchParams\", \"ReadableStream\"];\n const saved: Record<string, unknown> = {};\n for (const name of names) {\n saved[name] = globals[name];\n delete globals[name];\n }\n try {\n expect(() => isRawBody({ foo: \"bar\" })).not.toThrow();\n expect(isRawBody({ foo: \"bar\" })).toBe(false);\n expect(isRawBody(\"raw\")).toBe(true);\n expect(isRawBody(new Uint8Array([1]))).toBe(true);\n } finally {\n for (const name of names) {\n globals[name] = saved[name];\n }\n }\n });\n });\n\n describe(\"buildBodyAndHeaders\", () => {\n it(\"should merge default and per-request headers with per-request winning\", () => {\n const { headers } = buildBodyAndHeaders({\n method: \"GET\",\n body: undefined,\n defaultHeaders: { \"X-Default\": \"default\", \"X-Shared\": \"from-default\" },\n perRequestHeaders: { \"X-Shared\": \"overridden\", \"X-Per\": \"per\" },\n });\n expect(headers).toEqual({\n \"X-Default\": \"default\",\n \"X-Shared\": \"overridden\",\n \"X-Per\": \"per\",\n });\n });\n\n it(\"should not emit a body on GET/HEAD even when a body is provided\", () => {\n const result = buildBodyAndHeaders({\n method: \"GET\",\n body: { foo: \"bar\" },\n defaultHeaders: {},\n });\n expect(result.body).toBeUndefined();\n expect(result.headers[\"Content-Type\"]).toBeUndefined();\n });\n\n it(\"should JSON-stringify plain objects and set the Content-Type\", () => {\n const result = buildBodyAndHeaders({\n method: \"POST\",\n body: { foo: \"bar\" },\n defaultHeaders: {},\n });\n expect(result.body).toBe(JSON.stringify({ foo: \"bar\" }));\n expect(result.headers[\"Content-Type\"]).toBe(JSON_CONTENT_TYPE);\n });\n\n it(\"should not override an explicit Content-Type header\", () => {\n const result = buildBodyAndHeaders({\n method: \"POST\",\n body: { foo: \"bar\" },\n defaultHeaders: {},\n perRequestHeaders: { \"content-type\": \"application/vnd.custom+json\" },\n });\n expect(result.body).toBe(JSON.stringify({ foo: \"bar\" }));\n expect(result.headers[\"content-type\"]).toBe(\n \"application/vnd.custom+json\",\n );\n expect(result.headers[\"Content-Type\"]).toBeUndefined();\n });\n\n it(\"should pass raw BodyInit values through unchanged without JSON headers\", () => {\n const formData = new FormData();\n formData.set(\"field\", \"value\");\n const result = buildBodyAndHeaders({\n method: \"POST\",\n body: formData,\n defaultHeaders: {},\n });\n expect(result.body).toBe(formData);\n expect(result.headers[\"Content-Type\"]).toBeUndefined();\n });\n\n it(\"should return an undefined body when the body itself is undefined\", () => {\n const result = buildBodyAndHeaders({\n method: \"POST\",\n body: undefined,\n defaultHeaders: { \"X-Default\": \"d\" },\n });\n expect(result.body).toBeUndefined();\n expect(result.headers).toEqual({ \"X-Default\": \"d\" });\n });\n });\n\n describe(\"buildSignal\", () => {\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"GIVEN no timeout WHEN building a signal THEN it returns no signal\", () => {\n const result = buildSignal({\n timeoutMs: undefined,\n });\n\n expect(result.signal).toBeUndefined();\n expect(result.cleanup).toEqual(expect.any(Function));\n });\n\n it(\"GIVEN a zero timeout WHEN building a signal THEN it returns no signal\", () => {\n const result = buildSignal({\n timeoutMs: 0,\n });\n\n expect(result.signal).toBeUndefined();\n expect(result.cleanup).toEqual(expect.any(Function));\n });\n\n it(\"GIVEN a negative timeout WHEN building a signal THEN it returns no signal\", () => {\n const result = buildSignal({\n timeoutMs: -1,\n });\n\n expect(result.signal).toBeUndefined();\n expect(result.cleanup).toEqual(expect.any(Function));\n });\n\n it(\"GIVEN a positive timeout WHEN building a signal THEN it returns an AbortSignal\", () => {\n const { signal, cleanup } = buildSignal({\n timeoutMs: 1000,\n });\n\n expect(signal).toBeInstanceOf(AbortSignal);\n expect(signal?.aborted).toBe(false);\n cleanup();\n });\n\n it(\"GIVEN a positive timeout WHEN the delay elapses THEN it aborts the signal\", () => {\n vi.useFakeTimers();\n const { signal, cleanup } = buildSignal({\n timeoutMs: 1000,\n });\n\n expect(signal?.aborted).toBe(false);\n vi.advanceTimersByTime(999);\n expect(signal?.aborted).toBe(false);\n vi.advanceTimersByTime(1);\n expect(signal?.aborted).toBe(true);\n cleanup();\n });\n\n it(\"GIVEN a timeout signal WHEN cleanup runs before the delay THEN it does not abort\", () => {\n vi.useFakeTimers();\n const { signal, cleanup } = buildSignal({\n timeoutMs: 100,\n });\n\n cleanup();\n vi.advanceTimersByTime(100);\n\n expect(signal?.aborted).toBe(false);\n });\n });\n\n describe(\"parseBody\", () => {\n it(\"should return undefined for 'void' response type without consuming the body\", async () => {\n const response = new Response(\"ignored\");\n const result = await parseBody(response, \"void\");\n expect(result).toBeUndefined();\n expect(response.bodyUsed).toBe(false);\n });\n\n it(\"should return text for 'text' response type\", async () => {\n const response = new Response(\"plain-body\");\n await expect(parseBody(response, \"text\")).resolves.toBe(\"plain-body\");\n });\n\n it(\"should return a Blob for 'blob' response type\", async () => {\n const response = new Response(\"blob-body\");\n const result = await parseBody(response, \"blob\");\n expect(result).toBeInstanceOf(Blob);\n });\n\n it(\"should return an ArrayBuffer for 'arrayBuffer' response type\", async () => {\n const response = new Response(new Uint8Array([1, 2, 3]));\n const result = await parseBody(response, \"arrayBuffer\");\n expect(result).toBeInstanceOf(ArrayBuffer);\n expect(new Uint8Array(result as ArrayBuffer)).toEqual(\n new Uint8Array([1, 2, 3]),\n );\n });\n\n it(\"should parse JSON for 'json' response type\", async () => {\n const response = new Response(JSON.stringify({ hello: \"world\" }));\n await expect(parseBody(response, \"json\")).resolves.toEqual({\n hello: \"world\",\n });\n });\n\n it(\"should resolve to undefined for an empty JSON body\", async () => {\n const response = new Response(\"\");\n await expect(parseBody(response, \"json\")).resolves.toBeUndefined();\n });\n\n it(\"should throw a DmkNetworkClientError for malformed JSON\", async () => {\n const response = new Response(\"not-json\", {\n status: 200,\n statusText: \"OK\",\n });\n const error = await parseBody(response, \"json\").catch((e: unknown) => e);\n expect(error).toBeInstanceOf(DmkNetworkClientError);\n const dmkError = error as DmkNetworkClientError;\n expect(dmkError.status).toBe(200);\n expect(dmkError.statusText).toBe(\"OK\");\n expect(dmkError.responseBody).toBe(\"not-json\");\n expect(dmkError.cause).toBeInstanceOf(SyntaxError);\n });\n });\n\n describe(\"safeReadText\", () => {\n it(\"should return the text body\", async () => {\n await expect(safeReadText(new Response(\"hello\"))).resolves.toBe(\"hello\");\n });\n\n it(\"should return undefined when reading the body throws\", async () => {\n const response = {\n text: () => Promise.reject(new Error(\"read failed\")),\n } as unknown as Response;\n await expect(safeReadText(response)).resolves.toBeUndefined();\n });\n });\n\n describe(\"wrapFetchError\", () => {\n it(\"should wrap a generic Error with its message\", () => {\n const cause = new TypeError(\"network down\");\n const error = wrapFetchError({\n cause,\n timeoutMs: undefined,\n });\n expect(error).toBeInstanceOf(DmkNetworkClientError);\n expect(error.message).toBe(\"network down\");\n expect(error.cause).toBe(cause);\n expect(error.isTimeout).toBe(false);\n });\n\n it(\"should fall back to a generic message for non-Error causes\", () => {\n const error = wrapFetchError({\n cause: \"something\",\n timeoutMs: undefined,\n });\n expect(error.message).toBe(\"Network request failed\");\n expect(error.cause).toBe(\"something\");\n });\n\n it(\"should flag TimeoutError as a timeout\", () => {\n const cause = new Error(\"timed out\");\n cause.name = \"TimeoutError\";\n const error = wrapFetchError({\n cause,\n timeoutMs: 10,\n });\n expect(error.isTimeout).toBe(true);\n expect(error.message).toBe(\"Request timed out\");\n });\n\n it(\"should flag AbortError as a timeout when a timeout is configured and no external abort\", () => {\n const cause = new Error(\"aborted\");\n cause.name = \"AbortError\";\n const error = wrapFetchError({\n cause,\n timeoutMs: 1000,\n });\n expect(error.isTimeout).toBe(true);\n });\n\n it(\"should treat AbortError with no timeout and no external abort as a plain abort\", () => {\n const cause = new Error(\"aborted\");\n cause.name = \"AbortError\";\n const error = wrapFetchError({\n cause,\n timeoutMs: undefined,\n });\n expect(error.isTimeout).toBe(false);\n expect(error.message).toBe(\"Request aborted\");\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_DmkNetworkClientError", "import_DmkNetworkClientHelpers", "url", "parsed", "original", "globals", "names", "saved", "name", "headers", "result", "formData", "signal", "cleanup", "response", "error", "e", "dmkError", "cause"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var i=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var b=(r,n)=>{for(var t in n)i(r,t,{get:n[t],enumerable:!0})},c=(r,n,t,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of s(n))!g.call(r,o)&&o!==t&&i(r,o,{get:()=>n[o],enumerable:!(e=u(n,o))||e.enumerable});return r};var l=r=>c(i({},"__esModule",{value:!0}),r);var y={};b(y,{base64StringToBuffer:()=>d,bufferToBase64String:()=>h,isBase64String:()=>a});module.exports=l(y);function a(r){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(r)}function d(r){if(r.length===0)return new Uint8Array;if(!a(r))return null;try{const n=atob(r),t=new Uint8Array(n.length);for(let e=0;e<n.length;e++)t[e]=n.charCodeAt(e);return t}catch{return Uint8Array.from(Buffer.from(r,"base64"))}}function h(r){const n=globalThis;if(typeof n.btoa=="function"){let e="";for(let o=0;o<r.length;o++){const f=r[o];if(f===void 0)throw new Error("Unexpected undefined byte in array.");e+=String.fromCharCode(f)}return n.btoa(e)}const t=n.Buffer;if(typeof t<"u")return t.from(r).toString("base64");throw new Error("No Base64 encoder available in this environment.")}0&&(module.exports={base64StringToBuffer,bufferToBase64String,isBase64String});
1
+ "use strict";var f=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var b=(e,n)=>{for(var r in n)f(e,r,{get:n[r],enumerable:!0})},g=(e,n,r,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of s(n))!l.call(e,t)&&t!==r&&f(e,t,{get:()=>n[t],enumerable:!(i=d(n,t))||i.enumerable});return e};var w=e=>g(f({},"__esModule",{value:!0}),e);var B={};b(B,{base64StringToBuffer:()=>y,bufferToBase64String:()=>p,isBase64String:()=>u});module.exports=w(B);function a(e){return e.replace(/\s/g,"")}function u(e){const n=a(e);return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(n)}function c(){if(typeof window<"u"&&typeof window.atob=="function")return window.atob.bind(window);if(typeof atob=="function")return atob}function h(){if(typeof window<"u"&&typeof window.btoa=="function")return window.btoa.bind(window);if(typeof btoa=="function")return btoa}function y(e){const n=a(e);if(n.length===0)return new Uint8Array;if(!u(n))return null;const r=c();if(r){const i=r(n),t=new Uint8Array(i.length);for(let o=0;o<i.length;o++)t[o]=i.charCodeAt(o);return t}if(typeof globalThis.Buffer<"u")return Uint8Array.from(globalThis.Buffer.from(n,"base64"));throw new Error("No Base64 decoder available in this environment.")}function p(e){const n=h();if(n){let r="";for(let i=0;i<e.length;i++){const t=e[i];if(t===void 0)throw new Error("Unexpected undefined byte in array.");r+=String.fromCharCode(t)}return n(r)}if(typeof globalThis.Buffer<"u")return globalThis.Buffer.from(e).toString("base64");throw new Error("No Base64 encoder available in this environment.")}0&&(module.exports={base64StringToBuffer,bufferToBase64String,isBase64String});
2
2
  //# sourceMappingURL=Base64String.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/api/utils/Base64String.ts"],
4
- "sourcesContent": ["export function isBase64String(value: string): boolean {\n // Valid base64 characters are [A-Za-z0-9+/]\n // They are always grouped by 4 characters.\n // Optional padding at the end with one or two '='.\n // see section 4 of: https://www.rfc-editor.org/rfc/rfc4648.txt\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n value,\n );\n}\n\nexport function base64StringToBuffer(value: string): Uint8Array | null {\n if (value.length === 0) {\n return new Uint8Array();\n }\n if (!isBase64String(value)) {\n return null;\n }\n try {\n // Use the browser implementation of atob\n const base64Decoded = atob(value);\n const buffer = new Uint8Array(base64Decoded.length);\n for (let i = 0; i < base64Decoded.length; i++) {\n buffer[i] = base64Decoded.charCodeAt(i);\n }\n return buffer;\n } catch (_error: unknown) {\n // Use the implementation of Buffer for environments such as node\n return Uint8Array.from(Buffer.from(value, \"base64\"));\n }\n}\n\nexport function bufferToBase64String(bytes: Uint8Array): string {\n const g = globalThis as typeof globalThis & {\n Buffer?: typeof Buffer;\n btoa?: (data: string) => string;\n };\n\n if (typeof g.btoa === \"function\") {\n // convert bytes to a binary string for btoa\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n const byte = bytes[i];\n if (byte === undefined) {\n throw new Error(\"Unexpected undefined byte in array.\");\n }\n binary += String.fromCharCode(byte);\n }\n return g.btoa(binary);\n }\n\n const Buf = g.Buffer;\n if (typeof Buf !== \"undefined\") {\n return Buf.from(bytes).toString(\"base64\");\n }\n\n throw new Error(\"No Base64 encoder available in this environment.\");\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,EAAA,yBAAAC,EAAA,mBAAAC,IAAA,eAAAC,EAAAL,GAAO,SAASI,EAAeE,EAAwB,CAKrD,MAAO,mEAAmE,KACxEA,CACF,CACF,CAEO,SAASJ,EAAqBI,EAAkC,CACrE,GAAIA,EAAM,SAAW,EACnB,OAAO,IAAI,WAEb,GAAI,CAACF,EAAeE,CAAK,EACvB,OAAO,KAET,GAAI,CAEF,MAAMC,EAAgB,KAAKD,CAAK,EAC1BE,EAAS,IAAI,WAAWD,EAAc,MAAM,EAClD,QAASE,EAAI,EAAGA,EAAIF,EAAc,OAAQE,IACxCD,EAAOC,CAAC,EAAIF,EAAc,WAAWE,CAAC,EAExC,OAAOD,CACT,MAA0B,CAExB,OAAO,WAAW,KAAK,OAAO,KAAKF,EAAO,QAAQ,CAAC,CACrD,CACF,CAEO,SAASH,EAAqBO,EAA2B,CAC9D,MAAMC,EAAI,WAKV,GAAI,OAAOA,EAAE,MAAS,WAAY,CAEhC,IAAIC,EAAS,GACb,QAASH,EAAI,EAAGA,EAAIC,EAAM,OAAQD,IAAK,CACrC,MAAMI,EAAOH,EAAMD,CAAC,EACpB,GAAII,IAAS,OACX,MAAM,IAAI,MAAM,qCAAqC,EAEvDD,GAAU,OAAO,aAAaC,CAAI,CACpC,CACA,OAAOF,EAAE,KAAKC,CAAM,CACtB,CAEA,MAAME,EAAMH,EAAE,OACd,GAAI,OAAOG,EAAQ,IACjB,OAAOA,EAAI,KAAKJ,CAAK,EAAE,SAAS,QAAQ,EAG1C,MAAM,IAAI,MAAM,kDAAkD,CACpE",
6
- "names": ["Base64String_exports", "__export", "base64StringToBuffer", "bufferToBase64String", "isBase64String", "__toCommonJS", "value", "base64Decoded", "buffer", "i", "bytes", "g", "binary", "byte", "Buf"]
4
+ "sourcesContent": ["function normalizeBase64String(value: string): string {\n return value.replace(/\\s/g, \"\");\n}\n\nexport function isBase64String(value: string): boolean {\n const normalizedValue = normalizeBase64String(value);\n // Valid base64 characters are [A-Za-z0-9+/]\n // They are always grouped by 4 characters.\n // Optional padding at the end with one or two '='.\n // ASCII whitespace is ignored because some native APIs emit MIME-style\n // Base64 with line breaks.\n // see section 4 of: https://www.rfc-editor.org/rfc/rfc4648.txt\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n normalizedValue,\n );\n}\n\n/**\n * Prefer `window.atob` in browser runtimes where Base64 helpers are exposed on\n * `window`; fall back to global `atob` for runtimes such as Hermes.\n */\nfunction getAtob(): ((data: string) => string) | undefined {\n if (typeof window !== \"undefined\" && typeof window.atob === \"function\") {\n return window.atob.bind(window);\n }\n // eslint-disable-next-line no-restricted-globals -- portable smart-switch: probe the bare global as a Hermes/RN fallback.\n if (typeof atob === \"function\") {\n // eslint-disable-next-line no-restricted-globals -- portable smart-switch: probe the bare global as a Hermes/RN fallback.\n return atob;\n }\n return undefined;\n}\n\n/**\n * Prefer `window.btoa` in browser runtimes where Base64 helpers are exposed on\n * `window`; fall back to global `btoa` for runtimes such as Hermes.\n */\nfunction getBtoa(): ((data: string) => string) | undefined {\n if (typeof window !== \"undefined\" && typeof window.btoa === \"function\") {\n return window.btoa.bind(window);\n }\n // eslint-disable-next-line no-restricted-globals -- portable smart-switch: probe the bare global as a Hermes/RN fallback.\n if (typeof btoa === \"function\") {\n // eslint-disable-next-line no-restricted-globals -- portable smart-switch: probe the bare global as a Hermes/RN fallback.\n return btoa;\n }\n return undefined;\n}\n\nexport function base64StringToBuffer(value: string): Uint8Array | null {\n const normalizedValue = normalizeBase64String(value);\n if (normalizedValue.length === 0) {\n return new Uint8Array();\n }\n if (!isBase64String(normalizedValue)) {\n return null;\n }\n const atobFn = getAtob();\n\n if (atobFn) {\n const base64Decoded = atobFn(normalizedValue);\n const buffer = new Uint8Array(base64Decoded.length);\n for (let i = 0; i < base64Decoded.length; i++) {\n buffer[i] = base64Decoded.charCodeAt(i);\n }\n return buffer;\n }\n\n if (typeof globalThis.Buffer !== \"undefined\") {\n return Uint8Array.from(globalThis.Buffer.from(normalizedValue, \"base64\"));\n }\n\n throw new Error(\"No Base64 decoder available in this environment.\");\n}\n\nexport function bufferToBase64String(bytes: Uint8Array): string {\n const btoaFn = getBtoa();\n\n if (btoaFn) {\n // convert bytes to a binary string for btoa\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n const byte = bytes[i];\n if (byte === undefined) {\n throw new Error(\"Unexpected undefined byte in array.\");\n }\n binary += String.fromCharCode(byte);\n }\n return btoaFn(binary);\n }\n\n if (typeof globalThis.Buffer !== \"undefined\") {\n return globalThis.Buffer.from(bytes).toString(\"base64\");\n }\n\n throw new Error(\"No Base64 encoder available in this environment.\");\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,EAAA,yBAAAC,EAAA,mBAAAC,IAAA,eAAAC,EAAAL,GAAA,SAASM,EAAsBC,EAAuB,CACpD,OAAOA,EAAM,QAAQ,MAAO,EAAE,CAChC,CAEO,SAASH,EAAeG,EAAwB,CACrD,MAAMC,EAAkBF,EAAsBC,CAAK,EAOnD,MAAO,mEAAmE,KACxEC,CACF,CACF,CAMA,SAASC,GAAkD,CACzD,GAAI,OAAO,OAAW,KAAe,OAAO,OAAO,MAAS,WAC1D,OAAO,OAAO,KAAK,KAAK,MAAM,EAGhC,GAAI,OAAO,MAAS,WAElB,OAAO,IAGX,CAMA,SAASC,GAAkD,CACzD,GAAI,OAAO,OAAW,KAAe,OAAO,OAAO,MAAS,WAC1D,OAAO,OAAO,KAAK,KAAK,MAAM,EAGhC,GAAI,OAAO,MAAS,WAElB,OAAO,IAGX,CAEO,SAASR,EAAqBK,EAAkC,CACrE,MAAMC,EAAkBF,EAAsBC,CAAK,EACnD,GAAIC,EAAgB,SAAW,EAC7B,OAAO,IAAI,WAEb,GAAI,CAACJ,EAAeI,CAAe,EACjC,OAAO,KAET,MAAMG,EAASF,EAAQ,EAEvB,GAAIE,EAAQ,CACV,MAAMC,EAAgBD,EAAOH,CAAe,EACtCK,EAAS,IAAI,WAAWD,EAAc,MAAM,EAClD,QAASE,EAAI,EAAGA,EAAIF,EAAc,OAAQE,IACxCD,EAAOC,CAAC,EAAIF,EAAc,WAAWE,CAAC,EAExC,OAAOD,CACT,CAEA,GAAI,OAAO,WAAW,OAAW,IAC/B,OAAO,WAAW,KAAK,WAAW,OAAO,KAAKL,EAAiB,QAAQ,CAAC,EAG1E,MAAM,IAAI,MAAM,kDAAkD,CACpE,CAEO,SAASL,EAAqBY,EAA2B,CAC9D,MAAMC,EAASN,EAAQ,EAEvB,GAAIM,EAAQ,CAEV,IAAIC,EAAS,GACb,QAAS,EAAI,EAAG,EAAIF,EAAM,OAAQ,IAAK,CACrC,MAAMG,EAAOH,EAAM,CAAC,EACpB,GAAIG,IAAS,OACX,MAAM,IAAI,MAAM,qCAAqC,EAEvDD,GAAU,OAAO,aAAaC,CAAI,CACpC,CACA,OAAOF,EAAOC,CAAM,CACtB,CAEA,GAAI,OAAO,WAAW,OAAW,IAC/B,OAAO,WAAW,OAAO,KAAKF,CAAK,EAAE,SAAS,QAAQ,EAGxD,MAAM,IAAI,MAAM,kDAAkD,CACpE",
6
+ "names": ["Base64String_exports", "__export", "base64StringToBuffer", "bufferToBase64String", "isBase64String", "__toCommonJS", "normalizeBase64String", "value", "normalizedValue", "getAtob", "getBtoa", "atobFn", "base64Decoded", "buffer", "i", "bytes", "btoaFn", "binary", "byte"]
7
7
  }
@@ -1,2 +1,4 @@
1
- "use strict";var t=require("./Base64String");describe("Base64String",()=>{describe("isBase64String function",()=>{it("should return true if the value is a valid base64 string",()=>{const e=(0,t.isBase64String)("Zmlyc3QgdG/zdGluZyBz+HI9");expect(e).toBeTruthy()}),it("should return true if the value is a valid base64 string, one padding",()=>{const e=(0,t.isBase64String)("Zmlyc3QgdGVzdGluZyBzdHI=");expect(e).toBeTruthy()}),it("should return true if the value is a valid base64 string, two paddings",()=>{const e=(0,t.isBase64String)("Zmlyc3QgdGVzdGluZyBzdH==");expect(e).toBeTruthy()}),it("should return true for an empty string",()=>{const e=(0,t.isBase64String)("");expect(e).toBeTruthy()}),it("should return false for an invalid base64 string",()=>{const e=(0,t.isBase64String)("invalid base64 string");expect(e).toBeFalsy()}),it("should return false with 3 paddings",()=>{const e=(0,t.isBase64String)("Zmlyc3QgdGVzdGluZyBzd===");expect(e).toBeFalsy()}),it("should return false on incomplete string (not multiple of 4)",()=>{const e=(0,t.isBase64String)("Zmlyc3QgdGVzdGluZyBzdHI");expect(e).toBeFalsy()})}),describe("base64StringToBuffer function",()=>{beforeEach(()=>{vi.resetAllMocks()}),it("should convert empty input to empty buffer",()=>{const e=(0,t.base64StringToBuffer)("");expect(e).toStrictEqual(new Uint8Array)}),it("invalid base64 string converted to null",()=>{const e=(0,t.base64StringToBuffer)("invalid string");expect(e).toStrictEqual(null)}),it("should convert a base64 string to a buffer using browser's atob",()=>{const e=(0,t.base64StringToBuffer)("Zmlyc3QgdGVzdCBzdHJpbmc=");expect(e).toStrictEqual(Uint8Array.from([102,105,114,115,116,32,116,101,115,116,32,115,116,114,105,110,103]))}),it("should convert a base64 string to a buffer using Buffer",()=>{vi.spyOn(global,"atob").mockImplementation(()=>{throw new Error("atob is not defined")});const e=(0,t.base64StringToBuffer)("Zmlyc3QgdGVzdCBzdHJpbmc=");expect(e).toStrictEqual(Uint8Array.from([102,105,114,115,116,32,116,101,115,116,32,115,116,114,105,110,103]))})})});describe("bufferToBase64String",()=>{const a=globalThis.btoa,e=globalThis.Buffer;beforeEach(()=>{vi.restoreAllMocks(),globalThis.btoa=a,globalThis.Buffer=e}),afterAll(()=>{globalThis.btoa=a,globalThis.Buffer=e}),it("should encode an empty buffer to an empty base64 string when btoa is available",()=>{globalThis.btoa=vi.fn(o=>(expect(o).toBe(""),""));const s=new Uint8Array,n=(0,t.bufferToBase64String)(s);expect(n).toBe(""),expect(globalThis.btoa).toHaveBeenCalledTimes(1)}),it("should encode a buffer to base64 using btoa when available",()=>{const s="first testing str",n=Uint8Array.from(s.split("").map(r=>r.charCodeAt(0)));globalThis.btoa=vi.fn(r=>(expect(r).toBe(s),"Zmlyc3QgdGVzdGluZyBzdHI="));const o=(0,t.bufferToBase64String)(n);expect(o).toBe("Zmlyc3QgdGVzdGluZyBzdHI="),expect(globalThis.btoa).toHaveBeenCalledTimes(1)}),it("should encode a buffer to base64 using Buffer when btoa is not available",()=>{globalThis.btoa=void 0;const s="testing str",n=Buffer.from(s,"binary").toString("base64"),o=Uint8Array.from(s.split("").map(i=>i.charCodeAt(0))),r=vi.spyOn(Buffer,"from"),l=(0,t.bufferToBase64String)(o);expect(l).toBe(n),expect(r).toHaveBeenCalledTimes(1)}),it("should throw an error when no Base64 encoder is available",()=>{globalThis.btoa=void 0,globalThis.Buffer=void 0;const s=Uint8Array.from([1,2,3]);expect(()=>(0,t.bufferToBase64String)(s)).toThrowError("No Base64 encoder available in this environment.")}),it("should throw if an undefined byte is encountered (defensive check)",()=>{const s={length:3,0:102,1:void 0,2:111};globalThis.btoa=vi.fn(),expect(()=>(0,t.bufferToBase64String)(s)).toThrowError("Unexpected undefined byte in array.")})});
1
+ "use strict";var t=require("./Base64String");describe("Base64String",()=>{describe("isBase64String function",()=>{it("should return true if the value is a valid base64 string",()=>{const a=(0,t.isBase64String)("Zmlyc3QgdG/zdGluZyBz+HI9");expect(a).toBeTruthy()}),it("should return true if the value is a valid base64 string, one padding",()=>{const a=(0,t.isBase64String)("Zmlyc3QgdGVzdGluZyBzdHI=");expect(a).toBeTruthy()}),it("should return true if the value is a valid base64 string, two paddings",()=>{const a=(0,t.isBase64String)("Zmlyc3QgdGVzdGluZyBzdH==");expect(a).toBeTruthy()}),it("should return true for an empty string",()=>{const a=(0,t.isBase64String)("");expect(a).toBeTruthy()}),it("GIVEN a base64 string with whitespace WHEN validating THEN it returns true",()=>{const a=(0,t.isBase64String)(`AQID
2
+ kAA=`);expect(a).toBeTruthy()}),it("should return false for an invalid base64 string",()=>{const a=(0,t.isBase64String)("invalid base64 string");expect(a).toBeFalsy()}),it("should return false with 3 paddings",()=>{const a=(0,t.isBase64String)("Zmlyc3QgdGVzdGluZyBzd===");expect(a).toBeFalsy()}),it("should return false on incomplete string (not multiple of 4)",()=>{const a=(0,t.isBase64String)("Zmlyc3QgdGVzdGluZyBzdHI");expect(a).toBeFalsy()})}),describe("base64StringToBuffer function",()=>{const s=globalThis.atob,a=globalThis.Buffer,l=globalThis.window;beforeEach(()=>{vi.restoreAllMocks(),globalThis.atob=s,globalThis.Buffer=a,globalThis.window=void 0}),afterAll(()=>{globalThis.atob=s,globalThis.Buffer=a,globalThis.window=l}),it("should convert empty input to empty buffer",()=>{const o=(0,t.base64StringToBuffer)("");expect(o).toStrictEqual(new Uint8Array)}),it("invalid base64 string converted to null",()=>{const o=(0,t.base64StringToBuffer)("invalid string");expect(o).toStrictEqual(null)}),it("GIVEN a base64 string with whitespace WHEN decoding THEN it ignores the whitespace",()=>{const o=(0,t.base64StringToBuffer)(`AQID
3
+ kAA=`);expect(o).toStrictEqual(Uint8Array.from([1,2,3,144,0]))}),describe("runtime compatibility fallbacks",()=>{it("GIVEN window.atob is available WHEN decoding THEN it uses window.atob",()=>{const e="Zmlyc3QgdGVzdCBzdHJpbmc=",o=vi.fn(()=>"first test string"),n=vi.fn(()=>"unexpected");globalThis.window={atob:o},globalThis.atob=n;const i=(0,t.base64StringToBuffer)(e);expect(i).toStrictEqual(Uint8Array.from([102,105,114,115,116,32,116,101,115,116,32,115,116,114,105,110,103])),expect(o).toHaveBeenCalledWith(e),expect(n).not.toHaveBeenCalled()}),it("GIVEN global atob is available WHEN decoding THEN it uses global atob",()=>{const e="Zmlyc3QgdGVzdCBzdHJpbmc=",o=vi.fn(()=>"first test string");globalThis.atob=o;const n=(0,t.base64StringToBuffer)(e);expect(n).toStrictEqual(Uint8Array.from([102,105,114,115,116,32,116,101,115,116,32,115,116,114,105,110,103])),expect(o).toHaveBeenCalledWith(e)}),it("GIVEN atob is not available WHEN decoding THEN it uses Buffer",()=>{globalThis.atob=void 0;const e="Zmlyc3QgdGVzdCBzdHJpbmc=",o=vi.spyOn(Buffer,"from"),n=(0,t.base64StringToBuffer)(e);expect(n).toStrictEqual(Uint8Array.from([102,105,114,115,116,32,116,101,115,116,32,115,116,114,105,110,103])),expect(o).toHaveBeenCalledWith(e,"base64")}),it("GIVEN no decoder is available WHEN decoding THEN it throws",()=>{globalThis.atob=void 0,globalThis.Buffer=void 0;const e="Zmlyc3QgdGVzdCBzdHJpbmc=";expect(()=>(0,t.base64StringToBuffer)(e)).toThrowError("No Base64 decoder available in this environment.")})})})});describe("bufferToBase64String",()=>{const s=globalThis.btoa,a=globalThis.Buffer,l=globalThis.window;beforeEach(()=>{vi.restoreAllMocks(),globalThis.btoa=s,globalThis.Buffer=a,globalThis.window=void 0}),afterAll(()=>{globalThis.btoa=s,globalThis.Buffer=a,globalThis.window=l}),it("should encode an empty buffer to an empty base64 string when btoa is available",()=>{globalThis.btoa=vi.fn(n=>(expect(n).toBe(""),""));const e=new Uint8Array,o=(0,t.bufferToBase64String)(e);expect(o).toBe(""),expect(globalThis.btoa).toHaveBeenCalledTimes(1)}),describe("runtime compatibility fallbacks",()=>{it("GIVEN global btoa is available WHEN encoding THEN it uses global btoa",()=>{const e="first testing str",o=Uint8Array.from(e.split("").map(i=>i.charCodeAt(0)));globalThis.btoa=vi.fn(i=>(expect(i).toBe(e),"Zmlyc3QgdGVzdGluZyBzdHI="));const n=(0,t.bufferToBase64String)(o);expect(n).toBe("Zmlyc3QgdGVzdGluZyBzdHI="),expect(globalThis.btoa).toHaveBeenCalledTimes(1)}),it("GIVEN window.btoa is available WHEN encoding THEN it uses window.btoa",()=>{const e="first testing str",o=Uint8Array.from(e.split("").map(c=>c.charCodeAt(0))),n=vi.fn(()=>"Zmlyc3QgdGVzdGluZyBzdHI="),i=vi.fn(()=>"unexpected");globalThis.window={btoa:n},globalThis.btoa=i;const r=(0,t.bufferToBase64String)(o);expect(r).toBe("Zmlyc3QgdGVzdGluZyBzdHI="),expect(n).toHaveBeenCalledWith(e),expect(i).not.toHaveBeenCalled()}),it("GIVEN btoa is not available WHEN encoding THEN it uses Buffer",()=>{globalThis.btoa=void 0;const e="testing str",o=Buffer.from(e,"binary").toString("base64"),n=Uint8Array.from(e.split("").map(c=>c.charCodeAt(0))),i=vi.spyOn(Buffer,"from"),r=(0,t.bufferToBase64String)(n);expect(r).toBe(o),expect(i).toHaveBeenCalledTimes(1)}),it("GIVEN no encoder is available WHEN encoding THEN it throws",()=>{globalThis.btoa=void 0,globalThis.Buffer=void 0;const e=Uint8Array.from([1,2,3]);expect(()=>(0,t.bufferToBase64String)(e)).toThrowError("No Base64 encoder available in this environment.")})}),it("should throw if an undefined byte is encountered (defensive check)",()=>{const e={length:3,0:102,1:void 0,2:111};globalThis.btoa=vi.fn(),expect(()=>(0,t.bufferToBase64String)(e)).toThrowError("Unexpected undefined byte in array.")})});
2
4
  //# sourceMappingURL=Base64String.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/api/utils/Base64String.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n base64StringToBuffer,\n bufferToBase64String,\n isBase64String,\n} from \"./Base64String\";\n\ndescribe(\"Base64String\", () => {\n describe(\"isBase64String function\", () => {\n it(\"should return true if the value is a valid base64 string\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdG/zdGluZyBz+HI9\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeTruthy();\n });\n\n it(\"should return true if the value is a valid base64 string, one padding\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdGluZyBzdHI=\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeTruthy();\n });\n\n it(\"should return true if the value is a valid base64 string, two paddings\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdGluZyBzdH==\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeTruthy();\n });\n\n it(\"should return true for an empty string\", () => {\n // GIVEN\n const value = \"\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeTruthy();\n });\n\n it(\"should return false for an invalid base64 string\", () => {\n // GIVEN\n const value = \"invalid base64 string\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeFalsy();\n });\n\n it(\"should return false with 3 paddings\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdGluZyBzd===\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeFalsy();\n });\n\n it(\"should return false on incomplete string (not multiple of 4)\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdGluZyBzdHI\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeFalsy();\n });\n });\n\n describe(\"base64StringToBuffer function\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n it(\"should convert empty input to empty buffer\", () => {\n // GIVEN\n const value = \"\";\n\n // WHEN\n const result = base64StringToBuffer(value);\n\n // THEN\n expect(result).toStrictEqual(new Uint8Array());\n });\n\n it(\"invalid base64 string converted to null\", () => {\n // GIVEN\n const value = \"invalid string\";\n\n // WHEN\n const result = base64StringToBuffer(value);\n\n // THEN\n expect(result).toStrictEqual(null);\n });\n\n it(\"should convert a base64 string to a buffer using browser's atob\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdCBzdHJpbmc=\";\n\n // WHEN\n const result = base64StringToBuffer(value);\n\n // THEN\n expect(result).toStrictEqual(\n Uint8Array.from([\n 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20,\n 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n ]),\n );\n });\n\n it(\"should convert a base64 string to a buffer using Buffer\", () => {\n // GIVEN\n vi.spyOn(global, \"atob\").mockImplementation(() => {\n throw new Error(\"atob is not defined\");\n });\n const value = \"Zmlyc3QgdGVzdCBzdHJpbmc=\";\n\n // WHEN\n const result = base64StringToBuffer(value);\n\n // THEN\n expect(result).toStrictEqual(\n Uint8Array.from([\n 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20,\n 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n ]),\n );\n });\n });\n});\n\ndescribe(\"bufferToBase64String\", () => {\n const originalBtoa = (globalThis as any).btoa;\n const originalBuffer = (globalThis as any).Buffer;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n (globalThis as any).btoa = originalBtoa;\n (globalThis as any).Buffer = originalBuffer;\n });\n\n afterAll(() => {\n (globalThis as any).btoa = originalBtoa;\n (globalThis as any).Buffer = originalBuffer;\n });\n\n it(\"should encode an empty buffer to an empty base64 string when btoa is available\", () => {\n // GIVEN\n (globalThis as any).btoa = vi.fn((input: string) => {\n expect(input).toBe(\"\");\n return \"\";\n });\n\n const bytes = new Uint8Array();\n\n // WHEN\n const result = bufferToBase64String(bytes);\n\n // THEN\n expect(result).toBe(\"\");\n expect(globalThis.btoa).toHaveBeenCalledTimes(1);\n });\n\n it(\"should encode a buffer to base64 using btoa when available\", () => {\n // GIVEN\n const text = \"first testing str\";\n const bytes = Uint8Array.from(text.split(\"\").map((c) => c.charCodeAt(0)));\n\n (globalThis as any).btoa = vi.fn((input: string) => {\n expect(input).toBe(text);\n return \"Zmlyc3QgdGVzdGluZyBzdHI=\";\n });\n\n // WHEN\n const result = bufferToBase64String(bytes);\n\n // THEN\n expect(result).toBe(\"Zmlyc3QgdGVzdGluZyBzdHI=\");\n expect(globalThis.btoa).toHaveBeenCalledTimes(1);\n });\n\n it(\"should encode a buffer to base64 using Buffer when btoa is not available\", () => {\n // GIVEN\n (globalThis as any).btoa = undefined;\n\n const text = \"testing str\";\n const expectedBase64 = Buffer.from(text, \"binary\").toString(\"base64\");\n const bytes = Uint8Array.from(text.split(\"\").map((c) => c.charCodeAt(0)));\n\n const bufferFromSpy = vi.spyOn(Buffer, \"from\");\n\n // WHEN\n const result = bufferToBase64String(bytes);\n\n // THEN\n expect(result).toBe(expectedBase64);\n expect(bufferFromSpy).toHaveBeenCalledTimes(1);\n });\n\n it(\"should throw an error when no Base64 encoder is available\", () => {\n // GIVEN\n (globalThis as any).btoa = undefined;\n (globalThis as any).Buffer = undefined;\n\n const bytes = Uint8Array.from([0x01, 0x02, 0x03]);\n\n // WHEN / THEN\n expect(() => bufferToBase64String(bytes)).toThrowError(\n \"No Base64 encoder available in this environment.\",\n );\n });\n\n it(\"should throw if an undefined byte is encountered (defensive check)\", () => {\n // GIVEN\n const bytes = {\n length: 3,\n 0: 0x66,\n 1: undefined,\n 2: 0x6f,\n } as unknown as Uint8Array;\n\n (globalThis as any).btoa = vi.fn();\n\n // WHEN / THEN\n expect(() => bufferToBase64String(bytes)).toThrowError(\n \"Unexpected undefined byte in array.\",\n );\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_Base64String", "result", "originalBtoa", "originalBuffer", "input", "bytes", "text", "c", "expectedBase64", "bufferFromSpy"]
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n base64StringToBuffer,\n bufferToBase64String,\n isBase64String,\n} from \"./Base64String\";\n\ndescribe(\"Base64String\", () => {\n describe(\"isBase64String function\", () => {\n it(\"should return true if the value is a valid base64 string\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdG/zdGluZyBz+HI9\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeTruthy();\n });\n\n it(\"should return true if the value is a valid base64 string, one padding\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdGluZyBzdHI=\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeTruthy();\n });\n\n it(\"should return true if the value is a valid base64 string, two paddings\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdGluZyBzdH==\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeTruthy();\n });\n\n it(\"should return true for an empty string\", () => {\n // GIVEN\n const value = \"\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeTruthy();\n });\n\n it(\"GIVEN a base64 string with whitespace WHEN validating THEN it returns true\", () => {\n // GIVEN\n const value = \"AQID\\nkAA=\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeTruthy();\n });\n\n it(\"should return false for an invalid base64 string\", () => {\n // GIVEN\n const value = \"invalid base64 string\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeFalsy();\n });\n\n it(\"should return false with 3 paddings\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdGluZyBzd===\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeFalsy();\n });\n\n it(\"should return false on incomplete string (not multiple of 4)\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdGluZyBzdHI\";\n\n // WHEN\n const result = isBase64String(value);\n\n // THEN\n expect(result).toBeFalsy();\n });\n });\n\n describe(\"base64StringToBuffer function\", () => {\n const originalAtob = (globalThis as any).atob;\n const originalBuffer = (globalThis as any).Buffer;\n const originalWindow = (globalThis as any).window;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n (globalThis as any).atob = originalAtob;\n (globalThis as any).Buffer = originalBuffer;\n (globalThis as any).window = undefined;\n });\n\n afterAll(() => {\n (globalThis as any).atob = originalAtob;\n (globalThis as any).Buffer = originalBuffer;\n (globalThis as any).window = originalWindow;\n });\n\n it(\"should convert empty input to empty buffer\", () => {\n // GIVEN\n const value = \"\";\n\n // WHEN\n const result = base64StringToBuffer(value);\n\n // THEN\n expect(result).toStrictEqual(new Uint8Array());\n });\n\n it(\"invalid base64 string converted to null\", () => {\n // GIVEN\n const value = \"invalid string\";\n\n // WHEN\n const result = base64StringToBuffer(value);\n\n // THEN\n expect(result).toStrictEqual(null);\n });\n\n it(\"GIVEN a base64 string with whitespace WHEN decoding THEN it ignores the whitespace\", () => {\n // GIVEN\n const value = \"AQID\\nkAA=\";\n\n // WHEN\n const result = base64StringToBuffer(value);\n\n // THEN\n expect(result).toStrictEqual(\n Uint8Array.from([0x01, 0x02, 0x03, 0x90, 0x00]),\n );\n });\n\n describe(\"runtime compatibility fallbacks\", () => {\n it(\"GIVEN window.atob is available WHEN decoding THEN it uses window.atob\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdCBzdHJpbmc=\";\n const windowAtob = vi.fn(() => \"first test string\");\n const globalAtob = vi.fn(() => \"unexpected\");\n (globalThis as any).window = { atob: windowAtob };\n (globalThis as any).atob = globalAtob;\n\n // WHEN\n const result = base64StringToBuffer(value);\n\n // THEN\n expect(result).toStrictEqual(\n Uint8Array.from([\n 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20,\n 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n ]),\n );\n expect(windowAtob).toHaveBeenCalledWith(value);\n expect(globalAtob).not.toHaveBeenCalled();\n });\n\n it(\"GIVEN global atob is available WHEN decoding THEN it uses global atob\", () => {\n // GIVEN\n const value = \"Zmlyc3QgdGVzdCBzdHJpbmc=\";\n const globalAtob = vi.fn(() => \"first test string\");\n (globalThis as any).atob = globalAtob;\n\n // WHEN\n const result = base64StringToBuffer(value);\n\n // THEN\n expect(result).toStrictEqual(\n Uint8Array.from([\n 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20,\n 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n ]),\n );\n expect(globalAtob).toHaveBeenCalledWith(value);\n });\n\n it(\"GIVEN atob is not available WHEN decoding THEN it uses Buffer\", () => {\n // GIVEN\n (globalThis as any).atob = undefined;\n const value = \"Zmlyc3QgdGVzdCBzdHJpbmc=\";\n const bufferFromSpy = vi.spyOn(Buffer, \"from\");\n\n // WHEN\n const result = base64StringToBuffer(value);\n\n // THEN\n expect(result).toStrictEqual(\n Uint8Array.from([\n 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20,\n 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n ]),\n );\n expect(bufferFromSpy).toHaveBeenCalledWith(value, \"base64\");\n });\n\n it(\"GIVEN no decoder is available WHEN decoding THEN it throws\", () => {\n // GIVEN\n (globalThis as any).atob = undefined;\n (globalThis as any).Buffer = undefined;\n const value = \"Zmlyc3QgdGVzdCBzdHJpbmc=\";\n\n // WHEN / THEN\n expect(() => base64StringToBuffer(value)).toThrowError(\n \"No Base64 decoder available in this environment.\",\n );\n });\n });\n });\n});\n\ndescribe(\"bufferToBase64String\", () => {\n const originalBtoa = (globalThis as any).btoa;\n const originalBuffer = (globalThis as any).Buffer;\n const originalWindow = (globalThis as any).window;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n (globalThis as any).btoa = originalBtoa;\n (globalThis as any).Buffer = originalBuffer;\n (globalThis as any).window = undefined;\n });\n\n afterAll(() => {\n (globalThis as any).btoa = originalBtoa;\n (globalThis as any).Buffer = originalBuffer;\n (globalThis as any).window = originalWindow;\n });\n\n it(\"should encode an empty buffer to an empty base64 string when btoa is available\", () => {\n // GIVEN\n (globalThis as any).btoa = vi.fn((input: string) => {\n expect(input).toBe(\"\");\n return \"\";\n });\n\n const bytes = new Uint8Array();\n\n // WHEN\n const result = bufferToBase64String(bytes);\n\n // THEN\n expect(result).toBe(\"\");\n expect(globalThis.btoa).toHaveBeenCalledTimes(1);\n });\n\n describe(\"runtime compatibility fallbacks\", () => {\n it(\"GIVEN global btoa is available WHEN encoding THEN it uses global btoa\", () => {\n // GIVEN\n const text = \"first testing str\";\n const bytes = Uint8Array.from(text.split(\"\").map((c) => c.charCodeAt(0)));\n\n (globalThis as any).btoa = vi.fn((input: string) => {\n expect(input).toBe(text);\n return \"Zmlyc3QgdGVzdGluZyBzdHI=\";\n });\n\n // WHEN\n const result = bufferToBase64String(bytes);\n\n // THEN\n expect(result).toBe(\"Zmlyc3QgdGVzdGluZyBzdHI=\");\n expect(globalThis.btoa).toHaveBeenCalledTimes(1);\n });\n\n it(\"GIVEN window.btoa is available WHEN encoding THEN it uses window.btoa\", () => {\n // GIVEN\n const text = \"first testing str\";\n const bytes = Uint8Array.from(text.split(\"\").map((c) => c.charCodeAt(0)));\n const windowBtoa = vi.fn(() => \"Zmlyc3QgdGVzdGluZyBzdHI=\");\n const globalBtoa = vi.fn(() => \"unexpected\");\n (globalThis as any).window = { btoa: windowBtoa };\n (globalThis as any).btoa = globalBtoa;\n\n // WHEN\n const result = bufferToBase64String(bytes);\n\n // THEN\n expect(result).toBe(\"Zmlyc3QgdGVzdGluZyBzdHI=\");\n expect(windowBtoa).toHaveBeenCalledWith(text);\n expect(globalBtoa).not.toHaveBeenCalled();\n });\n\n it(\"GIVEN btoa is not available WHEN encoding THEN it uses Buffer\", () => {\n // GIVEN\n (globalThis as any).btoa = undefined;\n\n const text = \"testing str\";\n const expectedBase64 = Buffer.from(text, \"binary\").toString(\"base64\");\n const bytes = Uint8Array.from(text.split(\"\").map((c) => c.charCodeAt(0)));\n\n const bufferFromSpy = vi.spyOn(Buffer, \"from\");\n\n // WHEN\n const result = bufferToBase64String(bytes);\n\n // THEN\n expect(result).toBe(expectedBase64);\n expect(bufferFromSpy).toHaveBeenCalledTimes(1);\n });\n\n it(\"GIVEN no encoder is available WHEN encoding THEN it throws\", () => {\n // GIVEN\n (globalThis as any).btoa = undefined;\n (globalThis as any).Buffer = undefined;\n\n const bytes = Uint8Array.from([0x01, 0x02, 0x03]);\n\n // WHEN / THEN\n expect(() => bufferToBase64String(bytes)).toThrowError(\n \"No Base64 encoder available in this environment.\",\n );\n });\n });\n\n it(\"should throw if an undefined byte is encountered (defensive check)\", () => {\n // GIVEN\n const bytes = {\n length: 3,\n 0: 0x66,\n 1: undefined,\n 2: 0x6f,\n } as unknown as Uint8Array;\n\n (globalThis as any).btoa = vi.fn();\n\n // WHEN / THEN\n expect(() => bufferToBase64String(bytes)).toThrowError(\n \"Unexpected undefined byte in array.\",\n );\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_Base64String", "result", "originalAtob", "originalBuffer", "originalWindow", "value", "windowAtob", "globalAtob", "bufferFromSpy", "originalBtoa", "input", "bytes", "text", "c", "windowBtoa", "globalBtoa", "expectedBase64"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var E=Object.create;var a=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty;var P=(r,e)=>{for(var t in e)a(r,t,{get:e[t],enumerable:!0})},b=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of U(e))!w.call(r,o)&&o!==t&&a(r,o,{get:()=>e[o],enumerable:!(n=l(e,o))||n.enumerable});return r};var h=(r,e,t)=>(t=r!=null?E(C(r)):{},b(e||!r||!r.__esModule?a(t,"default",{value:r,enumerable:!0}):t,r)),y=r=>b(a({},"__esModule",{value:!0}),r),S=(r,e,t,n)=>{for(var o=n>1?void 0:n?l(e,t):e,p=r.length-1,k;p>=0;p--)(k=r[p])&&(o=(n?k(e,t,o):k(o))||o);return n&&o&&a(e,t,o),o},W=(r,e)=>(t,n)=>e(t,n,r);var A={};P(A,{DefaultSecureChannelDataSource:()=>c});module.exports=y(A);var i=require("inversify"),d=h(require("isomorphic-ws")),m=require("purify-ts"),s=h(require("url")),u=require("../../secure-channel/di/secureChannelTypes"),f=require("../../secure-channel/model/Errors");let c=class{webSocketBaseUrl;constructor({webSocketUrl:e}){this.webSocketBaseUrl=e}genuineCheck(e){const t=s.default.format({pathname:`${this.webSocketBaseUrl}/genuine`,query:e});return this._connectWebSocket(t)}installApp(e){const t=s.default.format({pathname:`${this.webSocketBaseUrl}/install`,query:e});return this._connectWebSocket(t)}listInstalledApps(e){const t=s.default.format({pathname:`${this.webSocketBaseUrl}/apps/list`,query:e});return this._connectWebSocket(t)}uninstallApp(e){const t=s.default.format({pathname:`${this.webSocketBaseUrl}/install`,query:e});return this._connectWebSocket(t)}updateFirmware(e){const t=s.default.format({pathname:`${this.webSocketBaseUrl}/install`,query:e});return this._connectWebSocket(t)}updateMcu(e){const t=s.default.format({pathname:`${this.webSocketBaseUrl}/mcu`,query:e});return this._connectWebSocket(t)}_connectWebSocket(e){try{return(0,m.Right)(new d.default(e))}catch(t){return(0,m.Left)(new f.WebSocketConnectionError(t))}}};c=S([(0,i.injectable)(),W(0,(0,i.inject)(u.secureChannelTypes.DmkConfig))],c);0&&(module.exports={DefaultSecureChannelDataSource});
1
+ "use strict";var U=Object.create;var c=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty;var P=(r,e)=>{for(var t in e)c(r,t,{get:e[t],enumerable:!0})},k=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of E(e))!w.call(r,o)&&o!==t&&c(r,o,{get:()=>e[o],enumerable:!(s=m(e,o))||s.enumerable});return r};var f=(r,e,t)=>(t=r!=null?U(C(r)):{},k(e||!r||!r.__esModule?c(t,"default",{value:r,enumerable:!0}):t,r)),A=r=>k(c({},"__esModule",{value:!0}),r),S=(r,e,t,s)=>{for(var o=s>1?void 0:s?m(e,t):e,p=r.length-1,b;p>=0;p--)(b=r[p])&&(o=(s?b(e,t,o):b(o))||o);return s&&o&&c(e,t,o),o},h=(r,e)=>(t,s)=>e(t,s,r);var g={};P(g,{DefaultSecureChannelDataSource:()=>i});module.exports=A(g);var a=require("inversify"),d=f(require("isomorphic-ws")),l=require("purify-ts"),n=require("../../../api/network/DmkNetworkClientHelpers"),u=require("../../secure-channel/di/secureChannelTypes"),W=require("../../secure-channel/model/Errors");let i=class{webSocketBaseUrl;constructor({webSocketUrl:e}){this.webSocketBaseUrl=e}genuineCheck(e){const t=(0,n.buildUrl)({baseUrl:this.webSocketBaseUrl,url:"/genuine",params:e});return this._connectWebSocket(t)}installApp(e){const t=(0,n.buildUrl)({baseUrl:this.webSocketBaseUrl,url:"/install",params:e});return this._connectWebSocket(t)}listInstalledApps(e){const t=(0,n.buildUrl)({baseUrl:this.webSocketBaseUrl,url:"/apps/list",params:e});return this._connectWebSocket(t)}uninstallApp(e){const t=(0,n.buildUrl)({baseUrl:this.webSocketBaseUrl,url:"/install",params:e});return this._connectWebSocket(t)}updateFirmware(e){const t=(0,n.buildUrl)({baseUrl:this.webSocketBaseUrl,url:"/install",params:e});return this._connectWebSocket(t)}updateMcu(e){const t=(0,n.buildUrl)({baseUrl:this.webSocketBaseUrl,url:"/mcu",params:e});return this._connectWebSocket(t)}_connectWebSocket(e){try{return(0,l.Right)(new d.default(e))}catch(t){return(0,l.Left)(new W.WebSocketConnectionError(t))}}};i=S([(0,a.injectable)(),h(0,(0,a.inject)(u.secureChannelTypes.DmkConfig))],i);0&&(module.exports={DefaultSecureChannelDataSource});
2
2
  //# sourceMappingURL=DefaultSecureChannelDataSource.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/secure-channel/data/DefaultSecureChannelDataSource.ts"],
4
- "sourcesContent": ["import { inject, injectable } from \"inversify\";\nimport WebSocket from \"isomorphic-ws\";\nimport { Either, Left, Right } from \"purify-ts\";\nimport URL from \"url\";\n\nimport { type DmkConfig } from \"@api/DmkConfig\";\nimport { secureChannelTypes } from \"@internal/secure-channel/di/secureChannelTypes\";\nimport { WebSocketConnectionError } from \"@internal/secure-channel/model/Errors\";\nimport {\n GenuineCheckParams,\n InstallAppsParams,\n ListInstalledAppsParams,\n UninstallAppsParams,\n UpdateFirmwareParams,\n UpdateMcuParams,\n} from \"@internal/secure-channel/model/Params\";\n\nimport { SecureChannelDataSource } from \"./SecureChannelDataSource\";\n\n@injectable()\nexport class DefaultSecureChannelDataSource implements SecureChannelDataSource {\n private readonly webSocketBaseUrl: string;\n\n constructor(\n @inject(secureChannelTypes.DmkConfig)\n { webSocketUrl }: DmkConfig,\n ) {\n this.webSocketBaseUrl = webSocketUrl;\n }\n\n genuineCheck(\n params: GenuineCheckParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/genuine`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n installApp(\n params: InstallAppsParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/install`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n listInstalledApps(\n params: ListInstalledAppsParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/apps/list`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n uninstallApp(\n params: UninstallAppsParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/install`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n updateFirmware(\n params: UpdateFirmwareParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/install`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n updateMcu(\n params: UpdateMcuParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/mcu`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n _connectWebSocket(\n address: string,\n ): Either<WebSocketConnectionError, WebSocket> {\n try {\n return Right(new WebSocket(address));\n } catch (error) {\n return Left(new WebSocketConnectionError(error));\n }\n }\n}\n"],
5
- "mappings": "qtBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAmC,qBACnCC,EAAsB,4BACtBC,EAAoC,qBACpCC,EAAgB,kBAGhBC,EAAmC,0DACnCC,EAAyC,iDAalC,IAAMC,EAAN,KAAwE,CAC5D,iBAEjB,YAEE,CAAE,aAAAC,CAAa,EACf,CACA,KAAK,iBAAmBA,CAC1B,CAEA,aACEC,EAC6C,CAC7C,MAAMC,EAAU,EAAAC,QAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,WAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,WACED,EAC6C,CAC7C,MAAMC,EAAU,EAAAC,QAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,WAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,kBACED,EAC6C,CAC7C,MAAMC,EAAU,EAAAC,QAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,aAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,aACED,EAC6C,CAC7C,MAAMC,EAAU,EAAAC,QAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,WAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,eACED,EAC6C,CAC7C,MAAMC,EAAU,EAAAC,QAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,WAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,UACED,EAC6C,CAC7C,MAAMC,EAAU,EAAAC,QAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,OAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,kBACEA,EAC6C,CAC7C,GAAI,CACF,SAAO,SAAM,IAAI,EAAAE,QAAUF,CAAO,CAAC,CACrC,OAASG,EAAO,CACd,SAAO,QAAK,IAAI,2BAAyBA,CAAK,CAAC,CACjD,CACF,CACF,EA/EaN,EAANO,EAAA,IADN,cAAW,EAKPC,EAAA,eAAO,qBAAmB,SAAS,IAJ3BR",
6
- "names": ["DefaultSecureChannelDataSource_exports", "__export", "DefaultSecureChannelDataSource", "__toCommonJS", "import_inversify", "import_isomorphic_ws", "import_purify_ts", "import_url", "import_secureChannelTypes", "import_Errors", "DefaultSecureChannelDataSource", "webSocketUrl", "params", "address", "URL", "WebSocket", "error", "__decorateClass", "__decorateParam"]
4
+ "sourcesContent": ["import { inject, injectable } from \"inversify\";\nimport WebSocket from \"isomorphic-ws\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { type DmkConfig } from \"@api/DmkConfig\";\nimport { buildUrl } from \"@api/network/DmkNetworkClientHelpers\";\nimport { secureChannelTypes } from \"@internal/secure-channel/di/secureChannelTypes\";\nimport { WebSocketConnectionError } from \"@internal/secure-channel/model/Errors\";\nimport {\n GenuineCheckParams,\n InstallAppsParams,\n ListInstalledAppsParams,\n UninstallAppsParams,\n UpdateFirmwareParams,\n UpdateMcuParams,\n} from \"@internal/secure-channel/model/Params\";\n\nimport { SecureChannelDataSource } from \"./SecureChannelDataSource\";\n\n@injectable()\nexport class DefaultSecureChannelDataSource implements SecureChannelDataSource {\n private readonly webSocketBaseUrl: string;\n\n constructor(\n @inject(secureChannelTypes.DmkConfig)\n { webSocketUrl }: DmkConfig,\n ) {\n this.webSocketBaseUrl = webSocketUrl;\n }\n\n genuineCheck(\n params: GenuineCheckParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = buildUrl({\n baseUrl: this.webSocketBaseUrl,\n url: \"/genuine\",\n params,\n });\n return this._connectWebSocket(address);\n }\n\n installApp(\n params: InstallAppsParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = buildUrl({\n baseUrl: this.webSocketBaseUrl,\n url: \"/install\",\n params,\n });\n return this._connectWebSocket(address);\n }\n\n listInstalledApps(\n params: ListInstalledAppsParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = buildUrl({\n baseUrl: this.webSocketBaseUrl,\n url: \"/apps/list\",\n params,\n });\n return this._connectWebSocket(address);\n }\n\n uninstallApp(\n params: UninstallAppsParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = buildUrl({\n baseUrl: this.webSocketBaseUrl,\n url: \"/install\",\n params,\n });\n return this._connectWebSocket(address);\n }\n\n updateFirmware(\n params: UpdateFirmwareParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = buildUrl({\n baseUrl: this.webSocketBaseUrl,\n url: \"/install\",\n params,\n });\n return this._connectWebSocket(address);\n }\n\n updateMcu(\n params: UpdateMcuParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = buildUrl({\n baseUrl: this.webSocketBaseUrl,\n url: \"/mcu\",\n params,\n });\n return this._connectWebSocket(address);\n }\n\n _connectWebSocket(\n address: string,\n ): Either<WebSocketConnectionError, WebSocket> {\n try {\n return Right(new WebSocket(address));\n } catch (error) {\n return Left(new WebSocketConnectionError(error));\n }\n }\n}\n"],
5
+ "mappings": "qtBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAmC,qBACnCC,EAAsB,4BACtBC,EAAoC,qBAGpCC,EAAyB,gDACzBC,EAAmC,0DACnCC,EAAyC,iDAalC,IAAMC,EAAN,KAAwE,CAC5D,iBAEjB,YAEE,CAAE,aAAAC,CAAa,EACf,CACA,KAAK,iBAAmBA,CAC1B,CAEA,aACEC,EAC6C,CAC7C,MAAMC,KAAU,YAAS,CACvB,QAAS,KAAK,iBACd,IAAK,WACL,OAAAD,CACF,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,WACED,EAC6C,CAC7C,MAAMC,KAAU,YAAS,CACvB,QAAS,KAAK,iBACd,IAAK,WACL,OAAAD,CACF,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,kBACED,EAC6C,CAC7C,MAAMC,KAAU,YAAS,CACvB,QAAS,KAAK,iBACd,IAAK,aACL,OAAAD,CACF,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,aACED,EAC6C,CAC7C,MAAMC,KAAU,YAAS,CACvB,QAAS,KAAK,iBACd,IAAK,WACL,OAAAD,CACF,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,eACED,EAC6C,CAC7C,MAAMC,KAAU,YAAS,CACvB,QAAS,KAAK,iBACd,IAAK,WACL,OAAAD,CACF,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,UACED,EAC6C,CAC7C,MAAMC,KAAU,YAAS,CACvB,QAAS,KAAK,iBACd,IAAK,OACL,OAAAD,CACF,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,kBACEA,EAC6C,CAC7C,GAAI,CACF,SAAO,SAAM,IAAI,EAAAC,QAAUD,CAAO,CAAC,CACrC,OAASE,EAAO,CACd,SAAO,QAAK,IAAI,2BAAyBA,CAAK,CAAC,CACjD,CACF,CACF,EArFaL,EAANM,EAAA,IADN,cAAW,EAKPC,EAAA,eAAO,qBAAmB,SAAS,IAJ3BP",
6
+ "names": ["DefaultSecureChannelDataSource_exports", "__export", "DefaultSecureChannelDataSource", "__toCommonJS", "import_inversify", "import_isomorphic_ws", "import_purify_ts", "import_DmkNetworkClientHelpers", "import_secureChannelTypes", "import_Errors", "DefaultSecureChannelDataSource", "webSocketUrl", "params", "address", "WebSocket", "error", "__decorateClass", "__decorateParam"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var u=Object.create;var l=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var h=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty;var S=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of f(t))!w.call(e,o)&&o!==r&&l(e,o,{get:()=>t[o],enumerable:!(s=p(t,o))||s.enumerable});return e};var m=(e,t,r)=>(r=e!=null?u(h(e)):{},S(t||!e||!e.__esModule?l(r,"default",{value:e,enumerable:!0}):r,e));var n=m(require("isomorphic-ws")),a=require("purify-ts"),i=require("../../secure-channel/model/Errors"),c=require("./DefaultSecureChannelDataSource");vi.mock("isomorphic-ws",()=>({default:vi.fn().mockImplementationOnce(()=>{}).mockImplementationOnce(()=>{throw new Error("WebSocket connection failed")})}));describe("Secure Channel Data Source",()=>{describe("Connection establishment",()=>{afterEach(()=>{vi.clearAllMocks()}),it("should return an error if the WebSocket connection fails",()=>{const t=new c.DefaultSecureChannelDataSource({webSocketUrl:"wss://test-websocket-url"})._connectWebSocket("wss://test-websocket-url/test");expect(n.default).toHaveBeenCalledWith("wss://test-websocket-url/test"),expect(t.extract()).toBeInstanceOf(n.default)}),it("should return an error if the WebSocket connection fails",()=>{const t=new c.DefaultSecureChannelDataSource({webSocketUrl:"wss://test-websocket-url"})._connectWebSocket("wss://test-websocket-url/test");expect(t.extract()).toBeInstanceOf(i.WebSocketConnectionError)})}),describe("Connections with different pathname",()=>{let e;beforeEach(()=>{e=new c.DefaultSecureChannelDataSource({webSocketUrl:"wss://test-websocket-url"})}),afterEach(()=>{vi.clearAllMocks()}),it("should call _connectWebSocket with parameters for genuineCheck",()=>{vi.spyOn(e,"_connectWebSocket").mockReturnValue((0,a.Right)({})),e.genuineCheck({targetId:"targetId",perso:"perso"}),expect(e._connectWebSocket).toHaveBeenCalledWith("wss://test-websocket-url/genuine?targetId=targetId&perso=perso")}),it("should call _connectWebSocket with parameters for listInstalledApps",()=>{vi.spyOn(e,"_connectWebSocket").mockReturnValue((0,a.Right)({})),e.listInstalledApps({targetId:"targetId",perso:"perso"}),expect(e._connectWebSocket).toHaveBeenCalledWith("wss://test-websocket-url/apps/list?targetId=targetId&perso=perso")}),it("should call _connectWebSocket with parameters for updateMcu",()=>{vi.spyOn(e,"_connectWebSocket").mockReturnValue((0,a.Right)({})),e.updateMcu({targetId:"targetId",version:"version"}),expect(e._connectWebSocket).toHaveBeenCalledWith("wss://test-websocket-url/mcu?targetId=targetId&version=version")}),it("should call _connectWebSocket with parameters for updateFirmware",()=>{vi.spyOn(e,"_connectWebSocket").mockReturnValue((0,a.Right)({})),e.updateFirmware({targetId:"targetId",perso:"perso",firmware:"firmware",firmwareKey:"firmwareKey"}),expect(e._connectWebSocket).toHaveBeenCalledWith("wss://test-websocket-url/install?targetId=targetId&perso=perso&firmware=firmware&firmwareKey=firmwareKey")}),it("should call _connectWebSocket with parameters for installApp",()=>{vi.spyOn(e,"_connectWebSocket").mockReturnValue((0,a.Right)({})),e.installApp({targetId:"targetId",perso:"perso",firmware:"firmware",firmwareKey:"firmwareKey",hash:"hash"}),expect(e._connectWebSocket).toHaveBeenCalledWith("wss://test-websocket-url/install?targetId=targetId&perso=perso&firmware=firmware&firmwareKey=firmwareKey&hash=hash")}),it("should call _connectWebSocket with parameters for uninstallApp",()=>{vi.spyOn(e,"_connectWebSocket").mockReturnValue((0,a.Right)({})),e.uninstallApp({targetId:"targetId",perso:"perso",firmware:"firmware",firmwareKey:"firmwareKey",hash:"hash"}),expect(e._connectWebSocket).toHaveBeenCalledWith("wss://test-websocket-url/install?targetId=targetId&perso=perso&firmware=firmware&firmwareKey=firmwareKey&hash=hash")})})});
1
+ "use strict";var u=Object.create;var l=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var k=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty;var w=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let c of S(t))!h.call(e,c)&&c!==r&&l(e,c,{get:()=>t[c],enumerable:!(s=p(t,c))||s.enumerable});return e};var f=(e,t,r)=>(r=e!=null?u(k(e)):{},w(t||!e||!e.__esModule?l(r,"default",{value:e,enumerable:!0}):r,e));var n=f(require("isomorphic-ws")),a=require("purify-ts"),i=require("../../secure-channel/model/Errors"),o=require("./DefaultSecureChannelDataSource");vi.mock("isomorphic-ws",()=>({default:vi.fn().mockImplementationOnce(()=>{}).mockImplementationOnce(()=>{throw new Error("WebSocket connection failed")})}));describe("Secure Channel Data Source",()=>{describe("Connection establishment",()=>{afterEach(()=>{vi.clearAllMocks()}),it("should return a WebSocket if the WebSocket connection succeeds",()=>{const t=new o.DefaultSecureChannelDataSource({webSocketUrl:"wss://test-websocket-url"})._connectWebSocket("wss://test-websocket-url/test");expect(n.default).toHaveBeenCalledWith("wss://test-websocket-url/test"),expect(t.extract()).toBeInstanceOf(n.default)}),it("should return an error if the WebSocket connection fails",()=>{const t=new o.DefaultSecureChannelDataSource({webSocketUrl:"wss://test-websocket-url"})._connectWebSocket("wss://test-websocket-url/test");expect(t.extract()).toBeInstanceOf(i.WebSocketConnectionError)})}),describe("Connections with different pathname",()=>{let e;beforeEach(()=>{e=new o.DefaultSecureChannelDataSource({webSocketUrl:"wss://test-websocket-url"})}),afterEach(()=>{vi.clearAllMocks()}),it("should call _connectWebSocket with parameters for genuineCheck",()=>{vi.spyOn(e,"_connectWebSocket").mockReturnValue((0,a.Right)({})),e.genuineCheck({targetId:"targetId",perso:"perso"}),expect(e._connectWebSocket).toHaveBeenCalledWith("wss://test-websocket-url/genuine?targetId=targetId&perso=perso")}),it("GIVEN a trailing slash base URL and special query characters WHEN genuineCheck connects THEN it builds one encoded URL string",()=>{e=new o.DefaultSecureChannelDataSource({webSocketUrl:"wss://test-websocket-url/"}),vi.spyOn(e,"_connectWebSocket").mockReturnValue((0,a.Right)({})),e.genuineCheck({targetId:"target id",perso:"perso&value"}),expect(e._connectWebSocket).toHaveBeenCalledWith("wss://test-websocket-url/genuine?targetId=target%20id&perso=perso%26value")}),it("should call _connectWebSocket with parameters for listInstalledApps",()=>{vi.spyOn(e,"_connectWebSocket").mockReturnValue((0,a.Right)({})),e.listInstalledApps({targetId:"targetId",perso:"perso"}),expect(e._connectWebSocket).toHaveBeenCalledWith("wss://test-websocket-url/apps/list?targetId=targetId&perso=perso")}),it("should call _connectWebSocket with parameters for updateMcu",()=>{vi.spyOn(e,"_connectWebSocket").mockReturnValue((0,a.Right)({})),e.updateMcu({targetId:"targetId",version:"version"}),expect(e._connectWebSocket).toHaveBeenCalledWith("wss://test-websocket-url/mcu?targetId=targetId&version=version")}),it("should call _connectWebSocket with parameters for updateFirmware",()=>{vi.spyOn(e,"_connectWebSocket").mockReturnValue((0,a.Right)({})),e.updateFirmware({targetId:"targetId",perso:"perso",firmware:"firmware",firmwareKey:"firmwareKey"}),expect(e._connectWebSocket).toHaveBeenCalledWith("wss://test-websocket-url/install?targetId=targetId&perso=perso&firmware=firmware&firmwareKey=firmwareKey")}),it("should call _connectWebSocket with parameters for installApp",()=>{vi.spyOn(e,"_connectWebSocket").mockReturnValue((0,a.Right)({})),e.installApp({targetId:"targetId",perso:"perso",firmware:"firmware",firmwareKey:"firmwareKey",hash:"hash"}),expect(e._connectWebSocket).toHaveBeenCalledWith("wss://test-websocket-url/install?targetId=targetId&perso=perso&firmware=firmware&firmwareKey=firmwareKey&hash=hash")}),it("should call _connectWebSocket with parameters for uninstallApp",()=>{vi.spyOn(e,"_connectWebSocket").mockReturnValue((0,a.Right)({})),e.uninstallApp({targetId:"targetId",perso:"perso",firmware:"firmware",firmwareKey:"firmwareKey",hash:"hash"}),expect(e._connectWebSocket).toHaveBeenCalledWith("wss://test-websocket-url/install?targetId=targetId&perso=perso&firmware=firmware&firmwareKey=firmwareKey&hash=hash")})})});
2
2
  //# sourceMappingURL=DefaultSecureChannelDataSource.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/secure-channel/data/DefaultSecureChannelDataSource.test.ts"],
4
- "sourcesContent": ["import WebSocket from \"isomorphic-ws\";\nimport { Right } from \"purify-ts\";\n\nimport { type DmkConfig } from \"@api/DmkConfig\";\nimport { WebSocketConnectionError } from \"@internal/secure-channel/model/Errors\";\n\nimport { DefaultSecureChannelDataSource } from \"./DefaultSecureChannelDataSource\";\nimport { type SecureChannelDataSource } from \"./SecureChannelDataSource\";\n\nvi.mock(\"isomorphic-ws\", () => {\n // The chained mockImplementationOnce is used to simulate the WebSocket connection success and failure respectively, the order is important\n return {\n default: vi\n .fn()\n .mockImplementationOnce(() => {})\n .mockImplementationOnce(() => {\n throw new Error(\"WebSocket connection failed\");\n }),\n };\n});\n\ndescribe(\"Secure Channel Data Source\", () => {\n describe(\"Connection establishment\", () => {\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should return an error if the WebSocket connection fails\", () => {\n // given\n const api = new DefaultSecureChannelDataSource({\n webSocketUrl: \"wss://test-websocket-url\",\n } as DmkConfig);\n\n // when\n const res = api._connectWebSocket(\"wss://test-websocket-url/test\");\n\n // then\n expect(WebSocket).toHaveBeenCalledWith(\"wss://test-websocket-url/test\");\n expect(res.extract()).toBeInstanceOf(WebSocket);\n });\n\n it(\"should return an error if the WebSocket connection fails\", () => {\n // given\n const api = new DefaultSecureChannelDataSource({\n webSocketUrl: \"wss://test-websocket-url\",\n } as DmkConfig);\n\n // when\n const res = api._connectWebSocket(\"wss://test-websocket-url/test\");\n\n // then\n expect(res.extract()).toBeInstanceOf(WebSocketConnectionError);\n });\n });\n describe(\"Connections with different pathname\", () => {\n let api: SecureChannelDataSource;\n\n beforeEach(() => {\n api = new DefaultSecureChannelDataSource({\n webSocketUrl: \"wss://test-websocket-url\",\n } as DmkConfig);\n });\n\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should call _connectWebSocket with parameters for genuineCheck\", () => {\n // given\n vi.spyOn(\n api as DefaultSecureChannelDataSource,\n \"_connectWebSocket\",\n ).mockReturnValue(Right({} as WebSocket));\n\n // when\n api.genuineCheck({\n targetId: \"targetId\",\n perso: \"perso\",\n });\n\n // then\n expect(\n (api as DefaultSecureChannelDataSource)._connectWebSocket,\n ).toHaveBeenCalledWith(\n \"wss://test-websocket-url/genuine?targetId=targetId&perso=perso\",\n );\n });\n\n it(\"should call _connectWebSocket with parameters for listInstalledApps\", () => {\n // given\n vi.spyOn(\n api as DefaultSecureChannelDataSource,\n \"_connectWebSocket\",\n ).mockReturnValue(Right({} as WebSocket));\n\n // when\n api.listInstalledApps({\n targetId: \"targetId\",\n perso: \"perso\",\n });\n\n // then\n expect(\n (api as DefaultSecureChannelDataSource)._connectWebSocket,\n ).toHaveBeenCalledWith(\n \"wss://test-websocket-url/apps/list?targetId=targetId&perso=perso\",\n );\n });\n\n it(\"should call _connectWebSocket with parameters for updateMcu\", () => {\n // given\n vi.spyOn(\n api as DefaultSecureChannelDataSource,\n \"_connectWebSocket\",\n ).mockReturnValue(Right({} as WebSocket));\n\n // when\n api.updateMcu({\n targetId: \"targetId\",\n version: \"version\",\n });\n\n // then\n expect(\n (api as DefaultSecureChannelDataSource)._connectWebSocket,\n ).toHaveBeenCalledWith(\n \"wss://test-websocket-url/mcu?targetId=targetId&version=version\",\n );\n });\n\n it(\"should call _connectWebSocket with parameters for updateFirmware\", () => {\n // given\n vi.spyOn(\n api as DefaultSecureChannelDataSource,\n \"_connectWebSocket\",\n ).mockReturnValue(Right({} as WebSocket));\n\n // when\n api.updateFirmware({\n targetId: \"targetId\",\n perso: \"perso\",\n firmware: \"firmware\",\n firmwareKey: \"firmwareKey\",\n });\n\n // then\n expect(\n (api as DefaultSecureChannelDataSource)._connectWebSocket,\n ).toHaveBeenCalledWith(\n \"wss://test-websocket-url/install?targetId=targetId&perso=perso&firmware=firmware&firmwareKey=firmwareKey\",\n );\n });\n\n it(\"should call _connectWebSocket with parameters for installApp\", () => {\n // given\n vi.spyOn(\n api as DefaultSecureChannelDataSource,\n \"_connectWebSocket\",\n ).mockReturnValue(Right({} as WebSocket));\n\n // when\n api.installApp({\n targetId: \"targetId\",\n perso: \"perso\",\n firmware: \"firmware\",\n firmwareKey: \"firmwareKey\",\n hash: \"hash\",\n });\n\n // then\n expect(\n (api as DefaultSecureChannelDataSource)._connectWebSocket,\n ).toHaveBeenCalledWith(\n \"wss://test-websocket-url/install?targetId=targetId&perso=perso&firmware=firmware&firmwareKey=firmwareKey&hash=hash\",\n );\n });\n\n it(\"should call _connectWebSocket with parameters for uninstallApp\", () => {\n // given\n vi.spyOn(\n api as DefaultSecureChannelDataSource,\n \"_connectWebSocket\",\n ).mockReturnValue(Right({} as WebSocket));\n\n // when\n api.uninstallApp({\n targetId: \"targetId\",\n perso: \"perso\",\n firmware: \"firmware\",\n firmwareKey: \"firmwareKey\",\n hash: \"hash\",\n });\n\n // then\n expect(\n (api as DefaultSecureChannelDataSource)._connectWebSocket,\n ).toHaveBeenCalledWith(\n \"wss://test-websocket-url/install?targetId=targetId&perso=perso&firmware=firmware&firmwareKey=firmwareKey&hash=hash\",\n );\n });\n });\n});\n"],
5
- "mappings": "wdAAA,IAAAA,EAAsB,4BACtBC,EAAsB,qBAGtBC,EAAyC,iDAEzCC,EAA+C,4CAG/C,GAAG,KAAK,gBAAiB,KAEhB,CACL,QAAS,GACN,GAAG,EACH,uBAAuB,IAAM,CAAC,CAAC,EAC/B,uBAAuB,IAAM,CAC5B,MAAM,IAAI,MAAM,6BAA6B,CAC/C,CAAC,CACL,EACD,EAED,SAAS,6BAA8B,IAAM,CAC3C,SAAS,2BAA4B,IAAM,CACzC,UAAU,IAAM,CACd,GAAG,cAAc,CACnB,CAAC,EAED,GAAG,2DAA4D,IAAM,CAOnE,MAAMC,EALM,IAAI,iCAA+B,CAC7C,aAAc,0BAChB,CAAc,EAGE,kBAAkB,+BAA+B,EAGjE,OAAO,EAAAC,OAAS,EAAE,qBAAqB,+BAA+B,EACtE,OAAOD,EAAI,QAAQ,CAAC,EAAE,eAAe,EAAAC,OAAS,CAChD,CAAC,EAED,GAAG,2DAA4D,IAAM,CAOnE,MAAMD,EALM,IAAI,iCAA+B,CAC7C,aAAc,0BAChB,CAAc,EAGE,kBAAkB,+BAA+B,EAGjE,OAAOA,EAAI,QAAQ,CAAC,EAAE,eAAe,0BAAwB,CAC/D,CAAC,CACH,CAAC,EACD,SAAS,sCAAuC,IAAM,CACpD,IAAIE,EAEJ,WAAW,IAAM,CACfA,EAAM,IAAI,iCAA+B,CACvC,aAAc,0BAChB,CAAc,CAChB,CAAC,EAED,UAAU,IAAM,CACd,GAAG,cAAc,CACnB,CAAC,EAED,GAAG,iEAAkE,IAAM,CAEzE,GAAG,MACDA,EACA,mBACF,EAAE,mBAAgB,SAAM,CAAC,CAAc,CAAC,EAGxCA,EAAI,aAAa,CACf,SAAU,WACV,MAAO,OACT,CAAC,EAGD,OACGA,EAAuC,iBAC1C,EAAE,qBACA,gEACF,CACF,CAAC,EAED,GAAG,sEAAuE,IAAM,CAE9E,GAAG,MACDA,EACA,mBACF,EAAE,mBAAgB,SAAM,CAAC,CAAc,CAAC,EAGxCA,EAAI,kBAAkB,CACpB,SAAU,WACV,MAAO,OACT,CAAC,EAGD,OACGA,EAAuC,iBAC1C,EAAE,qBACA,kEACF,CACF,CAAC,EAED,GAAG,8DAA+D,IAAM,CAEtE,GAAG,MACDA,EACA,mBACF,EAAE,mBAAgB,SAAM,CAAC,CAAc,CAAC,EAGxCA,EAAI,UAAU,CACZ,SAAU,WACV,QAAS,SACX,CAAC,EAGD,OACGA,EAAuC,iBAC1C,EAAE,qBACA,gEACF,CACF,CAAC,EAED,GAAG,mEAAoE,IAAM,CAE3E,GAAG,MACDA,EACA,mBACF,EAAE,mBAAgB,SAAM,CAAC,CAAc,CAAC,EAGxCA,EAAI,eAAe,CACjB,SAAU,WACV,MAAO,QACP,SAAU,WACV,YAAa,aACf,CAAC,EAGD,OACGA,EAAuC,iBAC1C,EAAE,qBACA,0GACF,CACF,CAAC,EAED,GAAG,+DAAgE,IAAM,CAEvE,GAAG,MACDA,EACA,mBACF,EAAE,mBAAgB,SAAM,CAAC,CAAc,CAAC,EAGxCA,EAAI,WAAW,CACb,SAAU,WACV,MAAO,QACP,SAAU,WACV,YAAa,cACb,KAAM,MACR,CAAC,EAGD,OACGA,EAAuC,iBAC1C,EAAE,qBACA,oHACF,CACF,CAAC,EAED,GAAG,iEAAkE,IAAM,CAEzE,GAAG,MACDA,EACA,mBACF,EAAE,mBAAgB,SAAM,CAAC,CAAc,CAAC,EAGxCA,EAAI,aAAa,CACf,SAAU,WACV,MAAO,QACP,SAAU,WACV,YAAa,cACb,KAAM,MACR,CAAC,EAGD,OACGA,EAAuC,iBAC1C,EAAE,qBACA,oHACF,CACF,CAAC,CACH,CAAC,CACH,CAAC",
4
+ "sourcesContent": ["import WebSocket from \"isomorphic-ws\";\nimport { Right } from \"purify-ts\";\n\nimport { type DmkConfig } from \"@api/DmkConfig\";\nimport { WebSocketConnectionError } from \"@internal/secure-channel/model/Errors\";\n\nimport { DefaultSecureChannelDataSource } from \"./DefaultSecureChannelDataSource\";\nimport { type SecureChannelDataSource } from \"./SecureChannelDataSource\";\n\nvi.mock(\"isomorphic-ws\", () => {\n // The chained mockImplementationOnce is used to simulate the WebSocket connection success and failure respectively, the order is important\n return {\n default: vi\n .fn()\n .mockImplementationOnce(() => {})\n .mockImplementationOnce(() => {\n throw new Error(\"WebSocket connection failed\");\n }),\n };\n});\n\ndescribe(\"Secure Channel Data Source\", () => {\n describe(\"Connection establishment\", () => {\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should return a WebSocket if the WebSocket connection succeeds\", () => {\n // given\n const api = new DefaultSecureChannelDataSource({\n webSocketUrl: \"wss://test-websocket-url\",\n } as DmkConfig);\n\n // when\n const res = api._connectWebSocket(\"wss://test-websocket-url/test\");\n\n // then\n expect(WebSocket).toHaveBeenCalledWith(\"wss://test-websocket-url/test\");\n expect(res.extract()).toBeInstanceOf(WebSocket);\n });\n\n it(\"should return an error if the WebSocket connection fails\", () => {\n // given\n const api = new DefaultSecureChannelDataSource({\n webSocketUrl: \"wss://test-websocket-url\",\n } as DmkConfig);\n\n // when\n const res = api._connectWebSocket(\"wss://test-websocket-url/test\");\n\n // then\n expect(res.extract()).toBeInstanceOf(WebSocketConnectionError);\n });\n });\n describe(\"Connections with different pathname\", () => {\n let api: SecureChannelDataSource;\n\n beforeEach(() => {\n api = new DefaultSecureChannelDataSource({\n webSocketUrl: \"wss://test-websocket-url\",\n } as DmkConfig);\n });\n\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should call _connectWebSocket with parameters for genuineCheck\", () => {\n // given\n vi.spyOn(\n api as DefaultSecureChannelDataSource,\n \"_connectWebSocket\",\n ).mockReturnValue(Right({} as WebSocket));\n\n // when\n api.genuineCheck({\n targetId: \"targetId\",\n perso: \"perso\",\n });\n\n // then\n expect(\n (api as DefaultSecureChannelDataSource)._connectWebSocket,\n ).toHaveBeenCalledWith(\n \"wss://test-websocket-url/genuine?targetId=targetId&perso=perso\",\n );\n });\n\n it(\"GIVEN a trailing slash base URL and special query characters WHEN genuineCheck connects THEN it builds one encoded URL string\", () => {\n // given\n api = new DefaultSecureChannelDataSource({\n webSocketUrl: \"wss://test-websocket-url/\",\n } as DmkConfig);\n vi.spyOn(\n api as DefaultSecureChannelDataSource,\n \"_connectWebSocket\",\n ).mockReturnValue(Right({} as WebSocket));\n\n // when\n api.genuineCheck({\n targetId: \"target id\",\n perso: \"perso&value\",\n });\n\n // then\n expect(\n (api as DefaultSecureChannelDataSource)._connectWebSocket,\n ).toHaveBeenCalledWith(\n \"wss://test-websocket-url/genuine?targetId=target%20id&perso=perso%26value\",\n );\n });\n\n it(\"should call _connectWebSocket with parameters for listInstalledApps\", () => {\n // given\n vi.spyOn(\n api as DefaultSecureChannelDataSource,\n \"_connectWebSocket\",\n ).mockReturnValue(Right({} as WebSocket));\n\n // when\n api.listInstalledApps({\n targetId: \"targetId\",\n perso: \"perso\",\n });\n\n // then\n expect(\n (api as DefaultSecureChannelDataSource)._connectWebSocket,\n ).toHaveBeenCalledWith(\n \"wss://test-websocket-url/apps/list?targetId=targetId&perso=perso\",\n );\n });\n\n it(\"should call _connectWebSocket with parameters for updateMcu\", () => {\n // given\n vi.spyOn(\n api as DefaultSecureChannelDataSource,\n \"_connectWebSocket\",\n ).mockReturnValue(Right({} as WebSocket));\n\n // when\n api.updateMcu({\n targetId: \"targetId\",\n version: \"version\",\n });\n\n // then\n expect(\n (api as DefaultSecureChannelDataSource)._connectWebSocket,\n ).toHaveBeenCalledWith(\n \"wss://test-websocket-url/mcu?targetId=targetId&version=version\",\n );\n });\n\n it(\"should call _connectWebSocket with parameters for updateFirmware\", () => {\n // given\n vi.spyOn(\n api as DefaultSecureChannelDataSource,\n \"_connectWebSocket\",\n ).mockReturnValue(Right({} as WebSocket));\n\n // when\n api.updateFirmware({\n targetId: \"targetId\",\n perso: \"perso\",\n firmware: \"firmware\",\n firmwareKey: \"firmwareKey\",\n });\n\n // then\n expect(\n (api as DefaultSecureChannelDataSource)._connectWebSocket,\n ).toHaveBeenCalledWith(\n \"wss://test-websocket-url/install?targetId=targetId&perso=perso&firmware=firmware&firmwareKey=firmwareKey\",\n );\n });\n\n it(\"should call _connectWebSocket with parameters for installApp\", () => {\n // given\n vi.spyOn(\n api as DefaultSecureChannelDataSource,\n \"_connectWebSocket\",\n ).mockReturnValue(Right({} as WebSocket));\n\n // when\n api.installApp({\n targetId: \"targetId\",\n perso: \"perso\",\n firmware: \"firmware\",\n firmwareKey: \"firmwareKey\",\n hash: \"hash\",\n });\n\n // then\n expect(\n (api as DefaultSecureChannelDataSource)._connectWebSocket,\n ).toHaveBeenCalledWith(\n \"wss://test-websocket-url/install?targetId=targetId&perso=perso&firmware=firmware&firmwareKey=firmwareKey&hash=hash\",\n );\n });\n\n it(\"should call _connectWebSocket with parameters for uninstallApp\", () => {\n // given\n vi.spyOn(\n api as DefaultSecureChannelDataSource,\n \"_connectWebSocket\",\n ).mockReturnValue(Right({} as WebSocket));\n\n // when\n api.uninstallApp({\n targetId: \"targetId\",\n perso: \"perso\",\n firmware: \"firmware\",\n firmwareKey: \"firmwareKey\",\n hash: \"hash\",\n });\n\n // then\n expect(\n (api as DefaultSecureChannelDataSource)._connectWebSocket,\n ).toHaveBeenCalledWith(\n \"wss://test-websocket-url/install?targetId=targetId&perso=perso&firmware=firmware&firmwareKey=firmwareKey&hash=hash\",\n );\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_isomorphic_ws", "import_purify_ts", "import_Errors", "import_DefaultSecureChannelDataSource", "res", "WebSocket", "api"]
7
7
  }
@@ -7,7 +7,6 @@
7
7
  "purify-ts": "catalog:",
8
8
  "reflect-metadata": "catalog:",
9
9
  "semver": "catalog:",
10
- "url": "catalog:",
11
10
  "uuid": "catalog:",
12
11
  "ws": "catalog:",
13
12
  "xstate": "catalog:"
@@ -63,5 +62,5 @@
63
62
  "watch:builds": "pnpm ldmk-tool watch --entryPoints index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
64
63
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
65
64
  },
66
- "version": "1.6.0"
65
+ "version": "1.7.0"
67
66
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/api/logger-subscriber/service/WebLogsExporterLogger.ts"],
4
- "sourcesContent": ["import { LogLevel } from \"@api/logger-subscriber/model/LogLevel\";\nimport { type LogSubscriberOptions } from \"@api/types\";\nimport { DeviceSession } from \"@internal/device-session/model/DeviceSession\";\n\nimport { type LoggerSubscriberService } from \"./LoggerSubscriberService\";\n\n/**\n * This function is used to format the logs to JSON format,\n * remove circular dependencies and do some extra formatting.\n * */\nexport function getJSONStringifyReplacer(): (\n key: string,\n value: unknown,\n) => unknown {\n const ancestors: unknown[] = [];\n return function (_: string, value: unknown): unknown {\n // format Uint8Array values to more readable format\n if (value instanceof Uint8Array) {\n const bytesHex = Array.from(value).map((x) =>\n x.toString(16).padStart(2, \"0\"),\n );\n return {\n hex: \"0x\" + bytesHex.join(\"\"),\n readableHex: bytesHex.join(\" \"),\n value: value.toString(),\n };\n }\n\n // format DeviceSession values to avoid huge object in logs\n if (value instanceof DeviceSession) {\n const {\n connectedDevice: { deviceModel, type, id },\n } = value;\n return {\n id: value.id,\n connectedDevice: {\n deviceModel,\n type,\n id,\n },\n };\n }\n\n // format circular references to \"[Circular]\"\n // Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value#circular_references\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n // `this` is the object that value is contained in,\n // i.e., its direct parent.\n // @ts-expect-error cf. comment above\n while (ancestors.length > 0 && ancestors.at(-1) !== (this as unknown)) {\n ancestors.pop();\n }\n if (ancestors.includes(value)) {\n return \"[Circular]\";\n }\n ancestors.push(value);\n return value;\n };\n}\n\nexport class WebLogsExporterLogger implements LoggerSubscriberService {\n private logs: Array<\n [level: LogLevel, message: string, options: LogSubscriberOptions]\n > = [];\n\n log(level: LogLevel, message: string, options: LogSubscriberOptions): void {\n this.logs.push([level, message, options]);\n }\n\n private formatLogsToJSON(): string {\n const remappedLogs = this.logs.map(([level, message, options]) => {\n const { timestamp, ...restOptions } = options;\n return {\n level: LogLevel[level],\n message,\n options: {\n ...restOptions,\n date: new Date(options.timestamp),\n },\n };\n });\n\n return JSON.stringify(remappedLogs, getJSONStringifyReplacer(), 2);\n }\n\n /**\n * Export logs to JSON file.\n */\n public exportLogsToJSON(): void {\n const logs = this.formatLogsToJSON();\n const blob = new Blob([logs], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `ledger-device-management-kit-logs-${new Date().toISOString()}.json`;\n a.click();\n }\n}\n"],
5
- "mappings": "AAAA,OAAS,YAAAA,MAAgB,wCAEzB,OAAS,iBAAAC,MAAqB,+CAQvB,SAASC,GAGH,CACX,MAAMC,EAAuB,CAAC,EAC9B,OAAO,SAAUC,EAAWC,EAAyB,CAEnD,GAAIA,aAAiB,WAAY,CAC/B,MAAMC,EAAW,MAAM,KAAKD,CAAK,EAAE,IAAKE,GACtCA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAChC,EACA,MAAO,CACL,IAAK,KAAOD,EAAS,KAAK,EAAE,EAC5B,YAAaA,EAAS,KAAK,GAAG,EAC9B,MAAOD,EAAM,SAAS,CACxB,CACF,CAGA,GAAIA,aAAiBJ,EAAe,CAClC,KAAM,CACJ,gBAAiB,CAAE,YAAAO,EAAa,KAAAC,EAAM,GAAAC,CAAG,CAC3C,EAAIL,EACJ,MAAO,CACL,GAAIA,EAAM,GACV,gBAAiB,CACf,YAAAG,EACA,KAAAC,EACA,GAAAC,CACF,CACF,CACF,CAIA,GAAI,OAAOL,GAAU,UAAYA,IAAU,KACzC,OAAOA,EAKT,KAAOF,EAAU,OAAS,GAAKA,EAAU,GAAG,EAAE,IAAO,MACnDA,EAAU,IAAI,EAEhB,OAAIA,EAAU,SAASE,CAAK,EACnB,cAETF,EAAU,KAAKE,CAAK,EACbA,EACT,CACF,CAEO,MAAMM,CAAyD,CAC5D,KAEJ,CAAC,EAEL,IAAIC,EAAiBC,EAAiBC,EAAqC,CACzE,KAAK,KAAK,KAAK,CAACF,EAAOC,EAASC,CAAO,CAAC,CAC1C,CAEQ,kBAA2B,CACjC,MAAMC,EAAe,KAAK,KAAK,IAAI,CAAC,CAACH,EAAOC,EAASC,CAAO,IAAM,CAChE,KAAM,CAAE,UAAAE,EAAW,GAAGC,CAAY,EAAIH,EACtC,MAAO,CACL,MAAOd,EAASY,CAAK,EACrB,QAAAC,EACA,QAAS,CACP,GAAGI,EACH,KAAM,IAAI,KAAKH,EAAQ,SAAS,CAClC,CACF,CACF,CAAC,EAED,OAAO,KAAK,UAAUC,EAAcb,EAAyB,EAAG,CAAC,CACnE,CAKO,kBAAyB,CAC9B,MAAMgB,EAAO,KAAK,iBAAiB,EAC7BC,EAAO,IAAI,KAAK,CAACD,CAAI,EAAG,CAAE,KAAM,kBAAmB,CAAC,EACpDE,EAAM,IAAI,gBAAgBD,CAAI,EAC9BE,EAAI,SAAS,cAAc,GAAG,EACpCA,EAAE,KAAOD,EACTC,EAAE,SAAW,qCAAqC,IAAI,KAAK,EAAE,YAAY,CAAC,QAC1EA,EAAE,MAAM,CACV,CACF",
4
+ "sourcesContent": ["import { LogLevel } from \"@api/logger-subscriber/model/LogLevel\";\nimport { type LogSubscriberOptions } from \"@api/types\";\nimport { DeviceSession } from \"@internal/device-session/model/DeviceSession\";\n\nimport { type LoggerSubscriberService } from \"./LoggerSubscriberService\";\n\n/**\n * This function is used to format the logs to JSON format,\n * remove circular dependencies and do some extra formatting.\n * */\nexport function getJSONStringifyReplacer(): (\n key: string,\n value: unknown,\n) => unknown {\n const ancestors: unknown[] = [];\n return function (_: string, value: unknown): unknown {\n // format Uint8Array values to more readable format\n if (value instanceof Uint8Array) {\n const bytesHex = Array.from(value).map((x) =>\n x.toString(16).padStart(2, \"0\"),\n );\n return {\n hex: \"0x\" + bytesHex.join(\"\"),\n readableHex: bytesHex.join(\" \"),\n value: value.toString(),\n };\n }\n\n // format DeviceSession values to avoid huge object in logs\n if (value instanceof DeviceSession) {\n const {\n connectedDevice: { deviceModel, type, id },\n } = value;\n return {\n id: value.id,\n connectedDevice: {\n deviceModel,\n type,\n id,\n },\n };\n }\n\n // format circular references to \"[Circular]\"\n // Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value#circular_references\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n // `this` is the object that value is contained in,\n // i.e., its direct parent.\n // @ts-expect-error cf. comment above\n while (ancestors.length > 0 && ancestors.at(-1) !== (this as unknown)) {\n ancestors.pop();\n }\n if (ancestors.includes(value)) {\n return \"[Circular]\";\n }\n ancestors.push(value);\n return value;\n };\n}\n\nexport class WebLogsExporterLogger implements LoggerSubscriberService {\n private logs: Array<\n [level: LogLevel, message: string, options: LogSubscriberOptions]\n > = [];\n\n log(level: LogLevel, message: string, options: LogSubscriberOptions): void {\n this.logs.push([level, message, options]);\n }\n\n private formatLogsToJSON(): string {\n const remappedLogs = this.logs.map(([level, message, options]) => {\n const { timestamp, ...restOptions } = options;\n return {\n level: LogLevel[level],\n message,\n options: {\n ...restOptions,\n date: new Date(options.timestamp),\n },\n };\n });\n\n return JSON.stringify(remappedLogs, getJSONStringifyReplacer(), 2);\n }\n\n /**\n * Export logs to JSON file.\n */\n public exportLogsToJSON(): void {\n const logs = this.formatLogsToJSON();\n /* eslint-disable no-restricted-globals -- Browser-only log export path uses Blob URLs to trigger a JSON file download. */\n const blob = new Blob([logs], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n /* eslint-enable no-restricted-globals */\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `ledger-device-management-kit-logs-${new Date().toISOString()}.json`;\n a.click();\n }\n}\n"],
5
+ "mappings": "AAAA,OAAS,YAAAA,MAAgB,wCAEzB,OAAS,iBAAAC,MAAqB,+CAQvB,SAASC,GAGH,CACX,MAAMC,EAAuB,CAAC,EAC9B,OAAO,SAAUC,EAAWC,EAAyB,CAEnD,GAAIA,aAAiB,WAAY,CAC/B,MAAMC,EAAW,MAAM,KAAKD,CAAK,EAAE,IAAKE,GACtCA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAChC,EACA,MAAO,CACL,IAAK,KAAOD,EAAS,KAAK,EAAE,EAC5B,YAAaA,EAAS,KAAK,GAAG,EAC9B,MAAOD,EAAM,SAAS,CACxB,CACF,CAGA,GAAIA,aAAiBJ,EAAe,CAClC,KAAM,CACJ,gBAAiB,CAAE,YAAAO,EAAa,KAAAC,EAAM,GAAAC,CAAG,CAC3C,EAAIL,EACJ,MAAO,CACL,GAAIA,EAAM,GACV,gBAAiB,CACf,YAAAG,EACA,KAAAC,EACA,GAAAC,CACF,CACF,CACF,CAIA,GAAI,OAAOL,GAAU,UAAYA,IAAU,KACzC,OAAOA,EAKT,KAAOF,EAAU,OAAS,GAAKA,EAAU,GAAG,EAAE,IAAO,MACnDA,EAAU,IAAI,EAEhB,OAAIA,EAAU,SAASE,CAAK,EACnB,cAETF,EAAU,KAAKE,CAAK,EACbA,EACT,CACF,CAEO,MAAMM,CAAyD,CAC5D,KAEJ,CAAC,EAEL,IAAIC,EAAiBC,EAAiBC,EAAqC,CACzE,KAAK,KAAK,KAAK,CAACF,EAAOC,EAASC,CAAO,CAAC,CAC1C,CAEQ,kBAA2B,CACjC,MAAMC,EAAe,KAAK,KAAK,IAAI,CAAC,CAACH,EAAOC,EAASC,CAAO,IAAM,CAChE,KAAM,CAAE,UAAAE,EAAW,GAAGC,CAAY,EAAIH,EACtC,MAAO,CACL,MAAOd,EAASY,CAAK,EACrB,QAAAC,EACA,QAAS,CACP,GAAGI,EACH,KAAM,IAAI,KAAKH,EAAQ,SAAS,CAClC,CACF,CACF,CAAC,EAED,OAAO,KAAK,UAAUC,EAAcb,EAAyB,EAAG,CAAC,CACnE,CAKO,kBAAyB,CAC9B,MAAMgB,EAAO,KAAK,iBAAiB,EAE7BC,EAAO,IAAI,KAAK,CAACD,CAAI,EAAG,CAAE,KAAM,kBAAmB,CAAC,EACpDE,EAAM,IAAI,gBAAgBD,CAAI,EAE9BE,EAAI,SAAS,cAAc,GAAG,EACpCA,EAAE,KAAOD,EACTC,EAAE,SAAW,qCAAqC,IAAI,KAAK,EAAE,YAAY,CAAC,QAC1EA,EAAE,MAAM,CACV,CACF",
6
6
  "names": ["LogLevel", "DeviceSession", "getJSONStringifyReplacer", "ancestors", "_", "value", "bytesHex", "x", "deviceModel", "type", "id", "WebLogsExporterLogger", "level", "message", "options", "remappedLogs", "timestamp", "restOptions", "logs", "blob", "url", "a"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{DmkNetworkClientError as p}from"./DmkNetworkClientError";import{buildBodyAndHeaders as m,buildSignal as d,buildUrl as h,parseBody as l,safeReadText as k,wrapFetchError as y}from"./DmkNetworkClientHelpers";class D{baseUrl;defaultHeaders;fetchImpl;constructor(e={}){this.baseUrl=e.baseUrl,this.defaultHeaders=e.headers??{},this.fetchImpl=e.fetch}getFetch(){return this.fetchImpl??globalThis.fetch.bind(globalThis)}get(e,t){return this.request({...t,method:"GET",url:e}).then(r=>r.data)}post(e,t,r){return this.request({...r,method:"POST",url:e,body:t}).then(n=>n.data)}put(e,t,r){return this.request({...r,method:"PUT",url:e,body:t}).then(n=>n.data)}patch(e,t,r){return this.request({...r,method:"PATCH",url:e,body:t}).then(n=>n.data)}delete(e,t){return this.request({...t,method:"DELETE",url:e}).then(r=>r.data)}head(e,t){return this.request({...t,method:"HEAD",url:e,responseType:"void"}).then(()=>{})}async request(e){const t=h({url:e.url,params:e.params,baseUrl:this.baseUrl}),{body:r,headers:n}=m({method:e.method,body:e.body,defaultHeaders:this.defaultHeaders,perRequestHeaders:e.headers}),a=d({timeoutMs:e.timeoutMs,externalSignal:e.signal}),u=e.throwOnHttpError??!0,i=e.responseType??"json";let s;try{s=await this.getFetch()(t,{method:e.method,headers:n,body:r,signal:a})}catch(o){throw y({cause:o,externalSignal:e.signal,timeoutMs:e.timeoutMs})}if(!s.ok&&u){const o=await k(s);throw new p({message:`HTTP error ${s.status} ${s.statusText}`.trim(),status:s.status,statusText:s.statusText,responseBody:o})}return{data:await l(s,i),status:s.status,statusText:s.statusText,headers:s.headers,ok:s.ok}}}export{D as DmkNetworkClient};
1
+ import{DmkNetworkClientError as m}from"./DmkNetworkClientError";import{buildBodyAndHeaders as d,buildSignal as h,buildUrl as l,parseBody as k,safeReadText as y,wrapFetchError as c}from"./DmkNetworkClientHelpers";class f{baseUrl;defaultHeaders;fetchImpl;constructor(e={}){this.baseUrl=e.baseUrl,this.defaultHeaders=e.headers??{},this.fetchImpl=e.fetch}getFetch(){return this.fetchImpl??globalThis.fetch.bind(globalThis)}get(e,t){return this.request({...t,method:"GET",url:e}).then(r=>r.data)}post(e,t,r){return this.request({...r,method:"POST",url:e,body:t}).then(n=>n.data)}put(e,t,r){return this.request({...r,method:"PUT",url:e,body:t}).then(n=>n.data)}patch(e,t,r){return this.request({...r,method:"PATCH",url:e,body:t}).then(n=>n.data)}delete(e,t){return this.request({...t,method:"DELETE",url:e}).then(r=>r.data)}head(e,t){return this.request({...t,method:"HEAD",url:e,responseType:"void"}).then(()=>{})}async request(e){const t=l({url:e.url,params:e.params,baseUrl:this.baseUrl}),{body:r,headers:n}=d({method:e.method,body:e.body,defaultHeaders:this.defaultHeaders,perRequestHeaders:e.headers}),{signal:a,cleanup:u}=h({timeoutMs:e.timeoutMs}),i=e.throwOnHttpError??!0,p=e.responseType??"json";try{let s;try{s=await this.getFetch()(t,{method:e.method,headers:n,body:r,signal:a})}catch(o){throw c({cause:o,timeoutMs:e.timeoutMs})}if(!s.ok&&i){const o=await y(s);throw new m({message:`HTTP error ${s.status} ${s.statusText}`.trim(),status:s.status,statusText:s.statusText,responseBody:o})}return{data:await k(s,p),status:s.status,statusText:s.statusText,headers:s.headers,ok:s.ok}}finally{u()}}}export{f as DmkNetworkClient};
2
2
  //# sourceMappingURL=DmkNetworkClient.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/api/network/DmkNetworkClient.ts"],
4
- "sourcesContent": ["import { DmkNetworkClientError } from \"./DmkNetworkClientError\";\nimport {\n buildBodyAndHeaders,\n buildSignal,\n buildUrl,\n type DmkQueryParams,\n type DmkResponseType,\n parseBody,\n safeReadText,\n wrapFetchError,\n} from \"./DmkNetworkClientHelpers\";\n\nexport type { DmkQueryParamValue } from \"./DmkNetworkClientHelpers\";\nexport type { DmkQueryParams, DmkResponseType };\n\n/**\n * Per-request configuration. Everything is optional \u2014 sensible defaults are\n * applied by the client.\n */\nexport type DmkRequestConfig = {\n /** Query params merged into the URL. `null`/`undefined` entries are skipped. */\n params?: DmkQueryParams;\n /** Per-request headers merged on top of the client's default headers. */\n headers?: Record<string, string>;\n /**\n * Per-request timeout in milliseconds. When unset (or `0`), the request\n * has no timeout.\n */\n timeoutMs?: number;\n /**\n * External abort signal. Composed with the internal timeout signal, so\n * either one firing will abort the request.\n */\n signal?: AbortSignal;\n /**\n * How to parse the response body. Defaults to `\"json\"`, except for `head`\n * which always resolves to `void`.\n */\n responseType?: DmkResponseType;\n /**\n * When `true` (default), non-2xx responses throw {@link DmkNetworkClientError}.\n * Set to `false` to resolve normally and inspect {@link DmkNetworkResponse}\n * via {@link DmkNetworkClient.request}.\n */\n throwOnHttpError?: boolean;\n};\n\n/**\n * Full response envelope returned by {@link DmkNetworkClient.request}.\n * The simple method helpers (`get`, `post`, \u2026) unwrap to `data` directly.\n *\n * `data` is intentionally typed as `unknown`: network payloads are untrusted\n * input, so callers must narrow it with a type guard or runtime validator\n * (e.g. the existing DTO mappers) before use.\n */\nexport type DmkNetworkResponse = {\n data: unknown;\n status: number;\n statusText: string;\n headers: Headers;\n ok: boolean;\n};\n\nexport type DmkNetworkClientOptions = {\n /** Base URL prepended to relative request URLs. */\n baseUrl?: string;\n /** Default headers merged into every request. */\n headers?: Record<string, string>;\n /** Injection point for tests. Defaults to `globalThis.fetch`. */\n fetch?: typeof fetch;\n};\n\ntype InternalRequestConfig = DmkRequestConfig & {\n method: string;\n url: string;\n body?: unknown;\n};\n\n/**\n * Minimal axios-like wrapper over `fetch`. Handles:\n *\n * - URL composition (base URL + relative path + query params from an object)\n * - Automatic JSON body encoding and `Content-Type` header\n * - Default and per-request headers merging\n * - Request timeout via `AbortSignal.timeout`, composable with a caller signal\n * - Automatic `response.ok` check with a typed {@link DmkNetworkClientError}\n * - Typed JSON / text / blob / arrayBuffer response parsing\n *\n * Use the high-level helpers ({@link DmkNetworkClient.get}, {@link DmkNetworkClient.post},\n * \u2026) for 95% of calls and {@link DmkNetworkClient.request} when you need the\n * full response envelope (status, headers).\n */\nexport class DmkNetworkClient {\n private readonly baseUrl?: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly fetchImpl?: typeof fetch;\n\n constructor(options: DmkNetworkClientOptions = {}) {\n this.baseUrl = options.baseUrl;\n this.defaultHeaders = options.headers ?? {};\n this.fetchImpl = options.fetch;\n }\n\n private getFetch(): typeof fetch {\n // Resolve `fetch` at call time so that spies installed on `globalThis.fetch`\n // after the client was constructed are still honored.\n return this.fetchImpl ?? globalThis.fetch.bind(globalThis);\n }\n\n public get(url: string, config?: DmkRequestConfig): Promise<unknown> {\n return this.request({ ...config, method: \"GET\", url }).then(\n (res) => res.data,\n );\n }\n\n public post(\n url: string,\n body?: unknown,\n config?: DmkRequestConfig,\n ): Promise<unknown> {\n return this.request({ ...config, method: \"POST\", url, body }).then(\n (res) => res.data,\n );\n }\n\n public put(\n url: string,\n body?: unknown,\n config?: DmkRequestConfig,\n ): Promise<unknown> {\n return this.request({ ...config, method: \"PUT\", url, body }).then(\n (res) => res.data,\n );\n }\n\n public patch(\n url: string,\n body?: unknown,\n config?: DmkRequestConfig,\n ): Promise<unknown> {\n return this.request({ ...config, method: \"PATCH\", url, body }).then(\n (res) => res.data,\n );\n }\n\n public delete(url: string, config?: DmkRequestConfig): Promise<unknown> {\n return this.request({ ...config, method: \"DELETE\", url }).then(\n (res) => res.data,\n );\n }\n\n public head(url: string, config?: DmkRequestConfig): Promise<void> {\n return this.request({\n ...config,\n method: \"HEAD\",\n url,\n responseType: \"void\",\n }).then(() => undefined);\n }\n\n /**\n * Escape hatch returning the full response envelope (status, headers, data).\n * Most callers should prefer {@link get}, {@link post}, etc.\n *\n * `data` is `unknown` by design; validate it with a type guard before use.\n */\n public async request(\n config: InternalRequestConfig,\n ): Promise<DmkNetworkResponse> {\n const url = buildUrl({\n url: config.url,\n params: config.params,\n baseUrl: this.baseUrl,\n });\n const { body, headers } = buildBodyAndHeaders({\n method: config.method,\n body: config.body,\n defaultHeaders: this.defaultHeaders,\n perRequestHeaders: config.headers,\n });\n const signal = buildSignal({\n timeoutMs: config.timeoutMs,\n externalSignal: config.signal,\n });\n const throwOnHttpError = config.throwOnHttpError ?? true;\n const responseType: DmkResponseType = config.responseType ?? \"json\";\n\n let response: Response;\n try {\n response = await this.getFetch()(url, {\n method: config.method,\n headers,\n body,\n signal,\n });\n } catch (cause) {\n throw wrapFetchError({\n cause,\n externalSignal: config.signal,\n timeoutMs: config.timeoutMs,\n });\n }\n\n if (!response.ok && throwOnHttpError) {\n const responseBody = await safeReadText(response);\n throw new DmkNetworkClientError({\n message: `HTTP error ${response.status} ${response.statusText}`.trim(),\n status: response.status,\n statusText: response.statusText,\n responseBody,\n });\n }\n\n const data = await parseBody(response, responseType);\n\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n ok: response.ok,\n };\n }\n}\n"],
5
- "mappings": "AAAA,OAAS,yBAAAA,MAA6B,0BACtC,OACE,uBAAAC,EACA,eAAAC,EACA,YAAAC,EAGA,aAAAC,EACA,gBAAAC,EACA,kBAAAC,MACK,4BAkFA,MAAMC,CAAiB,CACX,QACA,eACA,UAEjB,YAAYC,EAAmC,CAAC,EAAG,CACjD,KAAK,QAAUA,EAAQ,QACvB,KAAK,eAAiBA,EAAQ,SAAW,CAAC,EAC1C,KAAK,UAAYA,EAAQ,KAC3B,CAEQ,UAAyB,CAG/B,OAAO,KAAK,WAAa,WAAW,MAAM,KAAK,UAAU,CAC3D,CAEO,IAAIC,EAAaC,EAA6C,CACnE,OAAO,KAAK,QAAQ,CAAE,GAAGA,EAAQ,OAAQ,MAAO,IAAAD,CAAI,CAAC,EAAE,KACpDE,GAAQA,EAAI,IACf,CACF,CAEO,KACLF,EACAG,EACAF,EACkB,CAClB,OAAO,KAAK,QAAQ,CAAE,GAAGA,EAAQ,OAAQ,OAAQ,IAAAD,EAAK,KAAAG,CAAK,CAAC,EAAE,KAC3DD,GAAQA,EAAI,IACf,CACF,CAEO,IACLF,EACAG,EACAF,EACkB,CAClB,OAAO,KAAK,QAAQ,CAAE,GAAGA,EAAQ,OAAQ,MAAO,IAAAD,EAAK,KAAAG,CAAK,CAAC,EAAE,KAC1DD,GAAQA,EAAI,IACf,CACF,CAEO,MACLF,EACAG,EACAF,EACkB,CAClB,OAAO,KAAK,QAAQ,CAAE,GAAGA,EAAQ,OAAQ,QAAS,IAAAD,EAAK,KAAAG,CAAK,CAAC,EAAE,KAC5DD,GAAQA,EAAI,IACf,CACF,CAEO,OAAOF,EAAaC,EAA6C,CACtE,OAAO,KAAK,QAAQ,CAAE,GAAGA,EAAQ,OAAQ,SAAU,IAAAD,CAAI,CAAC,EAAE,KACvDE,GAAQA,EAAI,IACf,CACF,CAEO,KAAKF,EAAaC,EAA0C,CACjE,OAAO,KAAK,QAAQ,CAClB,GAAGA,EACH,OAAQ,OACR,IAAAD,EACA,aAAc,MAChB,CAAC,EAAE,KAAK,IAAG,EAAY,CACzB,CAQA,MAAa,QACXC,EAC6B,CAC7B,MAAMD,EAAMN,EAAS,CACnB,IAAKO,EAAO,IACZ,OAAQA,EAAO,OACf,QAAS,KAAK,OAChB,CAAC,EACK,CAAE,KAAAE,EAAM,QAAAC,CAAQ,EAAIZ,EAAoB,CAC5C,OAAQS,EAAO,OACf,KAAMA,EAAO,KACb,eAAgB,KAAK,eACrB,kBAAmBA,EAAO,OAC5B,CAAC,EACKI,EAASZ,EAAY,CACzB,UAAWQ,EAAO,UAClB,eAAgBA,EAAO,MACzB,CAAC,EACKK,EAAmBL,EAAO,kBAAoB,GAC9CM,EAAgCN,EAAO,cAAgB,OAE7D,IAAIO,EACJ,GAAI,CACFA,EAAW,MAAM,KAAK,SAAS,EAAER,EAAK,CACpC,OAAQC,EAAO,OACf,QAAAG,EACA,KAAAD,EACA,OAAAE,CACF,CAAC,CACH,OAASI,EAAO,CACd,MAAMZ,EAAe,CACnB,MAAAY,EACA,eAAgBR,EAAO,OACvB,UAAWA,EAAO,SACpB,CAAC,CACH,CAEA,GAAI,CAACO,EAAS,IAAMF,EAAkB,CACpC,MAAMI,EAAe,MAAMd,EAAaY,CAAQ,EAChD,MAAM,IAAIjB,EAAsB,CAC9B,QAAS,cAAciB,EAAS,MAAM,IAAIA,EAAS,UAAU,GAAG,KAAK,EACrE,OAAQA,EAAS,OACjB,WAAYA,EAAS,WACrB,aAAAE,CACF,CAAC,CACH,CAIA,MAAO,CACL,KAHW,MAAMf,EAAUa,EAAUD,CAAY,EAIjD,OAAQC,EAAS,OACjB,WAAYA,EAAS,WACrB,QAASA,EAAS,QAClB,GAAIA,EAAS,EACf,CACF,CACF",
6
- "names": ["DmkNetworkClientError", "buildBodyAndHeaders", "buildSignal", "buildUrl", "parseBody", "safeReadText", "wrapFetchError", "DmkNetworkClient", "options", "url", "config", "res", "body", "headers", "signal", "throwOnHttpError", "responseType", "response", "cause", "responseBody"]
4
+ "sourcesContent": ["import { DmkNetworkClientError } from \"./DmkNetworkClientError\";\nimport {\n buildBodyAndHeaders,\n buildSignal,\n buildUrl,\n type DmkQueryParams,\n type DmkResponseType,\n parseBody,\n safeReadText,\n wrapFetchError,\n} from \"./DmkNetworkClientHelpers\";\n\nexport type { DmkQueryParamValue } from \"./DmkNetworkClientHelpers\";\nexport type { DmkQueryParams, DmkResponseType };\n\n/**\n * Per-request configuration. Everything is optional \u2014 sensible defaults are\n * applied by the client.\n */\nexport type DmkRequestConfig = {\n /** Query params merged into the URL. `null`/`undefined` entries are skipped. */\n params?: DmkQueryParams;\n /** Per-request headers merged on top of the client's default headers. */\n headers?: Record<string, string>;\n /**\n * Per-request timeout in milliseconds. When unset (or `0`), the request\n * has no timeout.\n */\n timeoutMs?: number;\n /**\n * How to parse the response body. Defaults to `\"json\"`, except for `head`\n * which always resolves to `void`.\n */\n responseType?: DmkResponseType;\n /**\n * When `true` (default), non-2xx responses throw {@link DmkNetworkClientError}.\n * Set to `false` to resolve normally and inspect {@link DmkNetworkResponse}\n * via {@link DmkNetworkClient.request}.\n */\n throwOnHttpError?: boolean;\n};\n\n/**\n * Full response envelope returned by {@link DmkNetworkClient.request}.\n * The simple method helpers (`get`, `post`, \u2026) unwrap to `data` directly.\n *\n * `data` is intentionally typed as `unknown`: network payloads are untrusted\n * input, so callers must narrow it with a type guard or runtime validator\n * (e.g. the existing DTO mappers) before use.\n */\nexport type DmkNetworkResponse = {\n data: unknown;\n status: number;\n statusText: string;\n headers: Headers;\n ok: boolean;\n};\n\nexport type DmkNetworkClientOptions = {\n /** Base URL prepended to relative request URLs. */\n baseUrl?: string;\n /** Default headers merged into every request. */\n headers?: Record<string, string>;\n /** Injection point for tests. Defaults to `globalThis.fetch`. */\n fetch?: typeof fetch;\n};\n\ntype InternalRequestConfig = DmkRequestConfig & {\n method: string;\n url: string;\n body?: unknown;\n};\n\n/**\n * Minimal axios-like wrapper over `fetch`. Handles:\n *\n * - URL composition (base URL + relative path + query params from an object)\n * - Automatic JSON body encoding and `Content-Type` header\n * - Default and per-request headers merging\n * - Request timeout via `AbortController`\n * - Automatic `response.ok` check with a typed {@link DmkNetworkClientError}\n * - Typed JSON / text / blob / arrayBuffer response parsing\n *\n * Use the high-level helpers ({@link DmkNetworkClient.get}, {@link DmkNetworkClient.post},\n * \u2026) for 95% of calls and {@link DmkNetworkClient.request} when you need the\n * full response envelope (status, headers).\n */\nexport class DmkNetworkClient {\n private readonly baseUrl?: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly fetchImpl?: typeof fetch;\n\n constructor(options: DmkNetworkClientOptions = {}) {\n this.baseUrl = options.baseUrl;\n this.defaultHeaders = options.headers ?? {};\n this.fetchImpl = options.fetch;\n }\n\n private getFetch(): typeof fetch {\n // Resolve `fetch` at call time so that spies installed on `globalThis.fetch`\n // after the client was constructed are still honored.\n return this.fetchImpl ?? globalThis.fetch.bind(globalThis);\n }\n\n public get(url: string, config?: DmkRequestConfig): Promise<unknown> {\n return this.request({ ...config, method: \"GET\", url }).then(\n (res) => res.data,\n );\n }\n\n public post(\n url: string,\n body?: unknown,\n config?: DmkRequestConfig,\n ): Promise<unknown> {\n return this.request({ ...config, method: \"POST\", url, body }).then(\n (res) => res.data,\n );\n }\n\n public put(\n url: string,\n body?: unknown,\n config?: DmkRequestConfig,\n ): Promise<unknown> {\n return this.request({ ...config, method: \"PUT\", url, body }).then(\n (res) => res.data,\n );\n }\n\n public patch(\n url: string,\n body?: unknown,\n config?: DmkRequestConfig,\n ): Promise<unknown> {\n return this.request({ ...config, method: \"PATCH\", url, body }).then(\n (res) => res.data,\n );\n }\n\n public delete(url: string, config?: DmkRequestConfig): Promise<unknown> {\n return this.request({ ...config, method: \"DELETE\", url }).then(\n (res) => res.data,\n );\n }\n\n public head(url: string, config?: DmkRequestConfig): Promise<void> {\n return this.request({\n ...config,\n method: \"HEAD\",\n url,\n responseType: \"void\",\n }).then(() => undefined);\n }\n\n /**\n * Escape hatch returning the full response envelope (status, headers, data).\n * Most callers should prefer {@link get}, {@link post}, etc.\n *\n * `data` is `unknown` by design; validate it with a type guard before use.\n */\n public async request(\n config: InternalRequestConfig,\n ): Promise<DmkNetworkResponse> {\n const url = buildUrl({\n url: config.url,\n params: config.params,\n baseUrl: this.baseUrl,\n });\n const { body, headers } = buildBodyAndHeaders({\n method: config.method,\n body: config.body,\n defaultHeaders: this.defaultHeaders,\n perRequestHeaders: config.headers,\n });\n const { signal, cleanup } = buildSignal({\n timeoutMs: config.timeoutMs,\n });\n const throwOnHttpError = config.throwOnHttpError ?? true;\n const responseType: DmkResponseType = config.responseType ?? \"json\";\n\n try {\n let response: Response;\n try {\n response = await this.getFetch()(url, {\n method: config.method,\n headers,\n body,\n signal,\n });\n } catch (cause) {\n throw wrapFetchError({\n cause,\n timeoutMs: config.timeoutMs,\n });\n }\n\n if (!response.ok && throwOnHttpError) {\n const responseBody = await safeReadText(response);\n throw new DmkNetworkClientError({\n message:\n `HTTP error ${response.status} ${response.statusText}`.trim(),\n status: response.status,\n statusText: response.statusText,\n responseBody,\n });\n }\n\n const data = await parseBody(response, responseType);\n\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n ok: response.ok,\n };\n } finally {\n cleanup();\n }\n }\n}\n"],
5
+ "mappings": "AAAA,OAAS,yBAAAA,MAA6B,0BACtC,OACE,uBAAAC,EACA,eAAAC,EACA,YAAAC,EAGA,aAAAC,EACA,gBAAAC,EACA,kBAAAC,MACK,4BA6EA,MAAMC,CAAiB,CACX,QACA,eACA,UAEjB,YAAYC,EAAmC,CAAC,EAAG,CACjD,KAAK,QAAUA,EAAQ,QACvB,KAAK,eAAiBA,EAAQ,SAAW,CAAC,EAC1C,KAAK,UAAYA,EAAQ,KAC3B,CAEQ,UAAyB,CAG/B,OAAO,KAAK,WAAa,WAAW,MAAM,KAAK,UAAU,CAC3D,CAEO,IAAIC,EAAaC,EAA6C,CACnE,OAAO,KAAK,QAAQ,CAAE,GAAGA,EAAQ,OAAQ,MAAO,IAAAD,CAAI,CAAC,EAAE,KACpDE,GAAQA,EAAI,IACf,CACF,CAEO,KACLF,EACAG,EACAF,EACkB,CAClB,OAAO,KAAK,QAAQ,CAAE,GAAGA,EAAQ,OAAQ,OAAQ,IAAAD,EAAK,KAAAG,CAAK,CAAC,EAAE,KAC3DD,GAAQA,EAAI,IACf,CACF,CAEO,IACLF,EACAG,EACAF,EACkB,CAClB,OAAO,KAAK,QAAQ,CAAE,GAAGA,EAAQ,OAAQ,MAAO,IAAAD,EAAK,KAAAG,CAAK,CAAC,EAAE,KAC1DD,GAAQA,EAAI,IACf,CACF,CAEO,MACLF,EACAG,EACAF,EACkB,CAClB,OAAO,KAAK,QAAQ,CAAE,GAAGA,EAAQ,OAAQ,QAAS,IAAAD,EAAK,KAAAG,CAAK,CAAC,EAAE,KAC5DD,GAAQA,EAAI,IACf,CACF,CAEO,OAAOF,EAAaC,EAA6C,CACtE,OAAO,KAAK,QAAQ,CAAE,GAAGA,EAAQ,OAAQ,SAAU,IAAAD,CAAI,CAAC,EAAE,KACvDE,GAAQA,EAAI,IACf,CACF,CAEO,KAAKF,EAAaC,EAA0C,CACjE,OAAO,KAAK,QAAQ,CAClB,GAAGA,EACH,OAAQ,OACR,IAAAD,EACA,aAAc,MAChB,CAAC,EAAE,KAAK,IAAG,EAAY,CACzB,CAQA,MAAa,QACXC,EAC6B,CAC7B,MAAMD,EAAMN,EAAS,CACnB,IAAKO,EAAO,IACZ,OAAQA,EAAO,OACf,QAAS,KAAK,OAChB,CAAC,EACK,CAAE,KAAAE,EAAM,QAAAC,CAAQ,EAAIZ,EAAoB,CAC5C,OAAQS,EAAO,OACf,KAAMA,EAAO,KACb,eAAgB,KAAK,eACrB,kBAAmBA,EAAO,OAC5B,CAAC,EACK,CAAE,OAAAI,EAAQ,QAAAC,CAAQ,EAAIb,EAAY,CACtC,UAAWQ,EAAO,SACpB,CAAC,EACKM,EAAmBN,EAAO,kBAAoB,GAC9CO,EAAgCP,EAAO,cAAgB,OAE7D,GAAI,CACF,IAAIQ,EACJ,GAAI,CACFA,EAAW,MAAM,KAAK,SAAS,EAAET,EAAK,CACpC,OAAQC,EAAO,OACf,QAAAG,EACA,KAAAD,EACA,OAAAE,CACF,CAAC,CACH,OAASK,EAAO,CACd,MAAMb,EAAe,CACnB,MAAAa,EACA,UAAWT,EAAO,SACpB,CAAC,CACH,CAEA,GAAI,CAACQ,EAAS,IAAMF,EAAkB,CACpC,MAAMI,EAAe,MAAMf,EAAaa,CAAQ,EAChD,MAAM,IAAIlB,EAAsB,CAC9B,QACE,cAAckB,EAAS,MAAM,IAAIA,EAAS,UAAU,GAAG,KAAK,EAC9D,OAAQA,EAAS,OACjB,WAAYA,EAAS,WACrB,aAAAE,CACF,CAAC,CACH,CAIA,MAAO,CACL,KAHW,MAAMhB,EAAUc,EAAUD,CAAY,EAIjD,OAAQC,EAAS,OACjB,WAAYA,EAAS,WACrB,QAASA,EAAS,QAClB,GAAIA,EAAS,EACf,CACF,QAAE,CACAH,EAAQ,CACV,CACF,CACF",
6
+ "names": ["DmkNetworkClientError", "buildBodyAndHeaders", "buildSignal", "buildUrl", "parseBody", "safeReadText", "wrapFetchError", "DmkNetworkClient", "options", "url", "config", "res", "body", "headers", "signal", "cleanup", "throwOnHttpError", "responseType", "response", "cause", "responseBody"]
7
7
  }