@pagopa/io-react-native-wallet 0.24.1 → 0.26.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 (186) hide show
  1. package/README.md +0 -32
  2. package/lib/commonjs/client/generated/wallet-provider.js +39 -16
  3. package/lib/commonjs/client/generated/wallet-provider.js.map +1 -1
  4. package/lib/commonjs/client/index.js +25 -10
  5. package/lib/commonjs/client/index.js.map +1 -1
  6. package/lib/commonjs/credential/issuance/03-start-user-authorization.js +2 -2
  7. package/lib/commonjs/credential/issuance/04-complete-user-authorization.js +36 -67
  8. package/lib/commonjs/credential/issuance/04-complete-user-authorization.js.map +1 -1
  9. package/lib/commonjs/credential/issuance/05-authorize-access.js +5 -2
  10. package/lib/commonjs/credential/issuance/05-authorize-access.js.map +1 -1
  11. package/lib/commonjs/credential/issuance/06-obtain-credential.js +26 -17
  12. package/lib/commonjs/credential/issuance/06-obtain-credential.js.map +1 -1
  13. package/lib/commonjs/credential/issuance/README.md +8 -14
  14. package/lib/commonjs/credential/issuance/errors.js +52 -0
  15. package/lib/commonjs/credential/issuance/errors.js.map +1 -0
  16. package/lib/commonjs/credential/issuance/index.js +13 -2
  17. package/lib/commonjs/credential/issuance/index.js.map +1 -1
  18. package/lib/commonjs/credential/issuance/types.js +1 -5
  19. package/lib/commonjs/credential/issuance/types.js.map +1 -1
  20. package/lib/commonjs/credential/presentation/01-start-flow.js +1 -1
  21. package/lib/commonjs/credential/presentation/01-start-flow.js.map +1 -1
  22. package/lib/commonjs/credential/presentation/03-get-request-object.js +2 -2
  23. package/lib/commonjs/credential/presentation/03-get-request-object.js.map +1 -1
  24. package/lib/commonjs/credential/presentation/04-send-authorization-response.js +2 -2
  25. package/lib/commonjs/credential/presentation/04-send-authorization-response.js.map +1 -1
  26. package/lib/commonjs/credential/presentation/errors.js +49 -0
  27. package/lib/commonjs/credential/presentation/errors.js.map +1 -0
  28. package/lib/commonjs/credential/presentation/index.js +5 -0
  29. package/lib/commonjs/credential/presentation/index.js.map +1 -1
  30. package/lib/commonjs/credential/status/02-status-attestation.js +8 -6
  31. package/lib/commonjs/credential/status/02-status-attestation.js.map +1 -1
  32. package/lib/commonjs/credential/status/README.md +5 -2
  33. package/lib/commonjs/credential/status/types.js +1 -14
  34. package/lib/commonjs/credential/status/types.js.map +1 -1
  35. package/lib/commonjs/sd-jwt/errors.js +40 -0
  36. package/lib/commonjs/sd-jwt/errors.js.map +1 -0
  37. package/lib/commonjs/sd-jwt/index.js +8 -4
  38. package/lib/commonjs/sd-jwt/index.js.map +1 -1
  39. package/lib/commonjs/sd-jwt/verifier.js +5 -1
  40. package/lib/commonjs/sd-jwt/verifier.js.map +1 -1
  41. package/lib/commonjs/trust/index.js +2 -2
  42. package/lib/commonjs/trust/index.js.map +1 -1
  43. package/lib/commonjs/utils/decoder.js +3 -1
  44. package/lib/commonjs/utils/decoder.js.map +1 -1
  45. package/lib/commonjs/utils/error-codes.js +51 -0
  46. package/lib/commonjs/utils/error-codes.js.map +1 -0
  47. package/lib/commonjs/utils/errors.js +119 -463
  48. package/lib/commonjs/utils/errors.js.map +1 -1
  49. package/lib/commonjs/utils/misc.js +23 -55
  50. package/lib/commonjs/utils/misc.js.map +1 -1
  51. package/lib/commonjs/utils/par.js +2 -1
  52. package/lib/commonjs/utils/par.js.map +1 -1
  53. package/lib/commonjs/wallet-instance/README.md +26 -5
  54. package/lib/commonjs/wallet-instance/index.js +33 -7
  55. package/lib/commonjs/wallet-instance/index.js.map +1 -1
  56. package/lib/commonjs/wallet-instance-attestation/README.md +8 -2
  57. package/lib/commonjs/wallet-instance-attestation/issuing.js +13 -10
  58. package/lib/commonjs/wallet-instance-attestation/issuing.js.map +1 -1
  59. package/lib/module/client/generated/wallet-provider.js +31 -11
  60. package/lib/module/client/generated/wallet-provider.js.map +1 -1
  61. package/lib/module/client/index.js +22 -8
  62. package/lib/module/client/index.js.map +1 -1
  63. package/lib/module/credential/issuance/03-start-user-authorization.js +2 -2
  64. package/lib/module/credential/issuance/04-complete-user-authorization.js +33 -65
  65. package/lib/module/credential/issuance/04-complete-user-authorization.js.map +1 -1
  66. package/lib/module/credential/issuance/05-authorize-access.js +7 -4
  67. package/lib/module/credential/issuance/05-authorize-access.js.map +1 -1
  68. package/lib/module/credential/issuance/06-obtain-credential.js +29 -20
  69. package/lib/module/credential/issuance/06-obtain-credential.js.map +1 -1
  70. package/lib/module/credential/issuance/README.md +8 -14
  71. package/lib/module/credential/issuance/errors.js +44 -0
  72. package/lib/module/credential/issuance/errors.js.map +1 -0
  73. package/lib/module/credential/issuance/index.js +3 -2
  74. package/lib/module/credential/issuance/index.js.map +1 -1
  75. package/lib/module/credential/issuance/types.js +0 -3
  76. package/lib/module/credential/issuance/types.js.map +1 -1
  77. package/lib/module/credential/presentation/01-start-flow.js +1 -1
  78. package/lib/module/credential/presentation/01-start-flow.js.map +1 -1
  79. package/lib/module/credential/presentation/03-get-request-object.js +3 -3
  80. package/lib/module/credential/presentation/03-get-request-object.js.map +1 -1
  81. package/lib/module/credential/presentation/04-send-authorization-response.js +3 -3
  82. package/lib/module/credential/presentation/04-send-authorization-response.js.map +1 -1
  83. package/lib/module/credential/presentation/errors.js +42 -0
  84. package/lib/module/credential/presentation/errors.js.map +1 -0
  85. package/lib/module/credential/presentation/index.js +2 -1
  86. package/lib/module/credential/presentation/index.js.map +1 -1
  87. package/lib/module/credential/status/02-status-attestation.js +11 -9
  88. package/lib/module/credential/status/02-status-attestation.js.map +1 -1
  89. package/lib/module/credential/status/README.md +5 -2
  90. package/lib/module/credential/status/types.js +0 -12
  91. package/lib/module/credential/status/types.js.map +1 -1
  92. package/lib/module/sd-jwt/errors.js +32 -0
  93. package/lib/module/sd-jwt/errors.js.map +1 -0
  94. package/lib/module/sd-jwt/index.js +5 -5
  95. package/lib/module/sd-jwt/index.js.map +1 -1
  96. package/lib/module/sd-jwt/verifier.js +5 -1
  97. package/lib/module/sd-jwt/verifier.js.map +1 -1
  98. package/lib/module/trust/index.js +3 -3
  99. package/lib/module/trust/index.js.map +1 -1
  100. package/lib/module/utils/decoder.js +3 -1
  101. package/lib/module/utils/decoder.js.map +1 -1
  102. package/lib/module/utils/error-codes.js +43 -0
  103. package/lib/module/utils/error-codes.js.map +1 -0
  104. package/lib/module/utils/errors.js +98 -438
  105. package/lib/module/utils/errors.js.map +1 -1
  106. package/lib/module/utils/misc.js +19 -49
  107. package/lib/module/utils/misc.js.map +1 -1
  108. package/lib/module/utils/par.js +3 -2
  109. package/lib/module/utils/par.js.map +1 -1
  110. package/lib/module/wallet-instance/README.md +26 -5
  111. package/lib/module/wallet-instance/index.js +32 -7
  112. package/lib/module/wallet-instance/index.js.map +1 -1
  113. package/lib/module/wallet-instance-attestation/README.md +8 -2
  114. package/lib/module/wallet-instance-attestation/issuing.js +15 -12
  115. package/lib/module/wallet-instance-attestation/issuing.js.map +1 -1
  116. package/lib/typescript/client/generated/wallet-provider.d.ts +138 -27
  117. package/lib/typescript/client/generated/wallet-provider.d.ts.map +1 -1
  118. package/lib/typescript/client/index.d.ts +7 -1
  119. package/lib/typescript/client/index.d.ts.map +1 -1
  120. package/lib/typescript/credential/issuance/03-start-user-authorization.d.ts +2 -2
  121. package/lib/typescript/credential/issuance/04-complete-user-authorization.d.ts +17 -16
  122. package/lib/typescript/credential/issuance/04-complete-user-authorization.d.ts.map +1 -1
  123. package/lib/typescript/credential/issuance/05-authorize-access.d.ts.map +1 -1
  124. package/lib/typescript/credential/issuance/06-obtain-credential.d.ts.map +1 -1
  125. package/lib/typescript/credential/issuance/errors.d.ts +28 -0
  126. package/lib/typescript/credential/issuance/errors.d.ts.map +1 -0
  127. package/lib/typescript/credential/issuance/index.d.ts +4 -3
  128. package/lib/typescript/credential/issuance/index.d.ts.map +1 -1
  129. package/lib/typescript/credential/issuance/types.d.ts +0 -8
  130. package/lib/typescript/credential/issuance/types.d.ts.map +1 -1
  131. package/lib/typescript/credential/presentation/03-get-request-object.d.ts.map +1 -1
  132. package/lib/typescript/credential/presentation/04-send-authorization-response.d.ts.map +1 -1
  133. package/lib/typescript/credential/presentation/errors.d.ts +25 -0
  134. package/lib/typescript/credential/presentation/errors.d.ts.map +1 -0
  135. package/lib/typescript/credential/presentation/index.d.ts +2 -1
  136. package/lib/typescript/credential/presentation/index.d.ts.map +1 -1
  137. package/lib/typescript/credential/status/02-status-attestation.d.ts.map +1 -1
  138. package/lib/typescript/credential/status/types.d.ts +0 -15
  139. package/lib/typescript/credential/status/types.d.ts.map +1 -1
  140. package/lib/typescript/sd-jwt/errors.d.ts +20 -0
  141. package/lib/typescript/sd-jwt/errors.d.ts.map +1 -0
  142. package/lib/typescript/sd-jwt/index.d.ts +3 -2
  143. package/lib/typescript/sd-jwt/index.d.ts.map +1 -1
  144. package/lib/typescript/utils/error-codes.d.ts +45 -0
  145. package/lib/typescript/utils/error-codes.d.ts.map +1 -0
  146. package/lib/typescript/utils/errors.d.ts +88 -225
  147. package/lib/typescript/utils/errors.d.ts.map +1 -1
  148. package/lib/typescript/utils/misc.d.ts +9 -24
  149. package/lib/typescript/utils/misc.d.ts.map +1 -1
  150. package/lib/typescript/utils/par.d.ts.map +1 -1
  151. package/lib/typescript/wallet-instance/index.d.ts +17 -1
  152. package/lib/typescript/wallet-instance/index.d.ts.map +1 -1
  153. package/lib/typescript/wallet-instance-attestation/issuing.d.ts.map +1 -1
  154. package/lib/typescript/wallet-instance-attestation/types.d.ts +4 -4
  155. package/package.json +1 -1
  156. package/src/client/generated/wallet-provider.ts +43 -13
  157. package/src/client/index.ts +28 -15
  158. package/src/credential/issuance/03-start-user-authorization.ts +2 -2
  159. package/src/credential/issuance/04-complete-user-authorization.ts +57 -118
  160. package/src/credential/issuance/05-authorize-access.ts +7 -4
  161. package/src/credential/issuance/06-obtain-credential.ts +39 -39
  162. package/src/credential/issuance/README.md +8 -14
  163. package/src/credential/issuance/errors.ts +44 -0
  164. package/src/credential/issuance/index.ts +8 -2
  165. package/src/credential/issuance/types.ts +0 -8
  166. package/src/credential/presentation/01-start-flow.ts +1 -1
  167. package/src/credential/presentation/03-get-request-object.ts +3 -3
  168. package/src/credential/presentation/04-send-authorization-response.ts +3 -3
  169. package/src/credential/presentation/errors.ts +41 -0
  170. package/src/credential/presentation/index.ts +2 -0
  171. package/src/credential/status/02-status-attestation.ts +17 -25
  172. package/src/credential/status/README.md +5 -2
  173. package/src/credential/status/types.ts +0 -15
  174. package/src/sd-jwt/errors.ts +39 -0
  175. package/src/sd-jwt/index.ts +5 -8
  176. package/src/sd-jwt/verifier.ts +5 -5
  177. package/src/trust/index.ts +3 -3
  178. package/src/utils/decoder.ts +3 -3
  179. package/src/utils/error-codes.ts +50 -0
  180. package/src/utils/errors.ts +152 -476
  181. package/src/utils/misc.ts +21 -65
  182. package/src/utils/par.ts +3 -2
  183. package/src/wallet-instance/README.md +26 -5
  184. package/src/wallet-instance/index.ts +40 -18
  185. package/src/wallet-instance-attestation/README.md +8 -2
  186. package/src/wallet-instance-attestation/issuing.ts +28 -36
