@ic-reactor/react 3.6.0 → 3.8.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 (131) hide show
  1. package/README.md +117 -13
  2. package/dist/auth/authentication-manager.d.ts +98 -0
  3. package/dist/auth/authentication-manager.d.ts.map +1 -0
  4. package/dist/auth/authentication-manager.js +532 -0
  5. package/dist/auth/authentication-manager.js.map +1 -0
  6. package/dist/auth/constants.d.ts +18 -0
  7. package/dist/auth/constants.d.ts.map +1 -0
  8. package/dist/auth/constants.js +18 -0
  9. package/dist/auth/constants.js.map +1 -0
  10. package/dist/auth/createIdentityAttributeHooks.d.ts +14 -0
  11. package/dist/auth/createIdentityAttributeHooks.d.ts.map +1 -0
  12. package/dist/auth/createIdentityAttributeHooks.js +54 -0
  13. package/dist/auth/createIdentityAttributeHooks.js.map +1 -0
  14. package/dist/auth/identity-attributes-manager.d.ts +26 -0
  15. package/dist/auth/identity-attributes-manager.d.ts.map +1 -0
  16. package/dist/auth/identity-attributes-manager.js +108 -0
  17. package/dist/auth/identity-attributes-manager.js.map +1 -0
  18. package/dist/auth/identity-attributes.d.ts +19 -0
  19. package/dist/auth/identity-attributes.d.ts.map +1 -0
  20. package/dist/auth/identity-attributes.js +170 -0
  21. package/dist/auth/identity-attributes.js.map +1 -0
  22. package/dist/auth/index.d.ts +8 -0
  23. package/dist/auth/index.d.ts.map +1 -0
  24. package/dist/auth/index.js +8 -0
  25. package/dist/auth/index.js.map +1 -0
  26. package/dist/auth/types.d.ts +182 -0
  27. package/dist/auth/types.d.ts.map +1 -0
  28. package/dist/auth/types.js +2 -0
  29. package/dist/auth/types.js.map +1 -0
  30. package/dist/createActorHooks.d.ts +16 -16
  31. package/dist/createActorHooks.d.ts.map +1 -1
  32. package/dist/createActorHooks.js +6 -6
  33. package/dist/createActorHooks.js.map +1 -1
  34. package/dist/createInfiniteQuery.d.ts +33 -33
  35. package/dist/createInfiniteQuery.d.ts.map +1 -1
  36. package/dist/createInfiniteQuery.js +6 -6
  37. package/dist/createInfiniteQuery.js.map +1 -1
  38. package/dist/createMutation.d.ts +13 -2
  39. package/dist/createMutation.d.ts.map +1 -1
  40. package/dist/createMutation.js +11 -0
  41. package/dist/createMutation.js.map +1 -1
  42. package/dist/createQuery.d.ts +13 -3
  43. package/dist/createQuery.d.ts.map +1 -1
  44. package/dist/createQuery.js +16 -6
  45. package/dist/createQuery.js.map +1 -1
  46. package/dist/createSuspenseInfiniteQuery.d.ts +32 -32
  47. package/dist/createSuspenseInfiniteQuery.d.ts.map +1 -1
  48. package/dist/createSuspenseInfiniteQuery.js +6 -6
  49. package/dist/createSuspenseInfiniteQuery.js.map +1 -1
  50. package/dist/createSuspenseQuery.d.ts +3 -3
  51. package/dist/createSuspenseQuery.d.ts.map +1 -1
  52. package/dist/createSuspenseQuery.js +1 -1
  53. package/dist/createSuspenseQuery.js.map +1 -1
  54. package/dist/defineReactor.d.ts +124 -0
  55. package/dist/defineReactor.d.ts.map +1 -0
  56. package/dist/defineReactor.js +145 -0
  57. package/dist/defineReactor.js.map +1 -0
  58. package/dist/{createAuthHooks.d.ts → hooks/createAuthHooks.d.ts} +6 -13
  59. package/dist/hooks/createAuthHooks.d.ts.map +1 -0
  60. package/dist/{createAuthHooks.js → hooks/createAuthHooks.js} +18 -58
  61. package/dist/hooks/createAuthHooks.js.map +1 -0
  62. package/dist/hooks/index.d.ts +2 -0
  63. package/dist/hooks/index.d.ts.map +1 -1
  64. package/dist/hooks/index.js +2 -0
  65. package/dist/hooks/index.js.map +1 -1
  66. package/dist/hooks/useActorInfiniteQuery.d.ts +9 -9
  67. package/dist/hooks/useActorInfiniteQuery.d.ts.map +1 -1
  68. package/dist/hooks/useActorInfiniteQuery.js +3 -1
  69. package/dist/hooks/useActorInfiniteQuery.js.map +1 -1
  70. package/dist/hooks/useActorMethod.d.ts +17 -17
  71. package/dist/hooks/useActorMethod.d.ts.map +1 -1
  72. package/dist/hooks/useActorMethod.js.map +1 -1
  73. package/dist/hooks/useActorMutation.d.ts +18 -7
  74. package/dist/hooks/useActorMutation.d.ts.map +1 -1
  75. package/dist/hooks/useActorMutation.js +11 -0
  76. package/dist/hooks/useActorMutation.js.map +1 -1
  77. package/dist/hooks/useActorQuery.d.ts +8 -8
  78. package/dist/hooks/useActorQuery.d.ts.map +1 -1
  79. package/dist/hooks/useActorQuery.js.map +1 -1
  80. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts +9 -9
  81. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts.map +1 -1
  82. package/dist/hooks/useActorSuspenseInfiniteQuery.js +3 -1
  83. package/dist/hooks/useActorSuspenseInfiniteQuery.js.map +1 -1
  84. package/dist/hooks/useActorSuspenseQuery.d.ts +8 -8
  85. package/dist/hooks/useActorSuspenseQuery.d.ts.map +1 -1
  86. package/dist/hooks/useActorSuspenseQuery.js.map +1 -1
  87. package/dist/index.d.ts +11 -10
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +11 -10
  90. package/dist/index.js.map +1 -1
  91. package/dist/types.d.ts +24 -24
  92. package/dist/types.d.ts.map +1 -1
  93. package/dist/utils.d.ts +3 -0
  94. package/dist/utils.d.ts.map +1 -1
  95. package/dist/utils.js +10 -2
  96. package/dist/utils.js.map +1 -1
  97. package/llms.txt +48 -0
  98. package/package.json +34 -23
  99. package/src/auth/authentication-manager.ts +591 -0
  100. package/src/auth/constants.ts +25 -0
  101. package/src/auth/createIdentityAttributeHooks.ts +83 -0
  102. package/src/auth/identity-attributes-manager.ts +136 -0
  103. package/src/auth/identity-attributes.ts +270 -0
  104. package/src/auth/index.ts +7 -0
  105. package/src/auth/types.ts +204 -0
  106. package/src/createActorHooks.ts +90 -58
  107. package/src/createInfiniteQuery.ts +154 -98
  108. package/src/createMutation.ts +35 -19
  109. package/src/createQuery.ts +94 -50
  110. package/src/createSuspenseInfiniteQuery.ts +166 -115
  111. package/src/createSuspenseQuery.ts +69 -43
  112. package/src/defineReactor.ts +272 -0
  113. package/src/{createAuthHooks.ts → hooks/createAuthHooks.ts} +23 -99
  114. package/src/hooks/index.ts +4 -0
  115. package/src/hooks/useActorInfiniteQuery.ts +44 -30
  116. package/src/hooks/useActorMethod.ts +62 -53
  117. package/src/hooks/useActorMutation.ts +47 -30
  118. package/src/hooks/useActorQuery.ts +36 -32
  119. package/src/hooks/useActorSuspenseInfiniteQuery.ts +56 -30
  120. package/src/hooks/useActorSuspenseQuery.ts +42 -32
  121. package/src/index.ts +12 -10
  122. package/src/types.ts +76 -71
  123. package/src/utils.ts +15 -2
  124. package/dist/createAuthHooks.d.ts.map +0 -1
  125. package/dist/createAuthHooks.js.map +0 -1
  126. package/src/hooks/useActorInfiniteQuery.test.tsx +0 -457
  127. package/src/hooks/useActorMethod.test.tsx +0 -798
  128. package/src/hooks/useActorMutation.test.tsx +0 -220
  129. package/src/hooks/useActorQuery.test.tsx +0 -287
  130. package/src/hooks/useActorSuspenseInfiniteQuery.test.tsx +0 -472
  131. package/src/hooks/useActorSuspenseQuery.test.tsx +0 -254
