@pagopa/io-react-native-wallet 0.24.1 → 0.26.0

Sign up to get free protection for your applications and to get access to all the features.
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
  };