package/src/utils/misc.ts CHANGED
@@ -2,25 +2,36 @@ import { IoWalletError, UnexpectedStatusCodeError } from "./errors";
2
2
  import { sha256 } from "js-sha256";
3
3
 
4
4
  /**
5
- * Check if a response is in the expected status, other
5
+ * Check if a response is in the expected status, otherwise throw an error
6
6
  * @param status - The expected status
7
- * @throws {@link UnexpectedStatusCodeError} if the status is different from the one expected
7
+ * @param customError - A custom error compatible with {@link UnexpectedStatusCodeError}
8
+ * @throws UnexpectedStatusCodeError if the status is different from the one expected
8
9
  * @returns The given response object
9
10
  */
10
- export const hasStatus =
11
- (status: number) =>
11
+ export const hasStatusOrThrow =
12
+ (status: number, customError?: typeof UnexpectedStatusCodeError) =>
12
13
  async (res: Response): Promise<Response> => {
13
14
  if (res.status !== status) {
14
- const responseBody = await res.text();
15
- throw new UnexpectedStatusCodeError(
16
- `Http request failed. Expected ${status}, got ${res.status}, url: ${res.url} with response: ${responseBody}`,
17
- res.status,
18
- responseBody
19
- );
15
+ const ErrorClass = customError ?? UnexpectedStatusCodeError;
16
+ throw new ErrorClass({
17
+ message: `Http request failed. Expected ${status}, got ${res.status}, url: ${res.url}`,
18
+ statusCode: res.status,
19
+ reason: await parseRawHttpResponse(res), // Pass the response body as reason so the original error can surface
20
+ });
20
21
  }
21
22
  return res;
22
23
  };