@@ -0,0 +1,54 @@
1
+ import { useCallback, useState } from "react";
2
+ export function createIdentityAttributeHooks(identityAttributes) {
3
+ const useIdentityAttributes = () => {
4
+ const [attributes, setAttributes] = useState(null);
5
+ const [isRequestingAttributes, setIsRequestingAttributes] = useState(false);
6
+ const [attributeError, setAttributeError] = useState(null);
7
+ const requestAttributes = useCallback(async (params) => {
8
+ setIsRequestingAttributes(true);
9
+ setAttributeError(null);
10
+ try {
11
+ const result = await identityAttributes.request(params);
12
+ setAttributes(result);
13
+ return result;
14
+ }
15
+ catch (error) {
16
+ setAttributeError(error);
17
+ throw error;
18
+ }
19
+ finally {
20
+ setIsRequestingAttributes(false);
21
+ }
22
+ }, []);
23
+ const requestOpenIdAttributes = useCallback(async (params) => {
24
+ setIsRequestingAttributes(true);
25
+ setAttributeError(null);
26
+ try {
27
+ const result = await identityAttributes.requestOpenId(params);
28
+ setAttributes(result);
29
+ return result;
30
+ }
31
+ catch (error) {
32
+ setAttributeError(error);
33
+ throw error;
34
+ }
35
+ finally {
36
+ setIsRequestingAttributes(false);
37
+ }
38
+ }, []);
39
+ const clearAttributes = useCallback(() => {
40
+ setAttributes(null);
41
+ setAttributeError(null);
42
+ }, []);
43
+ return {
44
+ requestAttributes,
45
+ requestOpenIdAttributes,
46
+ attributes,
47
+ isRequestingAttributes,
48
+ attributeError,
49
+ clearAttributes,
50
+ };
51
+ };
52
+ return { useIdentityAttributes };
53
+ }
54
+ //# sourceMappingURL=createIdentityAttributeHooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createIdentityAttributeHooks.js","sourceRoot":"","sources":["../../src/auth/createIdentityAttributeHooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAqB7C,MAAM,UAAU,4BAA4B,CAC1C,kBAA6C;IAE7C,MAAM,qBAAqB,GAAG,GAAgC,EAAE;QAC9D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAC/B,QAAQ,CAAiC,IAAI,CAAC,CAAA;QAChD,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC3E,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAA;QAExE,MAAM,iBAAiB,GAAG,WAAW,CACnC,KAAK,EAAE,MAA2C,EAAE,EAAE;YACpD,yBAAyB,CAAC,IAAI,CAAC,CAAA;YAC/B,iBAAiB,CAAC,IAAI,CAAC,CAAA;YACvB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACvD,aAAa,CAAC,MAAM,CAAC,CAAA;gBACrB,OAAO,MAAM,CAAA;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,iBAAiB,CAAC,KAAc,CAAC,CAAA;gBACjC,MAAM,KAAK,CAAA;YACb,CAAC;oBAAS,CAAC;gBACT,yBAAyB,CAAC,KAAK,CAAC,CAAA;YAClC,CAAC;QACH,CAAC,EACD,EAAE,CACH,CAAA;QAED,MAAM,uBAAuB,GAAG,WAAW,CACzC,KAAK,EAAE,MAAiD,EAAE,EAAE;YAC1D,yBAAyB,CAAC,IAAI,CAAC,CAAA;YAC/B,iBAAiB,CAAC,IAAI,CAAC,CAAA;YACvB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;gBAC7D,aAAa,CAAC,MAAM,CAAC,CAAA;gBACrB,OAAO,MAAM,CAAA;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,iBAAiB,CAAC,KAAc,CAAC,CAAA;gBACjC,MAAM,KAAK,CAAA;YACb,CAAC;oBAAS,CAAC;gBACT,yBAAyB,CAAC,KAAK,CAAC,CAAA;YAClC,CAAC;QACH,CAAC,EACD,EAAE,CACH,CAAA;QAED,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;YACvC,aAAa,CAAC,IAAI,CAAC,CAAA;YACnB,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC,EAAE,EAAE,CAAC,CAAA;QAEN,OAAO;YACL,iBAAiB;YACjB,uBAAuB;YACvB,UAAU;YACV,sBAAsB;YACtB,cAAc;YACd,eAAe;SAChB,CAAA;IACH,CAAC,CAAA;IAED,OAAO,EAAE,qBAAqB,EAAE,CAAA;AAClC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { IdentityAttributeResult, RequestIdentityAttributesParameters, RequestOpenIdIdentityAttributesParameters } from "./types.js";
2
+ import { AuthenticationManager } from "./authentication-manager.js";
3
+ /**
4
+ * Requests and decodes signed identity attributes for an authenticated
5
+ * Internet Identity session.
6
+ *
7
+ * Await `authentication.prepareClient()` once during startup (the `useAuth`
8
+ * hook already does) so that {@link request} can open the identity provider
9
+ * window synchronously from a click handler.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const attributes = new IdentityAttributesManager(authentication)
14
+ * const result = await attributes.request({
15
+ * keys: ["name"],
16
+ * nonce: () => fetchNonceFromCanister(),
17
+ * })
18
+ * ```
19
+ */
20
+ export declare class IdentityAttributesManager {
21
+ readonly authentication: AuthenticationManager;
22
+ constructor(authentication: AuthenticationManager);
23
+ request: ({ keys, nonce, signIn, maxTimeToLive, targets, ...clientOptions }: RequestIdentityAttributesParameters) => Promise<IdentityAttributeResult>;
24
+ requestOpenId: ({ keys, openIdProvider, ...rest }: RequestOpenIdIdentityAttributesParameters) => Promise<IdentityAttributeResult>;
25
+ }
26
+ //# sourceMappingURL=identity-attributes-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-attributes-manager.d.ts","sourceRoot":"","sources":["../../src/auth/identity-attributes-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,uBAAuB,EACvB,mCAAmC,EACnC,yCAAyC,EAC1C,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AAOnE;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,yBAAyB;aACR,cAAc,EAAE,qBAAqB;gBAArC,cAAc,EAAE,qBAAqB;IAE1D,OAAO,GAAU,mEAOrB,mCAAmC,KAAG,OAAO,CAAC,uBAAuB,CAAC,CAyDxE;IAEM,aAAa,GAAI,mCAIrB,yCAAyC,KAAG,OAAO,CAAC,uBAAuB,CAAC,CAO9E;CACF"}
@@ -0,0 +1,108 @@
1
+ import { decodeIdentityAttributeValues, identityAttributeKeys, normalizeSignedIdentityAttributes, } from "./identity-attributes.js";
2
+ /**
3
+ * Requests and decodes signed identity attributes for an authenticated
4
+ * Internet Identity session.
5
+ *
6
+ * Await `authentication.prepareClient()` once during startup (the `useAuth`
7
+ * hook already does) so that {@link request} can open the identity provider
8
+ * window synchronously from a click handler.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const attributes = new IdentityAttributesManager(authentication)
13
+ * const result = await attributes.request({
14
+ * keys: ["name"],
15
+ * nonce: () => fetchNonceFromCanister(),
16
+ * })
17
+ * ```
18
+ */
19
+ export class IdentityAttributesManager {
20
+ constructor(authentication) {
21
+ Object.defineProperty(this, "authentication", {
22
+ enumerable: true,
23
+ configurable: true,
24
+ writable: true,
25
+ value: authentication
26
+ });
27
+ Object.defineProperty(this, "request", {
28
+ enumerable: true,
29
+ configurable: true,
30
+ writable: true,
31
+ value: async ({ keys, nonce, signIn = true, maxTimeToLive, targets, ...clientOptions }) => {
32
+ // Nothing may be awaited before `requestAttributes` / `signIn` are invoked:
33
+ // the ICRC-29 transport only opens the identity provider window while the
34
+ // browser still considers us inside the user gesture. `getPreparedClient`
35
+ // is synchronous whenever `prepareClient()` has run.
36
+ const preparedClient = this.authentication.getPreparedClient(clientOptions);
37
+ const authClient = preparedClient ?? (await this.authentication.ensureClient(clientOptions));
38
+ if (!authClient) {
39
+ throw new Error("Authentication module is missing or failed to initialize. To request identity attributes, please install @icp-sdk/auth v7 or later, or provide a compatible authClient.");
40
+ }
41
+ this.authentication.setAuthenticating();
42
+ try {
43
+ // `signIn` first: it opens the transport channel synchronously, and the
44
+ // attribute request then reuses that same channel and window.
45
+ const identityPromise = signIn
46
+ ? this.authentication.signInOrRecoverIdentity({
47
+ maxTimeToLive,
48
+ targets,
49
+ })
50
+ : Promise.resolve(authClient.getIdentity());
51
+ const requestPromise = authClient.requestAttributes({
52
+ keys,
53
+ nonce: toAuthClientNonce(authClient, nonce),
54
+ });
55
+ const [signedAttributes, identity] = await Promise.all([
56
+ requestPromise,
57
+ identityPromise,
58
+ ]);
59
+ const finalIdentity = identity ?? (await authClient.getIdentity());
60
+ const isAuthenticated = await authClient.isAuthenticated();
61
+ await this.authentication.commitIdentity(finalIdentity, isAuthenticated);
62
+ const normalizedSignedAttributes = normalizeSignedIdentityAttributes(signedAttributes);
63
+ return {
64
+ principal: finalIdentity.getPrincipal().toText(),
65
+ requestedKeys: keys,
66
+ signedAttributes: normalizedSignedAttributes,
67
+ decodedAttributes: decodeIdentityAttributeValues(normalizedSignedAttributes.data, keys),
68
+ completedAt: new Date().toISOString(),
69
+ };
70
+ }
71
+ catch (error) {
72
+ this.authentication.setAuthenticationError(error);
73
+ throw error;
74
+ }
75
+ }
76
+ });
77
+ Object.defineProperty(this, "requestOpenId", {
78
+ enumerable: true,
79
+ configurable: true,
80
+ writable: true,
81
+ value: ({ keys, openIdProvider, ...rest }) => {
82
+ // Called (not awaited) synchronously so the user gesture is preserved.
83
+ return this.request({
84
+ ...rest,
85
+ openIdProvider,
86
+ keys: identityAttributeKeys({ openIdProvider, keys }),
87
+ });
88
+ }
89
+ });
90
+ }
91
+ }
92
+ /**
93
+ * Bridges the two `@icp-sdk/auth` nonce contracts.
94
+ *
95
+ * v8 takes `() => Promise<Uint8Array>` (it journals the value so a redirect
96
+ * flow replays the same bytes); v7 takes `Uint8Array | Promise<Uint8Array>`.
97
+ * Both open the transport channel synchronously for the deferred forms, so we
98
+ * always hand over the deferred shape the installed client understands.
99
+ * `memoize` only exists from v8 onwards, which makes it a reliable marker.
100
+ */
101
+ function toAuthClientNonce(authClient, nonce) {
102
+ const supportsNonceThunk = typeof authClient.memoize === "function";
103
+ if (supportsNonceThunk) {
104
+ return () => Promise.resolve(typeof nonce === "function" ? nonce() : nonce);
105
+ }
106
+ return Promise.resolve(typeof nonce === "function" ? nonce() : nonce);
107
+ }
108
+ //# sourceMappingURL=identity-attributes-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-attributes-manager.js","sourceRoot":"","sources":["../../src/auth/identity-attributes-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { IdentityAttributeOpenIdProvider, IdentityAttributeValues, SignedIdentityAttributes } from "./types.js";
2
+ export declare const IDENTITY_ATTRIBUTES_PROVIDER = "https://id.ai/authorize";
3
+ /**
4
+ * @deprecated Use the default ClientManager identity provider or
5
+ * `IDENTITY_ATTRIBUTES_PROVIDER` instead.
6
+ */
7
+ export declare const IDENTITY_ATTRIBUTES_BETA_PROVIDER = "https://id.ai/authorize";
8
+ export declare function identityAttributeKeys({ openIdProvider, keys, }: {
9
+ openIdProvider: IdentityAttributeOpenIdProvider;
10
+ keys: string[];
11
+ }): string[];
12
+ export declare function normalizeOpenIdProvider(openIdProvider: IdentityAttributeOpenIdProvider): string;
13
+ export declare function resolveIdentityAttributeKeys({ openIdProvider, keys, }: {
14
+ openIdProvider: IdentityAttributeOpenIdProvider;
15
+ keys: string[];
16
+ }): Promise<string[]>;
17
+ export declare function decodeIdentityAttributeValues(data: Uint8Array, requestedKeys: string[]): IdentityAttributeValues;
18
+ export declare function normalizeSignedIdentityAttributes(attributes: SignedIdentityAttributes): SignedIdentityAttributes;
19
+ //# sourceMappingURL=identity-attributes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-attributes.d.ts","sourceRoot":"","sources":["../../src/auth/identity-attributes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,+BAA+B,EAC/B,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,YAAY,CAAA;AAGnB,eAAO,MAAM,4BAA4B,4BAAgC,CAAA;AAEzE;;;GAGG;AACH,eAAO,MAAM,iCAAiC,4BAA+B,CAAA;AAQ7E,wBAAgB,qBAAqB,CAAC,EACpC,cAAc,EACd,IAAI,GACL,EAAE;IACD,cAAc,EAAE,+BAA+B,CAAA;IAC/C,IAAI,EAAE,MAAM,EAAE,CAAA;CACf,GAAG,MAAM,EAAE,CAGX;AAED,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,+BAA+B,GAC9C,MAAM,CAMR;AAED,wBAAsB,4BAA4B,CAAC,EACjD,cAAc,EACd,IAAI,GACL,EAAE;IACD,cAAc,EAAE,+BAA+B,CAAA;IAC/C,IAAI,EAAE,MAAM,EAAE,CAAA;CACf,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEpB;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,UAAU,EAChB,aAAa,EAAE,MAAM,EAAE,GACtB,uBAAuB,CAgBzB;AA6LD,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,wBAAwB,GACnC,wBAAwB,CAK1B"}
@@ -0,0 +1,170 @@
1
+ import { IDL } from "@icp-sdk/core/candid";
2
+ import { IC_INTERNET_IDENTITY_PROVIDER } from "./constants.js";
3
+ export const IDENTITY_ATTRIBUTES_PROVIDER = IC_INTERNET_IDENTITY_PROVIDER;
4
+ /**
5
+ * @deprecated Use the default ClientManager identity provider or
6
+ * `IDENTITY_ATTRIBUTES_PROVIDER` instead.
7
+ */
8
+ export const IDENTITY_ATTRIBUTES_BETA_PROVIDER = IDENTITY_ATTRIBUTES_PROVIDER;
9
+ const OPEN_ID_PROVIDER_URLS = {
10
+ apple: "https://appleid.apple.com",
11
+ google: "https://accounts.google.com",
12
+ microsoft: "https://login.microsoftonline.com/{tid}/v2.0",
13
+ };
14
+ export function identityAttributeKeys({ openIdProvider, keys, }) {
15
+ const provider = normalizeOpenIdProvider(openIdProvider);
16
+ return keys.map((key) => `openid:${provider}:${key}`);
17
+ }
18
+ export function normalizeOpenIdProvider(openIdProvider) {
19
+ return (OPEN_ID_PROVIDER_URLS[openIdProvider] ?? openIdProvider);
20
+ }
21
+ export async function resolveIdentityAttributeKeys({ openIdProvider, keys, }) {
22
+ return identityAttributeKeys({ openIdProvider, keys });
23
+ }
24
+ export function decodeIdentityAttributeValues(data, requestedKeys) {
25
+ const requestedKeyMap = requestedKeys.reduce((acc, key) => {
26
+ acc[key] = identityAttributeDisplayKey(key);
27
+ acc[identityAttributeDisplayKey(key)] = identityAttributeDisplayKey(key);
28
+ return acc;
29
+ }, {});
30
+ const decodedValues = decodeCandidAttributeValues(data, requestedKeyMap);
31
+ if (Object.keys(decodedValues).length > 0) {
32
+ return decodedValues;
33
+ }
34
+ return extractPrintableAttributeValues(data, requestedKeys);
35
+ }
36
+ function decodeCandidAttributeValues(data, requestedKeyMap) {
37
+ const textPairs = IDL.Vec(IDL.Tuple(IDL.Text, IDL.Text));
38
+ const recordPairs = IDL.Vec(IDL.Record({
39
+ key: IDL.Text,
40
+ value: IDL.Text,
41
+ }));
42
+ const candidates = [
43
+ [textPairs],
44
+ [recordPairs],
45
+ [IDL.Record({ attributes: textPairs })],
46
+ [IDL.Record({ values: textPairs })],
47
+ [IDL.Record({ attributes: recordPairs })],
48
+ [IDL.Record({ values: recordPairs })],
49
+ ];
50
+ for (const candidate of candidates) {
51
+ try {
52
+ const decoded = IDL.decode(candidate, data);
53
+ const values = collectDecodedAttributeValues(decoded, requestedKeyMap);
54
+ if (Object.keys(values).length > 0) {
55
+ return values;
56
+ }
57
+ }
58
+ catch {
59
+ // Try the next known beta payload shape, then fall back to text extraction.
60
+ }
61
+ }
62
+ return {};
63
+ }
64
+ function collectDecodedAttributeValues(value, requestedKeyMap, activeKey) {
65
+ const values = {};
66
+ if (typeof value === "string") {
67
+ const displayKey = requestedKeyMap[value];
68
+ if (displayKey) {
69
+ return values;
70
+ }
71
+ if (activeKey && isPrintableTextValue(value)) {
72
+ values[activeKey] = value;
73
+ }
74
+ return values;
75
+ }
76
+ if (Array.isArray(value)) {
77
+ if (value.length === 2 && typeof value[0] === "string") {
78
+ const displayKey = requestedKeyMap[value[0]];
79
+ if (displayKey &&
80
+ typeof value[1] === "string" &&
81
+ isPrintableTextValue(value[1])) {
82
+ values[displayKey] = value[1];
83
+ return values;
84
+ }
85
+ }
86
+ for (const item of value) {
87
+ Object.assign(values, collectDecodedAttributeValues(item, requestedKeyMap, activeKey));
88
+ }
89
+ return values;
90
+ }
91
+ if (value && typeof value === "object") {
92
+ const record = value;
93
+ if (typeof record.key === "string" && typeof record.value === "string") {
94
+ const displayKey = requestedKeyMap[record.key];
95
+ if (displayKey && isPrintableTextValue(record.value)) {
96
+ values[displayKey] = record.value;
97
+ return values;
98
+ }
99
+ }
100
+ for (const [key, nested] of Object.entries(record)) {
101
+ const displayKey = requestedKeyMap[key] ?? activeKey;
102
+ if (displayKey &&
103
+ typeof nested === "string" &&
104
+ isPrintableTextValue(nested)) {
105
+ values[displayKey] = nested;
106
+ continue;
107
+ }
108
+ Object.assign(values, collectDecodedAttributeValues(nested, requestedKeyMap, displayKey));
109
+ }
110
+ }
111
+ return values;
112
+ }
113
+ function extractPrintableAttributeValues(data, requestedKeys) {
114
+ const text = new TextDecoder().decode(data);
115
+ const values = {};
116
+ for (const requestedKey of requestedKeys) {
117
+ const start = text.indexOf(requestedKey);
118
+ if (start === -1) {
119
+ continue;
120
+ }
121
+ const tail = text.slice(start + requestedKey.length);
122
+ const printableRuns = tail.match(/[\x20-\x7E]{2,512}/g) ?? [];
123
+ const value = printableRuns
124
+ .map((candidate) => cleanPrintableAttributeValue(candidate, requestedKeys))
125
+ .find((candidate) => isPrintableTextValue(candidate) &&
126
+ candidate !== requestedKey &&
127
+ !candidate.startsWith("openid:"));
128
+ if (value) {
129
+ values[identityAttributeDisplayKey(requestedKey)] = value.trim();
130
+ }
131
+ }
132
+ return values;
133
+ }
134
+ function cleanPrintableAttributeValue(value, requestedKeys) {
135
+ let cleaned = value;
136
+ for (const requestedKey of requestedKeys) {
137
+ const nextKeyIndex = cleaned.indexOf(requestedKey);
138
+ if (nextKeyIndex > 0) {
139
+ cleaned = cleaned.slice(0, trimCandidTextLengthPrefix(cleaned, nextKeyIndex));
140
+ }
141
+ }
142
+ const nextOpenIdKeyIndex = cleaned.indexOf("openid:");
143
+ if (nextOpenIdKeyIndex > 0) {
144
+ cleaned = cleaned.slice(0, trimCandidTextLengthPrefix(cleaned, nextOpenIdKeyIndex));
145
+ }
146
+ return cleaned.trim();
147
+ }
148
+ function trimCandidTextLengthPrefix(value, index) {
149
+ let trimmedIndex = index;
150
+ while (trimmedIndex > 0 && isAsciiDigit(value.charCodeAt(trimmedIndex - 1))) {
151
+ trimmedIndex -= 1;
152
+ }
153
+ return trimmedIndex;
154
+ }
155
+ function isAsciiDigit(charCode) {
156
+ return charCode >= 48 && charCode <= 57;
157
+ }
158
+ function identityAttributeDisplayKey(key) {
159
+ return key.split(":").pop() || key;
160
+ }
161
+ function isPrintableTextValue(value) {
162
+ return value.length > 0 && value.length <= 512 && /^[\x20-\x7E]+$/.test(value);
163
+ }
164
+ export function normalizeSignedIdentityAttributes(attributes) {
165
+ return {
166
+ data: new Uint8Array(attributes.data),
167
+ signature: new Uint8Array(attributes.signature),
168
+ };
169
+ }
170
+ //# sourceMappingURL=identity-attributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-attributes.js","sourceRoot":"","sources":["../../src/auth/identity-attributes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from "./authentication-manager.js";
2
+ export * from "./identity-attributes-manager.js";
3
+ export * from "./identity-attributes.js";
4
+ export * from "./constants.js";
5
+ export * from "./types.js";
6
+ export * from "../hooks/createAuthHooks.js";
7
+ export * from "./createIdentityAttributeHooks.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAA;AAC3C,cAAc,kCAAkC,CAAA;AAChD,cAAc,0BAA0B,CAAA;AACxC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,6BAA6B,CAAA;AAC3C,cAAc,mCAAmC,CAAA"}
@@ -0,0 +1,8 @@
1
+ export * from "./authentication-manager.js";
2
+ export * from "./identity-attributes-manager.js";
3
+ export * from "./identity-attributes.js";
4
+ export * from "./constants.js";
5
+ export * from "./types.js";
6
+ export * from "../hooks/createAuthHooks.js";
7
+ export * from "./createIdentityAttributeHooks.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAA;AAC3C,cAAc,kCAAkC,CAAA;AAChD,cAAc,0BAA0B,CAAA;AACxC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,6BAA6B,CAAA;AAC3C,cAAc,mCAAmC,CAAA"}
@@ -0,0 +1,182 @@
1
+ import type { Identity, SignIdentity } from "@icp-sdk/core/agent";
2
+ import type { PartialIdentity } from "@icp-sdk/core/identity";
3
+ import type { Principal } from "@icp-sdk/core/principal";
4
+ export interface SignedIdentityAttributes {
5
+ data: Uint8Array;
6
+ signature: Uint8Array;
7
+ }
8
+ /**
9
+ * The 32-byte nonce issued by the relying-party canister.
10
+ *
11
+ * A function (or promise) lets the Internet Identity window open while the
12
+ * nonce is still being fetched, so the popup is opened inside the user gesture
13
+ * instead of after it. `@icp-sdk/auth` v8 requires the function form; v7
14
+ * accepts the promise form. IC Reactor normalizes whichever you pass to the
15
+ * shape the installed client expects.
16
+ */
17
+ export type IdentityAttributeNonce = Uint8Array | Promise<Uint8Array> | (() => Uint8Array | Promise<Uint8Array>);
18
+ export interface IdentityAttributeRequest {
19
+ keys: string[];
20
+ nonce: IdentityAttributeNonce;
21
+ }
22
+ export interface IdentityAttributeValues {
23
+ email?: string;
24
+ name?: string;
25
+ verified_email?: string;
26
+ [key: string]: string | undefined;
27
+ }
28
+ export interface IdentityAttributeResult {
29
+ principal: string;
30
+ requestedKeys: string[];
31
+ signedAttributes: SignedIdentityAttributes;
32
+ decodedAttributes: IdentityAttributeValues;
33
+ completedAt: string;
34
+ }
35
+ /**
36
+ * The providers that Internet Identity supports for one-click sign-in. Only
37
+ * these three reach the underlying auth client.
38
+ */
39
+ type IdentityAttributeOpenIdProviderAlias = "google" | "apple" | "microsoft";
40
+ /**
41
+ * An OpenID provider, either as a well-known alias or as a raw issuer URL.
42
+ *
43
+ * The two forms are **not** interchangeable, and what each one does depends on
44
+ * where it is passed:
45
+ *
46
+ * - An alias (`"google" | "apple" | "microsoft"`) is forwarded to the auth
47
+ * client, which adds an `openid` search param to the identity provider URL so
48
+ * the user signs in through that provider directly.
49
+ * - Any other string is treated as a raw issuer URL and is **never** forwarded
50
+ * to the auth client, so it never affects how the user signs in. It is only
51
+ * meaningful when passed to {@link IdentityAttributesManager.requestOpenId}
52
+ * (or `identityAttributeKeys`), which scopes the requested keys to
53
+ * `openid:<issuer>:<key>`. Passed anywhere else it has no effect at all.
54
+ */
55
+ export type IdentityAttributeOpenIdProvider = IdentityAttributeOpenIdProviderAlias | (string & {});
56
+ /** Session key algorithm used for each sign-in. */
57
+ export type AuthClientKeyType = "ECDSA" | "Ed25519";
58
+ /** Structural shape of an `@icp-sdk/auth` `AuthClientStorage`. */
59
+ export interface AuthClientStorageLike {
60
+ get(key: string): Promise<string | CryptoKeyPair | null>;
61
+ set(key: string, value: string | CryptoKeyPair): Promise<void>;
62
+ remove(key: string): Promise<void>;
63
+ }
64
+ /** Idle-session configuration forwarded to the underlying AuthClient. */
65
+ export interface AuthClientIdleOptions {
66
+ /** Called once the user has been idle for `idleTimeout` ms. */
67
+ onIdle?: () => unknown;
68
+ /** Idle timeout in ms. @default 600_000 (10 minutes) */
69
+ idleTimeout?: number;
70
+ /** Treat scroll events as activity. @default false */
71
+ captureScroll?: boolean;
72
+ /** Scroll debounce in ms. @default 100 */
73
+ scrollDebounce?: number;
74
+ /** Disable idle detection entirely. @default false */
75
+ disableIdle?: boolean;
76
+ /**
77
+ * Disable the built-in idle callback, which signs the user out and reloads
78
+ * the page. @default false
79
+ */
80
+ disableDefaultIdleCallback?: boolean;
81
+ }
82
+ export interface AuthenticationClientOptions {
83
+ /** Identity provider URL. @default "https://id.ai/authorize" */
84
+ identityProvider?: string | URL;
85
+ /** `window.open` features string for the identity provider popup. */
86
+ windowOpenerFeatures?: string;
87
+ /**
88
+ * Provider for one-click sign-in.
89
+ *
90
+ * Only the `"google" | "apple" | "microsoft"` aliases reach the auth client.
91
+ * Any other value is dropped here and has **no effect** — raw issuer URLs are
92
+ * only meaningful on `requestOpenId`, where they scope the requested keys.
93
+ * @see {@link IdentityAttributeOpenIdProvider}
94
+ */
95
+ openIdProvider?: IdentityAttributeOpenIdProvider;
96
+ /**
97
+ * Derivation origin for the identity provider.
98
+ *
99
+ * Required when the app is served from more than one origin (e.g. a custom
100
+ * domain plus `<canisterId>.icp0.io`) and every origin must resolve to the
101
+ * same principal.
102
+ * @see https://github.com/dfinity/internet-identity/blob/main/docs/internet-identity-spec.adoc
103
+ */
104
+ derivationOrigin?: string | URL;
105
+ /** Persistent storage backend. @default IndexedDB */
106
+ storage?: AuthClientStorageLike;
107
+ /**
108
+ * Session key algorithm. Use `"Ed25519"` when the storage backend cannot
109
+ * hold a `CryptoKey`. @default "ECDSA"
110
+ */
111
+ keyType?: AuthClientKeyType;
112
+ /**
113
+ * Idle timeout configuration. Pass `{ disableIdle: true }` to opt out of the
114
+ * default behaviour, which signs the user out and reloads after 10 minutes.
115
+ */
116
+ idleOptions?: AuthClientIdleOptions;
117
+ /** An existing identity to authenticate via delegation. */
118
+ identity?: SignIdentity | PartialIdentity;
119
+ /**
120
+ * How the client talks to the identity provider. `"redirect"` requires
121
+ * `@icp-sdk/auth` v8 or later and is ignored by older versions.
122
+ * @default "window"
123
+ */
124
+ transport?: "window" | "redirect";
125
+ }
126
+ export interface AuthClientSignInOptions {
127
+ maxTimeToLive?: bigint;
128
+ targets?: Principal[];
129
+ }
130
+ export interface AuthenticationSignInOptions extends AuthClientSignInOptions, AuthenticationClientOptions {
131
+ onSuccess?: () => void | Promise<void>;
132
+ onError?: (error?: string) => void | Promise<void>;
133
+ }
134
+ export interface RequestIdentityAttributesParameters extends AuthenticationClientOptions {
135
+ keys: string[];
136
+ nonce: IdentityAttributeNonce;
137
+ /**
138
+ * Sign in as part of the same identity-provider interaction.
139
+ * @default true
140
+ */
141
+ signIn?: boolean;
142
+ maxTimeToLive?: bigint;
143
+ targets?: Principal[];
144
+ }
145
+ export interface RequestOpenIdIdentityAttributesParameters extends Omit<RequestIdentityAttributesParameters, "openIdProvider"> {
146
+ /**
147
+ * Provider the requested `keys` are scoped to, producing
148
+ * `openid:<issuer>:<key>`.
149
+ *
150
+ * Passing one of the `"google" | "apple" | "microsoft"` aliases additionally
151
+ * routes sign-in through that provider, so the user grants attribute access
152
+ * in the same step. A raw issuer URL only scopes the keys.
153
+ * @see {@link IdentityAttributeOpenIdProvider}
154
+ */
155
+ openIdProvider: IdentityAttributeOpenIdProvider;
156
+ }
157
+ /**
158
+ * Structural subset of `@icp-sdk/auth`'s `AuthClient` that IC Reactor relies
159
+ * on. Declared locally so `@icp-sdk/auth` stays an optional peer dependency.
160
+ */
161
+ export interface AuthClientLike {
162
+ getIdentity(): Promise<Identity> | Identity;
163
+ isAuthenticated(): Promise<boolean> | boolean;
164
+ signIn(options?: AuthClientSignInOptions): Promise<Identity>;
165
+ signOut(options?: {
166
+ returnTo?: string;
167
+ }): Promise<void>;
168
+ requestAttributes(params: {
169
+ keys: string[];
170
+ nonce: Uint8Array | Promise<Uint8Array> | (() => Promise<Uint8Array>);
171
+ }): Promise<SignedIdentityAttributes>;
172
+ /** Present from `@icp-sdk/auth` v8; used to detect the nonce contract. */
173
+ memoize?<T>(produce: () => T | Promise<T>): Promise<T>;
174
+ }
175
+ export interface AuthState {
176
+ identity: Identity | null;
177
+ isAuthenticating: boolean;
178
+ isAuthenticated: boolean;
179
+ error: Error | undefined;
180
+ }
181
+ export {};
182
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":""}