@ic-reactor/core 3.5.1 → 3.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 (75) hide show
  1. package/README.md +6 -11
  2. package/dist/client.d.ts +17 -79
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +49 -527
  5. package/dist/client.js.map +1 -1
  6. package/dist/display/visitor.d.ts.map +1 -1
  7. package/dist/display/visitor.js +6 -1
  8. package/dist/display/visitor.js.map +1 -1
  9. package/dist/display-reactor.d.ts +3 -0
  10. package/dist/display-reactor.d.ts.map +1 -1
  11. package/dist/display-reactor.js +3 -0
  12. package/dist/display-reactor.js.map +1 -1
  13. package/dist/index.d.ts +0 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +0 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/reactor.d.ts +4 -4
  18. package/dist/reactor.d.ts.map +1 -1
  19. package/dist/reactor.js +27 -10
  20. package/dist/reactor.js.map +1 -1
  21. package/dist/types/client.d.ts +1 -120
  22. package/dist/types/client.d.ts.map +1 -1
  23. package/dist/types/display-reactor.d.ts.map +1 -1
  24. package/dist/types/reactor.d.ts +8 -0
  25. package/dist/types/reactor.d.ts.map +1 -1
  26. package/dist/types/variant.d.ts.map +1 -1
  27. package/dist/utils/agent.d.ts +3 -2
  28. package/dist/utils/agent.d.ts.map +1 -1
  29. package/dist/utils/agent.js +9 -3
  30. package/dist/utils/agent.js.map +1 -1
  31. package/dist/utils/constants.d.ts +0 -2
  32. package/dist/utils/constants.d.ts.map +1 -1
  33. package/dist/utils/constants.js +0 -2
  34. package/dist/utils/constants.js.map +1 -1
  35. package/dist/utils/helper.d.ts +14 -1
  36. package/dist/utils/helper.d.ts.map +1 -1
  37. package/dist/utils/helper.js +48 -9
  38. package/dist/utils/helper.js.map +1 -1
  39. package/dist/utils/index.d.ts +1 -0
  40. package/dist/utils/index.d.ts.map +1 -1
  41. package/dist/utils/index.js +1 -0
  42. package/dist/utils/index.js.map +1 -1
  43. package/dist/utils/polling.d.ts.map +1 -1
  44. package/dist/utils/polling.js +2 -2
  45. package/dist/utils/polling.js.map +1 -1
  46. package/dist/utils/query-data.d.ts +4 -0
  47. package/dist/utils/query-data.d.ts.map +1 -0
  48. package/dist/utils/query-data.js +3 -0
  49. package/dist/utils/query-data.js.map +1 -0
  50. package/dist/version.d.ts.map +1 -1
  51. package/dist/version.js +2 -2
  52. package/dist/version.js.map +1 -1
  53. package/llms.txt +43 -0
  54. package/package.json +16 -18
  55. package/src/client.ts +53 -627
  56. package/src/display/visitor.ts +10 -1
  57. package/src/display-reactor.ts +3 -0
  58. package/src/index.ts +0 -1
  59. package/src/reactor.ts +48 -18
  60. package/src/types/client.ts +1 -138
  61. package/src/types/display-reactor.ts +1 -2
  62. package/src/types/reactor.ts +15 -0
  63. package/src/types/variant.ts +8 -6
  64. package/src/utils/agent.ts +12 -3
  65. package/src/utils/constants.ts +0 -5
  66. package/src/utils/helper.ts +52 -7
  67. package/src/utils/index.ts +1 -0
  68. package/src/utils/polling.ts +3 -3
  69. package/src/utils/query-data.ts +5 -0
  70. package/src/version.ts +2 -2
  71. package/dist/identity-attributes.d.ts +0 -14
  72. package/dist/identity-attributes.d.ts.map +0 -1
  73. package/dist/identity-attributes.js +0 -161
  74. package/dist/identity-attributes.js.map +0 -1
  75. package/src/identity-attributes.ts +0 -256