23
24
 
25
+ /**
26
+ * Utility function to parse a raw HTTP response as JSON if supported, otherwise as text.
27
+ */
28
+ export const parseRawHttpResponse = <T extends Record<string, unknown>>(
29
+ response: Response
30
+ ) =>
31
+ response.headers.get("content-type")?.includes("application/json")
32
+ ? (response.json() as Promise<T>)
33
+ : response.text();
34
+
24
35
  // extract a type from an async function output
25
36
  // helpful to bind the input of a function to the output of another
26
37
  export type Out<FN> = FN extends (...args: any[]) => Promise<any>
@@ -39,39 +50,6 @@ export const generateRandomAlphaNumericString = (size: number) =>
39
50
  Math.floor(Math.random() * 36).toString(36)
40
51
  ).join("");
41
52
 
42
- /**
43
- * Repeatedly checks a condition function until it returns true,
44
- * then resolves the returned promise. If the condition function does not return true
45
- * within the specified timeout, the promise is rejected.
46
- *
47
- * @param conditionFunction - A function that returns a boolean value.
48
- * The promise resolves when this function returns true.
49
- * @param timeout - An optional timeout in seconds. The promise is rejected if the
50
- * condition function does not return true within this time.
51
- * @returns A promise that resolves once the conditionFunction returns true or rejects if timed out.
52
- */
53
- export const until = (
54
- conditionFunction: () => boolean,
55
- timeoutSeconds?: number
56
- ): Promise<void> =>
57
- new Promise<void>((resolve, reject) => {
58
- const start = Date.now();
59
- const poll = () => {
60
- if (conditionFunction()) {
61
- resolve();
62
- } else if (
63
- timeoutSeconds !== undefined &&
64
- Date.now() - start >= timeoutSeconds * 1000
65
- ) {
66
- reject(new Error("Timeout exceeded"));
67
- } else {
68
- setTimeout(poll, 400);
69
- }
70
- };
71
-
72
- poll();
73
- });
74
-
75
53
  /**
76
54
  * Get the hash of a credential without discloures.
77
55
  * A credential is a string like `header.body.sign~sd1~sd2....` where `~` is the separator between the credential and the discloures.
@@ -88,28 +66,6 @@ export const getCredentialHashWithouDiscloures = async (
88
66
  return sha256(credential.slice(0, tildeIndex));
89
67
  };
90
68
 
91
- /**
92
- * Creates a promise that waits until the provided signal is aborted.
93
- * @returns {Object} An object with `listen` and `remove` methods to handle subscribing and unsubscribing.
94
- */
95
- export const createAbortPromiseFromSignal = (signal: AbortSignal) => {
96
- let listener: () => void;
97
- return {
98
- listen: () =>
99
- new Promise<"OPERATION_ABORTED">((resolve) => {
100
- if (signal.aborted) {
101
- return resolve("OPERATION_ABORTED");
102
- }
103
- listener = () => resolve("OPERATION_ABORTED");
104
- signal.addEventListener("abort", listener);
105
- }),
106
- remove: () => signal.removeEventListener("abort", listener),
107
- };
108
- };
109
-
110
- export const isDefined = <T>(x: T | undefined | null | ""): x is T =>
111
- Boolean(x);
112
-
113
69
  export const safeJsonParse = <T>(text: string, withDefault?: T): T | null => {
114
70
  try {
115
71
  return JSON.parse(text);
package/src/utils/par.ts CHANGED
@@ -6,8 +6,9 @@ import {
6
6
  import uuid from "react-native-uuid";
7
7
  import * as z from "zod";
8
8
  import * as WalletInstanceAttestation from "../wallet-instance-attestation";
9
- import { generateRandomAlphaNumericString, hasStatus } from "./misc";
9
+ import { generateRandomAlphaNumericString, hasStatusOrThrow } from "./misc";
10
10
  import { createPopToken } from "./pop";
11
+ import { IssuerResponseError } from "./errors";
11
12
 
12
13
  export type AuthorizationDetail = z.infer<typeof AuthorizationDetail>;
13
14
  export const AuthorizationDetail = z.object({
@@ -109,7 +110,7 @@ export const makeParRequest =
109
110
  },
110
111
  body: formBody.toString(),
111
112
  })
112
- .then(hasStatus(201))
113
+ .then(hasStatusOrThrow(201, IssuerResponseError))
113
114
  .then((res) => res.json())
114
115
  .then((result) => result.request_uri);
115
116
  };
@@ -6,7 +6,8 @@ The suggested way to implement this service is to use [io-react-native-integrity
6
6
 
7
7
  The following methods are available:
8
8
  - `createWalletInstance` creates a new wallet instance;
9
- - `revokeCurrentWalletInstance` revokes the currently valid wallet instance of the user who made the request.
9
+ - `revokeWalletInstance` revokes a wallet instance by ID;
10
+ - `getWalletInstanceStatus` fetches the status of a wallet instance by ID without the need to require an attestation.
10
11
 
11
12
  Examples are provided as follows:
12
13
 
@@ -35,12 +36,29 @@ return integrityKeyTag;
35
36
 
36
37
  The returned `integrityKeyTag` is supposed to be stored and used to verify the integrity of the device in the future when using an `IntegrityContext` object. It must be regenerated if another wallet instance is created.
37
38
 
38
- ### Wallet instance revocation
39
+ ### Wallet Instance revocation
40
+
41
+ Revoke a Wallet Instance by ID. The ID matches the hardware/integrity key tag used for creation.
42
+
43
+ ```ts
44
+ const { WALLET_PROVIDER_BASE_URL } = env;
45
+
46
+ await WalletInstance.revokeWalletInstance({
47
+ id: "495e5bec-b93f-4fd7-952a-94b27233abdb"
48
+ walletProviderBaseUrl: WALLET_PROVIDER_BASE_URL,
49
+ appFetch,
50
+ });
51
+
52
+ ```
53
+ ### Wallet Instance status
54
+
55
+ Get the status of a Wallet Instance by ID. The ID matches the hardware/integrity key tag used for creation.
39
56
 
40
57
  ```ts
41
58
  const { WALLET_PROVIDER_BASE_URL } = env;
42
59
 
43
- await WalletInstance.revokeCurrentWalletInstance({
60
+ const status = await WalletInstance.getWalletInstanceStatus({
61
+ id: "495e5bec-b93f-4fd7-952a-94b27233abdb"
44
62
  walletProviderBaseUrl: WALLET_PROVIDER_BASE_URL,
45
63
  appFetch,
46
64
  });
@@ -48,6 +66,9 @@ await WalletInstance.revokeCurrentWalletInstance({
48
66
 
49
67
  ## Mapped results
50
68
 
51
- ### 409 Conflict (WalletInstanceCreationIntegrityError)
69
+ The following errors are mapped to a `WalletProviderResponseError` with specific codes.
52
70
 
53
- A `409 Conflict` response is returned by the wallet provider when an integrity check fails.
71
+ |HTTP Status|Error Code|Description|
72
+ |-----------|----------|-----------|
73
+ |`409 Conflict`|`ERR_IO_WALLET_INSTANCE_INTEGRITY_FAILED`|This response is returned by the wallet provider when an integrity check fails.|
74
+ |`*`|`ERR_IO_WALLET_PROVIDER_GENERIC_ERROR`|This is a generic error code to map unexpected errors that occurred when interacting with the Wallet Provider.|
@@ -1,10 +1,11 @@
1
1
  import { getWalletProviderClient } from "../client";
2
- import type { IntegrityContext } from "..";
3
2
  import {
4
- WalletInstanceCreationError,
5
- WalletInstanceCreationIntegrityError,
3
+ ResponseErrorBuilder,
6
4
  WalletProviderResponseError,
5
+ WalletProviderResponseErrorCodes,
7
6
  } from "../utils/errors";
7
+ import type { WalletInstanceData } from "../client/generated/wallet-provider";
8
+ import type { IntegrityContext } from "..";
8
9
 
9
10
  export async function createWalletInstance(context: {
10
11
  integrityContext: IntegrityContext;
@@ -40,28 +41,49 @@ const handleCreateWalletInstanceError = (e: unknown) => {
40
41
  throw e;
41
42
  }
42
43
 
43
- if (e.statusCode === 409) {
44
- throw new WalletInstanceCreationIntegrityError(
45
- "Unable to get an attestation for a Wallet Instance that failed the integrity check",
46
- e.claim,
47
- e.reason
48
- );
49
- }
50
-
51
- throw new WalletInstanceCreationError(
52
- `Unable to obtain wallet instance attestation [response status code: ${e.statusCode}]`,
53
- e.claim,
54
- e.reason
55
- );
44
+ throw new ResponseErrorBuilder(WalletProviderResponseError)
45
+ .handle(409, {
46
+ code: WalletProviderResponseErrorCodes.WalletInstanceIntegrityFailed,
47
+ message:
48
+ "Unable to create a wallet instance with a device that failed the integrity check",
49
+ })
50
+ .handle("*", {
51
+ code: WalletProviderResponseErrorCodes.WalletInstanceCreationFailed,
52
+ message: "Unable to create wallet instance",
53
+ })
54
+ .buildFrom(e);
56
55
  };
57
56
 
58
- export async function revokeCurrentWalletInstance(context: {
57
+ /**
58
+ * Revoke a Wallet Instance by ID.
59
+ * @param context.id The Wallet Instance ID. It matches the hardware key tag used for creation.
60
+ */
61
+ export async function revokeWalletInstance(context: {
62
+ id: string;
59
63
  walletProviderBaseUrl: string;
60
64
  appFetch?: GlobalFetch["fetch"];
61
65
  }): Promise<void> {
62
66
  const api = getWalletProviderClient(context);
63
67
 
64
- await api.put("/wallet-instances/current/status", {
68
+ await api.put("/wallet-instances/{id}/status", {
69
+ path: { id: context.id },
65
70
  body: { status: "REVOKED" },
66
71
  });
67
72
  }
73
+
74
+ /**
75
+ * Get the status of a Wallet Instance by ID.
76
+ * @param context.id The Wallet Instance ID. It matches the hardware key tag used for creation.
77
+ * @returns Details on the status of the Wallet Instance
78
+ */
79
+ export async function getWalletInstanceStatus(context: {
80
+ id: string;
81
+ walletProviderBaseUrl: string;
82
+ appFetch?: GlobalFetch["fetch"];
83
+ }): Promise<WalletInstanceData> {
84
+ const api = getWalletProviderClient(context);
85
+
86
+ return api.get("/wallet-instances/{id}/status", {
87
+ path: { id: context.id },
88
+ });
89
+ }
@@ -36,6 +36,12 @@ The returned `issuedAttestation` is supposed to be stored and used for any futur
36
36
 
37
37
  ## Mapped results
38
38
 
39
- ### 409 Conflict (WalletInstanceIntegrityFailedError)
39
+ The following errors are mapped to a `WalletProviderResponseError` with specific codes.
40
+
41
+ |HTTP Status|Error Code|Description|
42
+ |-----------|----------|-----------|
43
+ |`403 Forbidden`|`ERR_IO_WALLET_INSTANCE_REVOKED`|This response is returned by the wallet provider when the wallet instance has been revoked.|
44
+ |`404 Not Found`|`ERR_IO_WALLET_INSTANCE_NOT_FOUND`|This response is returned by the wallet provider when the wallet instance does not exist.|
45
+ |`409 Conflict`|`ERR_IO_WALLET_INSTANCE_INTEGRITY_FAILED`|This response is returned by the wallet provider when an integrity check fails.|
46
+ |`*`|`ERR_IO_WALLET_PROVIDER_GENERIC_ERROR`|This is a generic error code to map unexpected errors that occurred when interacting with the Wallet Provider.|
40
47
 
41
- A `409 Conflict` response is returned by the wallet provider when an integrity check fails.
@@ -1,14 +1,15 @@
1
- import { type CryptoContext } from "@pagopa/io-react-native-jwt";
2
- import { SignJWT, thumbprint } from "@pagopa/io-react-native-jwt";
3
- import { JWK, fixBase64EncodingOnKey } from "../utils/jwk";
1
+ import {
2
+ type CryptoContext,
3
+ SignJWT,
4
+ thumbprint,
5
+ } from "@pagopa/io-react-native-jwt";
6
+ import { fixBase64EncodingOnKey, JWK } from "../utils/jwk";
4
7
  import { getWalletProviderClient } from "../client";
5
8
  import type { IntegrityContext } from "..";
6
9
  import {
10
+ ResponseErrorBuilder,
7
11
  WalletProviderResponseError,
8
- WalletInstanceRevokedError,
9
- WalletInstanceNotFoundError,
10
- WalletInstanceAttestationIssuingError,
11
- WalletInstanceIntegrityFailedError,
12
+ WalletProviderResponseErrorCodes,
12
13
  } from "../utils/errors";
13
14
  import { TokenResponse } from "./types";
14
15
 
@@ -120,33 +121,24 @@ const handleAttestationCreationError = (e: unknown) => {
120
121
  throw e;
121
122
  }
122
123
 
123
- if (e.statusCode === 403) {
124
- throw new WalletInstanceRevokedError(
125
- "Unable to get an attestation for a revoked Wallet Instance",
126
- e.claim,
127
- e.reason
128
- );
129
- }
130
-
131
- if (e.statusCode === 404) {
132
- throw new WalletInstanceNotFoundError(
133
- "Unable to get an attestation for a Wallet Instance that does not exist",
134
- e.claim,
135
- e.reason
136
- );
137
- }
138
-
139
- if (e.statusCode === 409) {
140
- throw new WalletInstanceIntegrityFailedError(
141
- "Unable to get an attestation for a Wallet Instance that failed the integrity check",
142
- e.claim,
143
- e.reason
144
- );
145
- }
146
-
147
- throw new WalletInstanceAttestationIssuingError(
148
- `Unable to obtain wallet instance attestation [response status code: ${e.statusCode}]`,
149
- e.claim,
150
- e.reason
151
- );
124
+ throw new ResponseErrorBuilder(WalletProviderResponseError)
125
+ .handle(403, {
126
+ code: WalletProviderResponseErrorCodes.WalletInstanceRevoked,
127
+ message: "Unable to get an attestation for a revoked Wallet Instance",
128
+ })
129
+ .handle(404, {
130
+ code: WalletProviderResponseErrorCodes.WalletInstanceNotFound,
131
+ message:
132
+ "Unable to get an attestation for a Wallet Instance that does not exist",
133
+ })
134
+ .handle(409, {
135
+ code: WalletProviderResponseErrorCodes.WalletInstanceIntegrityFailed,
136
+ message:
137
+ "Unable to get an attestation for a Wallet Instance that failed the integrity check",
138
+ })
139
+ .handle("*", {
140
+ code: WalletProviderResponseErrorCodes.WalletInstanceAttestationIssuingFailed,
141
+ message: "Unable to obtain wallet instance attestation",
142
+ })
143
+ .buildFrom(e);
152
144
  };