@@ -1,161 +0,0 @@
1
- import { IDL } from "@icp-sdk/core/candid";
2
- export const IDENTITY_ATTRIBUTES_BETA_PROVIDER = "https://beta.id.ai/authorize";
3
- const OPEN_ID_PROVIDER_URLS = {
4
- apple: "https://appleid.apple.com",
5
- google: "https://accounts.google.com",
6
- microsoft: "https://login.microsoftonline.com/{tid}/v2.0",
7
- };
8
- export function identityAttributeKeys({ openIdProvider, keys, }) {
9
- const provider = normalizeOpenIdProvider(openIdProvider);
10
- return keys.map((key) => `openid:${provider}:${key}`);
11
- }
12
- export function normalizeOpenIdProvider(openIdProvider) {
13
- return (OPEN_ID_PROVIDER_URLS[openIdProvider] ?? openIdProvider);
14
- }
15
- export async function resolveIdentityAttributeKeys({ openIdProvider, keys, }) {
16
- return identityAttributeKeys({ openIdProvider, keys });
17
- }
18
- export function decodeIdentityAttributeValues(data, requestedKeys) {
19
- const requestedKeyMap = requestedKeys.reduce((acc, key) => {
20
- acc[key] = identityAttributeDisplayKey(key);
21
- acc[identityAttributeDisplayKey(key)] = identityAttributeDisplayKey(key);
22
- return acc;
23
- }, {});
24
- const decodedValues = decodeCandidAttributeValues(data, requestedKeyMap);
25
- if (Object.keys(decodedValues).length > 0) {
26
- return decodedValues;
27
- }
28
- return extractPrintableAttributeValues(data, requestedKeys);
29
- }
30
- function decodeCandidAttributeValues(data, requestedKeyMap) {
31
- const textPairs = IDL.Vec(IDL.Tuple(IDL.Text, IDL.Text));
32
- const recordPairs = IDL.Vec(IDL.Record({
33
- key: IDL.Text,
34
- value: IDL.Text,
35
- }));
36
- const candidates = [
37
- [textPairs],
38
- [recordPairs],
39
- [IDL.Record({ attributes: textPairs })],
40
- [IDL.Record({ values: textPairs })],
41
- [IDL.Record({ attributes: recordPairs })],
42
- [IDL.Record({ values: recordPairs })],
43
- ];
44
- for (const candidate of candidates) {
45
- try {
46
- const decoded = IDL.decode(candidate, data);
47
- const values = collectDecodedAttributeValues(decoded, requestedKeyMap);
48
- if (Object.keys(values).length > 0) {
49
- return values;
50
- }
51
- }
52
- catch {
53
- // Try the next known beta payload shape, then fall back to text extraction.
54
- }
55
- }
56
- return {};
57
- }
58
- function collectDecodedAttributeValues(value, requestedKeyMap, activeKey) {
59
- const values = {};
60
- if (typeof value === "string") {
61
- const displayKey = requestedKeyMap[value];
62
- if (displayKey) {
63
- return values;
64
- }
65
- if (activeKey && isPrintableTextValue(value)) {
66
- values[activeKey] = value;
67
- }
68
- return values;
69
- }
70
- if (Array.isArray(value)) {
71
- if (value.length === 2 && typeof value[0] === "string") {
72
- const displayKey = requestedKeyMap[value[0]];
73
- if (displayKey &&
74
- typeof value[1] === "string" &&
75
- isPrintableTextValue(value[1])) {
76
- values[displayKey] = value[1];
77
- return values;
78
- }
79
- }
80
- for (const item of value) {
81
- Object.assign(values, collectDecodedAttributeValues(item, requestedKeyMap, activeKey));
82
- }
83
- return values;
84
- }
85
- if (value && typeof value === "object") {
86
- const record = value;
87
- if (typeof record.key === "string" && typeof record.value === "string") {
88
- const displayKey = requestedKeyMap[record.key];
89
- if (displayKey && isPrintableTextValue(record.value)) {
90
- values[displayKey] = record.value;
91
- return values;
92
- }
93
- }
94
- for (const [key, nested] of Object.entries(record)) {
95
- const displayKey = requestedKeyMap[key] ?? activeKey;
96
- if (displayKey &&
97
- typeof nested === "string" &&
98
- isPrintableTextValue(nested)) {
99
- values[displayKey] = nested;
100
- continue;
101
- }
102
- Object.assign(values, collectDecodedAttributeValues(nested, requestedKeyMap, displayKey));
103
- }
104
- }
105
- return values;
106
- }
107
- function extractPrintableAttributeValues(data, requestedKeys) {
108
- const text = new TextDecoder().decode(data);
109
- const values = {};
110
- for (const requestedKey of requestedKeys) {
111
- const start = text.indexOf(requestedKey);
112
- if (start === -1) {
113
- continue;
114
- }
115
- const tail = text.slice(start + requestedKey.length);
116
- const printableRuns = tail.match(/[\x20-\x7E]{2,512}/g) ?? [];
117
- const value = printableRuns
118
- .map((candidate) => cleanPrintableAttributeValue(candidate, requestedKeys))
119
- .find((candidate) => isPrintableTextValue(candidate) &&
120
- candidate !== requestedKey &&
121
- !candidate.startsWith("openid:"));
122
- if (value) {
123
- values[identityAttributeDisplayKey(requestedKey)] = value.trim();
124
- }
125
- }
126
- return values;
127
- }
128
- function cleanPrintableAttributeValue(value, requestedKeys) {
129
- let cleaned = value;
130
- for (const requestedKey of requestedKeys) {
131
- const nextKeyIndex = cleaned.indexOf(requestedKey);
132
- if (nextKeyIndex > 0) {
133
- cleaned = cleaned.slice(0, trimCandidTextLengthPrefix(cleaned, nextKeyIndex));
134
- }
135
- }
136
- const nextOpenIdKeyMatch = /\d*openid:/.exec(cleaned);
137
- if (nextOpenIdKeyMatch?.index && nextOpenIdKeyMatch.index > 0) {
138
- cleaned = cleaned.slice(0, nextOpenIdKeyMatch.index);
139
- }
140
- return cleaned.trim();
141
- }
142
- function trimCandidTextLengthPrefix(value, index) {
143
- let trimmedIndex = index;
144
- while (trimmedIndex > 0 && /\d/.test(value[trimmedIndex - 1])) {
145
- trimmedIndex -= 1;
146
- }
147
- return trimmedIndex;
148
- }
149
- function identityAttributeDisplayKey(key) {
150
- return key.split(":").pop() || key;
151
- }
152
- function isPrintableTextValue(value) {
153
- return value.length > 0 && value.length <= 512 && /^[\x20-\x7E]+$/.test(value);
154
- }
155
- export function normalizeSignedIdentityAttributes(attributes) {
156
- return {
157
- data: new Uint8Array(attributes.data),
158
- signature: new Uint8Array(attributes.signature),
159
- };
160
- }
161
- //# sourceMappingURL=identity-attributes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"identity-attributes.js","sourceRoot":"","sources":["../src/identity-attributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAQ1C,MAAM,CAAC,MAAM,iCAAiC,GAAG,8BAA8B,CAAA;AAE/E,MAAM,qBAAqB,GAAG;IAC5B,KAAK,EAAE,2BAA2B;IAClC,MAAM,EAAE,6BAA6B;IACrC,SAAS,EAAE,8CAA8C;CACjD,CAAA;AAEV,MAAM,UAAU,qBAAqB,CAAC,EACpC,cAAc,EACd,IAAI,GAIL;IACC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAA;IACxD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,QAAQ,IAAI,GAAG,EAAE,CAAC,CAAA;AACvD,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,cAA+C;IAE/C,OAAO,CACL,qBAAqB,CACnB,cAAoD,CACrD,IAAI,cAAc,CACpB,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,EACjD,cAAc,EACd,IAAI,GAIL;IACC,OAAO,qBAAqB,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,IAAgB,EAChB,aAAuB;IAEvB,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,CAC1C,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACX,GAAG,CAAC,GAAG,CAAC,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAA;QAC3C,GAAG,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAA;QACxE,OAAO,GAAG,CAAA;IACZ,CAAC,EACD,EAAE,CACH,CAAA;IAED,MAAM,aAAa,GAAG,2BAA2B,CAAC,IAAI,EAAE,eAAe,CAAC,CAAA;IACxE,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,aAAa,CAAA;IACtB,CAAC;IAED,OAAO,+BAA+B,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;AAC7D,CAAC;AAED,SAAS,2BAA2B,CAClC,IAAgB,EAChB,eAAuC;IAEvC,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IACxD,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CACzB,GAAG,CAAC,MAAM,CAAC;QACT,GAAG,EAAE,GAAG,CAAC,IAAI;QACb,KAAK,EAAE,GAAG,CAAC,IAAI;KAChB,CAAC,CACH,CAAA;IAED,MAAM,UAAU,GAAG;QACjB,CAAC,SAAS,CAAC;QACX,CAAC,WAAW,CAAC;QACb,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;QACvC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACnC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACzC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;KACtC,CAAA;IAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YAC3C,MAAM,MAAM,GAAG,6BAA6B,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;YACtE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,OAAO,MAAM,CAAA;YACf,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,4EAA4E;QAC9E,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAA;AACX,CAAC;AAED,SAAS,6BAA6B,CACpC,KAAc,EACd,eAAuC,EACvC,SAAkB;IAElB,MAAM,MAAM,GAA4B,EAAE,CAAA;IAE1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;QACzC,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,MAAM,CAAA;QACf,CAAC;QACD,IAAI,SAAS,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAA;QAC3B,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC5C,IACE,UAAU;gBACV,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAC5B,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAC9B,CAAC;gBACD,MAAM,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;gBAC7B,OAAO,MAAM,CAAA;YACf,CAAC;QACH,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,MAAM,CACX,MAAM,EACN,6BAA6B,CAAC,IAAI,EAAE,eAAe,EAAE,SAAS,CAAC,CAChE,CAAA;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,KAAgC,CAAA;QAC/C,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvE,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC9C,IAAI,UAAU,IAAI,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrD,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,KAAK,CAAA;gBACjC,OAAO,MAAM,CAAA;YACf,CAAC;QACH,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,SAAS,CAAA;YACpD,IACE,UAAU;gBACV,OAAO,MAAM,KAAK,QAAQ;gBAC1B,oBAAoB,CAAC,MAAM,CAAC,EAC5B,CAAC;gBACD,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAA;gBAC3B,SAAQ;YACV,CAAC;YACD,MAAM,CAAC,MAAM,CACX,MAAM,EACN,6BAA6B,CAAC,MAAM,EAAE,eAAe,EAAE,UAAU,CAAC,CACnE,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,+BAA+B,CACtC,IAAgB,EAChB,aAAuB;IAEvB,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC3C,MAAM,MAAM,GAA4B,EAAE,CAAA;IAE1C,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QACxC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,SAAQ;QACV,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;QACpD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAA;QAC7D,MAAM,KAAK,GAAG,aAAa;aACxB,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CACjB,4BAA4B,CAAC,SAAS,EAAE,aAAa,CAAC,CACvD;aACA,IAAI,CACH,CAAC,SAAS,EAAE,EAAE,CACZ,oBAAoB,CAAC,SAAS,CAAC;YAC/B,SAAS,KAAK,YAAY;YAC1B,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CACnC,CAAA;QAEH,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;QAClE,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,4BAA4B,CACnC,KAAa,EACb,aAAuB;IAEvB,IAAI,OAAO,GAAG,KAAK,CAAA;IAEnB,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QAClD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,GAAG,OAAO,CAAC,KAAK,CACrB,CAAC,EACD,0BAA0B,CAAC,OAAO,EAAE,YAAY,CAAC,CAClD,CAAA;QACH,CAAC;IACH,CAAC;IAED,MAAM,kBAAkB,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACrD,IAAI,kBAAkB,EAAE,KAAK,IAAI,kBAAkB,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9D,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAA;IACtD,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,EAAE,CAAA;AACvB,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAa,EAAE,KAAa;IAC9D,IAAI,YAAY,GAAG,KAAK,CAAA;IACxB,OAAO,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,YAAY,IAAI,CAAC,CAAA;IACnB,CAAC;IACD,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,SAAS,2BAA2B,CAAC,GAAW;IAC9C,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAA;AACpC,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAChF,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,UAAoC;IAEpC,OAAO;QACL,IAAI,EAAE,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;QACrC,SAAS,EAAE,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC;KAChD,CAAA;AACH,CAAC"}
@@ -1,256 +0,0 @@
1
- import { IDL } from "@icp-sdk/core/candid"
2
-
3
- import type {
4
- IdentityAttributeOpenIdProvider,
5
- IdentityAttributeValues,
6
- SignedIdentityAttributes,
7
- } from "./types/client"
8
-
9
- export const IDENTITY_ATTRIBUTES_BETA_PROVIDER = "https://beta.id.ai/authorize"
10
-
11
- const OPEN_ID_PROVIDER_URLS = {
12
- apple: "https://appleid.apple.com",
13
- google: "https://accounts.google.com",
14
- microsoft: "https://login.microsoftonline.com/{tid}/v2.0",
15
- } as const
16
-
17
- export function identityAttributeKeys({
18
- openIdProvider,
19
- keys,
20
- }: {
21
- openIdProvider: IdentityAttributeOpenIdProvider
22
- keys: string[]
23
- }): string[] {
24
- const provider = normalizeOpenIdProvider(openIdProvider)
25
- return keys.map((key) => `openid:${provider}:${key}`)
26
- }
27
-
28
- export function normalizeOpenIdProvider(
29
- openIdProvider: IdentityAttributeOpenIdProvider
30
- ): string {
31
- return (
32
- OPEN_ID_PROVIDER_URLS[
33
- openIdProvider as keyof typeof OPEN_ID_PROVIDER_URLS
34
- ] ?? openIdProvider
35
- )
36
- }
37
-
38
- export async function resolveIdentityAttributeKeys({
39
- openIdProvider,
40
- keys,
41
- }: {
42
- openIdProvider: IdentityAttributeOpenIdProvider
43
- keys: string[]
44
- }): Promise<string[]> {
45
- return identityAttributeKeys({ openIdProvider, keys })
46
- }
47
-
48
- export function decodeIdentityAttributeValues(
49
- data: Uint8Array,
50
- requestedKeys: string[]
51
- ): IdentityAttributeValues {
52
- const requestedKeyMap = requestedKeys.reduce<Record<string, string>>(
53
- (acc, key) => {
54
- acc[key] = identityAttributeDisplayKey(key)
55
- acc[identityAttributeDisplayKey(key)] = identityAttributeDisplayKey(key)
56
- return acc
57
- },
58
- {}
59
- )
60
-
61
- const decodedValues = decodeCandidAttributeValues(data, requestedKeyMap)
62
- if (Object.keys(decodedValues).length > 0) {
63
- return decodedValues
64
- }
65
-
66
- return extractPrintableAttributeValues(data, requestedKeys)
67
- }
68
-
69
- function decodeCandidAttributeValues(
70
- data: Uint8Array,
71
- requestedKeyMap: Record<string, string>
72
- ): IdentityAttributeValues {
73
- const textPairs = IDL.Vec(IDL.Tuple(IDL.Text, IDL.Text))
74
- const recordPairs = IDL.Vec(
75
- IDL.Record({
76
- key: IDL.Text,
77
- value: IDL.Text,
78
- })
79
- )
80
-
81
- const candidates = [
82
- [textPairs],
83
- [recordPairs],
84
- [IDL.Record({ attributes: textPairs })],
85
- [IDL.Record({ values: textPairs })],
86
- [IDL.Record({ attributes: recordPairs })],
87
- [IDL.Record({ values: recordPairs })],
88
- ]
89
-
90
- for (const candidate of candidates) {
91
- try {
92
- const decoded = IDL.decode(candidate, data)
93
- const values = collectDecodedAttributeValues(decoded, requestedKeyMap)
94
- if (Object.keys(values).length > 0) {
95
- return values
96
- }
97
- } catch {
98
- // Try the next known beta payload shape, then fall back to text extraction.
99
- }
100
- }
101
-
102
- return {}
103
- }
104
-
105
- function collectDecodedAttributeValues(
106
- value: unknown,
107
- requestedKeyMap: Record<string, string>,
108
- activeKey?: string
109
- ): IdentityAttributeValues {
110
- const values: IdentityAttributeValues = {}
111
-
112
- if (typeof value === "string") {
113
- const displayKey = requestedKeyMap[value]
114
- if (displayKey) {
115
- return values
116
- }
117
- if (activeKey && isPrintableTextValue(value)) {
118
- values[activeKey] = value
119
- }
120
- return values
121
- }
122
-
123
- if (Array.isArray(value)) {
124
- if (value.length === 2 && typeof value[0] === "string") {
125
- const displayKey = requestedKeyMap[value[0]]
126
- if (
127
- displayKey &&
128
- typeof value[1] === "string" &&
129
- isPrintableTextValue(value[1])
130
- ) {
131
- values[displayKey] = value[1]
132
- return values
133
- }
134
- }
135
-
136
- for (const item of value) {
137
- Object.assign(
138
- values,
139
- collectDecodedAttributeValues(item, requestedKeyMap, activeKey)
140
- )
141
- }
142
- return values
143
- }
144
-
145
- if (value && typeof value === "object") {
146
- const record = value as Record<string, unknown>
147
- if (typeof record.key === "string" && typeof record.value === "string") {
148
- const displayKey = requestedKeyMap[record.key]
149
- if (displayKey && isPrintableTextValue(record.value)) {
150
- values[displayKey] = record.value
151
- return values
152
- }
153
- }
154
-
155
- for (const [key, nested] of Object.entries(record)) {
156
- const displayKey = requestedKeyMap[key] ?? activeKey
157
- if (
158
- displayKey &&
159
- typeof nested === "string" &&
160
- isPrintableTextValue(nested)
161
- ) {
162
- values[displayKey] = nested
163
- continue
164
- }
165
- Object.assign(
166
- values,
167
- collectDecodedAttributeValues(nested, requestedKeyMap, displayKey)
168
- )
169
- }
170
- }
171
-
172
- return values
173
- }
174
-
175
- function extractPrintableAttributeValues(
176
- data: Uint8Array,
177
- requestedKeys: string[]
178
- ): IdentityAttributeValues {
179
- const text = new TextDecoder().decode(data)
180
- const values: IdentityAttributeValues = {}
181
-
182
- for (const requestedKey of requestedKeys) {
183
- const start = text.indexOf(requestedKey)
184
- if (start === -1) {
185
- continue
186
- }
187
-
188
- const tail = text.slice(start + requestedKey.length)
189
- const printableRuns = tail.match(/[\x20-\x7E]{2,512}/g) ?? []
190
- const value = printableRuns
191
- .map((candidate) =>
192
- cleanPrintableAttributeValue(candidate, requestedKeys)
193
- )
194
- .find(
195
- (candidate) =>
196
- isPrintableTextValue(candidate) &&
197
- candidate !== requestedKey &&
198
- !candidate.startsWith("openid:")
199
- )
200
-
201
- if (value) {
202
- values[identityAttributeDisplayKey(requestedKey)] = value.trim()
203
- }
204
- }
205
-
206
- return values
207
- }
208
-
209
- function cleanPrintableAttributeValue(
210
- value: string,
211
- requestedKeys: string[]
212
- ): string {
213
- let cleaned = value
214
-
215
- for (const requestedKey of requestedKeys) {
216
- const nextKeyIndex = cleaned.indexOf(requestedKey)
217
- if (nextKeyIndex > 0) {
218
- cleaned = cleaned.slice(
219
- 0,
220
- trimCandidTextLengthPrefix(cleaned, nextKeyIndex)
221
- )
222
- }
223
- }
224
-
225
- const nextOpenIdKeyMatch = /\d*openid:/.exec(cleaned)
226
- if (nextOpenIdKeyMatch?.index && nextOpenIdKeyMatch.index > 0) {
227
- cleaned = cleaned.slice(0, nextOpenIdKeyMatch.index)
228
- }
229
-
230
- return cleaned.trim()
231
- }
232
-
233
- function trimCandidTextLengthPrefix(value: string, index: number): number {
234
- let trimmedIndex = index
235
- while (trimmedIndex > 0 && /\d/.test(value[trimmedIndex - 1])) {
236
- trimmedIndex -= 1
237
- }
238
- return trimmedIndex
239
- }
240
-
241
- function identityAttributeDisplayKey(key: string): string {
242
- return key.split(":").pop() || key
243
- }
244
-
245
- function isPrintableTextValue(value: string): boolean {
246
- return value.length > 0 && value.length <= 512 && /^[\x20-\x7E]+$/.test(value)
247
- }
248
-
249
- export function normalizeSignedIdentityAttributes(
250
- attributes: SignedIdentityAttributes
251
- ): SignedIdentityAttributes {
252
- return {
253
- data: new Uint8Array(attributes.data),
254
- signature: new Uint8Array(attributes.signature),
255
- }
256
- }