@pelican-identity/react-native 1.2.5 → 1.2.7
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.
- package/README.md +1 -1
- package/dist/index.d.mts +12 -5
- package/dist/index.d.ts +12 -5
- package/dist/index.js +124 -89
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +124 -86
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/dist/components/PelicanAuth.d.ts.map +0 -1
- package/dist/components/PelicanAuth.js +0 -112
- package/dist/components/PelicanAuth.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/utilities.d.ts.map +0 -1
- package/dist/utilities.js +0 -42
- package/dist/utilities.js.map +0 -1
package/README.md
CHANGED
|
@@ -210,7 +210,7 @@ Main authentication component.
|
|
|
210
210
|
| `appId` | `string` | ✅ | App bundle identifier |
|
|
211
211
|
| `authType` | `"signup" \| "login" \| "id-verification"` | ✅ | Authentication flow |
|
|
212
212
|
| `onSuccess` | `(data: IdentityResult) => void` | ✅ | Success callback containing authenticated user data |
|
|
213
|
-
| `callBackUrl` | `string` |
|
|
213
|
+
| `callBackUrl` | `string` | ✅ | Deeplink to return to app |
|
|
214
214
|
| `onError` | `(error) => void` | Optional | Error callback |
|
|
215
215
|
| `onLoading` | `(loading: boolean) => void` | Optional | Loading callback, useful for loading stares |
|
|
216
216
|
| `buttonComponent` | `ReactNode` | Optional | Custom trigger UI |
|
package/dist/index.d.mts
CHANGED
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { PelicanAuthConfig, IdentityResult } from '@pelican-identity/auth-core';
|
|
3
3
|
export * from '@pelican-identity/auth-core';
|
|
4
|
+
import { StyleProp, ViewStyle } from 'react-native';
|
|
4
5
|
|
|
5
|
-
interface PelicanRNAuthProps extends PelicanAuthConfig {
|
|
6
|
+
interface PelicanRNAuthProps extends Omit<PelicanAuthConfig, "continuousMode" | "forceQRCode"> {
|
|
6
7
|
appId: string;
|
|
7
8
|
onSuccess: (result: IdentityResult) => void;
|
|
8
9
|
onError?: (error: Error) => void;
|
|
9
10
|
onLoading?: (loading: boolean) => void;
|
|
10
|
-
buttonComponent?: React.
|
|
11
|
-
callBackUrl
|
|
11
|
+
buttonComponent?: React.ReactElement;
|
|
12
|
+
callBackUrl: string;
|
|
13
|
+
style?: StyleProp<ViewStyle>;
|
|
12
14
|
}
|
|
13
15
|
|
|
14
|
-
declare const PelicanAuth: (
|
|
16
|
+
declare const PelicanAuth: (props: PelicanRNAuthProps) => react_jsx_runtime.JSX.Element;
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
declare const usePelicanAuth: (props: PelicanRNAuthProps) => {
|
|
19
|
+
initialize: () => Promise<void>;
|
|
20
|
+
loading: boolean;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export { PelicanAuth, type PelicanRNAuthProps, usePelicanAuth };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { PelicanAuthConfig, IdentityResult } from '@pelican-identity/auth-core';
|
|
3
3
|
export * from '@pelican-identity/auth-core';
|
|
4
|
+
import { StyleProp, ViewStyle } from 'react-native';
|
|
4
5
|
|
|
5
|
-
interface PelicanRNAuthProps extends PelicanAuthConfig {
|
|
6
|
+
interface PelicanRNAuthProps extends Omit<PelicanAuthConfig, "continuousMode" | "forceQRCode"> {
|
|
6
7
|
appId: string;
|
|
7
8
|
onSuccess: (result: IdentityResult) => void;
|
|
8
9
|
onError?: (error: Error) => void;
|
|
9
10
|
onLoading?: (loading: boolean) => void;
|
|
10
|
-
buttonComponent?: React.
|
|
11
|
-
callBackUrl
|
|
11
|
+
buttonComponent?: React.ReactElement;
|
|
12
|
+
callBackUrl: string;
|
|
13
|
+
style?: StyleProp<ViewStyle>;
|
|
12
14
|
}
|
|
13
15
|
|
|
14
|
-
declare const PelicanAuth: (
|
|
16
|
+
declare const PelicanAuth: (props: PelicanRNAuthProps) => react_jsx_runtime.JSX.Element;
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
declare const usePelicanAuth: (props: PelicanRNAuthProps) => {
|
|
19
|
+
initialize: () => Promise<void>;
|
|
20
|
+
loading: boolean;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export { PelicanAuth, type PelicanRNAuthProps, usePelicanAuth };
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var React = require('react');
|
|
4
3
|
var reactNative = require('react-native');
|
|
5
4
|
require('react-native-get-random-values');
|
|
5
|
+
var react = require('react');
|
|
6
6
|
var authCore = require('@pelican-identity/auth-core');
|
|
7
7
|
var jsxRuntime = require('react/jsx-runtime');
|
|
8
8
|
|
|
9
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
-
|
|
11
|
-
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
12
|
-
|
|
13
9
|
// src/components/PelicanAuth.tsx
|
|
14
10
|
var getRelayUrl = async ({
|
|
15
11
|
businessKey,
|
|
@@ -39,7 +35,7 @@ var getRelayUrl = async ({
|
|
|
39
35
|
);
|
|
40
36
|
if (!response.ok) {
|
|
41
37
|
const error = await response.text();
|
|
42
|
-
throw new Error(
|
|
38
|
+
throw new Error(error);
|
|
43
39
|
}
|
|
44
40
|
return response.json();
|
|
45
41
|
};
|
|
@@ -63,27 +59,94 @@ var getEncryptedData = async ({
|
|
|
63
59
|
);
|
|
64
60
|
if (!response.ok) {
|
|
65
61
|
const error = await response.text();
|
|
66
|
-
throw new Error(
|
|
62
|
+
throw new Error(error);
|
|
67
63
|
}
|
|
68
64
|
return response.json();
|
|
69
65
|
};
|
|
66
|
+
var validateCallbackUrl = (url) => {
|
|
67
|
+
if (!url) return { isValid: false, reason: "Callback URL is missing." };
|
|
68
|
+
const isExpo = url.startsWith("exp://");
|
|
69
|
+
const isStandardScheme = /^[a-z0-9]+:\/\//i.test(url);
|
|
70
|
+
if (!isStandardScheme && !isExpo) {
|
|
71
|
+
return {
|
|
72
|
+
isValid: false,
|
|
73
|
+
reason: "URL must include a scheme (e.g., 'myapp://' or 'exp://')."
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if (reactNative.Platform.OS === "ios" && url.includes("_")) {
|
|
77
|
+
return {
|
|
78
|
+
isValid: false,
|
|
79
|
+
reason: "iOS Custom Schemes should not contain underscores as per Apple guidelines."
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return { isValid: true };
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// src/hooks/usePelicanAuth.ts
|
|
70
86
|
var cryptoService = new authCore.CryptoService();
|
|
71
|
-
var
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
const
|
|
83
|
-
const
|
|
84
|
-
const
|
|
87
|
+
var usePelicanAuth = (props) => {
|
|
88
|
+
const {
|
|
89
|
+
authType,
|
|
90
|
+
projectId,
|
|
91
|
+
publicKey,
|
|
92
|
+
appId,
|
|
93
|
+
callBackUrl,
|
|
94
|
+
onSuccess,
|
|
95
|
+
onError,
|
|
96
|
+
onLoading
|
|
97
|
+
} = props;
|
|
98
|
+
const [loading, setLoading] = react.useState(false);
|
|
99
|
+
const sessionKey = react.useRef(null);
|
|
100
|
+
const sessionID = react.useRef(null);
|
|
101
|
+
const timeoutRef = react.useRef(null);
|
|
102
|
+
const clearAuthTimeout = react.useCallback(() => {
|
|
103
|
+
if (timeoutRef.current) {
|
|
104
|
+
clearTimeout(timeoutRef.current);
|
|
105
|
+
timeoutRef.current = null;
|
|
106
|
+
}
|
|
107
|
+
}, []);
|
|
108
|
+
const handleCallback = react.useCallback(async () => {
|
|
109
|
+
if (!sessionID.current || !sessionKey.current) return;
|
|
110
|
+
try {
|
|
111
|
+
const { cipher, nonce } = await getEncryptedData({
|
|
112
|
+
businessKey: publicKey,
|
|
113
|
+
authType,
|
|
114
|
+
projectID: projectId,
|
|
115
|
+
sessionID: sessionID.current,
|
|
116
|
+
appId
|
|
117
|
+
});
|
|
118
|
+
const decryptedData = cryptoService.decryptSymmetric({
|
|
119
|
+
encrypted: { cipher, nonce },
|
|
120
|
+
keyString: sessionKey.current
|
|
121
|
+
});
|
|
122
|
+
if (decryptedData) {
|
|
123
|
+
clearAuthTimeout();
|
|
124
|
+
const result = JSON.parse(decryptedData);
|
|
125
|
+
onSuccess(result);
|
|
126
|
+
sessionKey.current = null;
|
|
127
|
+
sessionID.current = null;
|
|
128
|
+
setLoading(false);
|
|
129
|
+
onLoading?.(false);
|
|
130
|
+
}
|
|
131
|
+
} catch (error) {
|
|
132
|
+
console.error("Pelican Callback Error:", error);
|
|
133
|
+
onError?.(error);
|
|
134
|
+
}
|
|
135
|
+
}, [
|
|
136
|
+
authType,
|
|
137
|
+
projectId,
|
|
138
|
+
publicKey,
|
|
139
|
+
appId,
|
|
140
|
+
onSuccess,
|
|
141
|
+
onError,
|
|
142
|
+
onLoading,
|
|
143
|
+
clearAuthTimeout
|
|
144
|
+
]);
|
|
85
145
|
const initialize = async () => {
|
|
146
|
+
const validation = validateCallbackUrl(callBackUrl || "");
|
|
147
|
+
if (!validation.isValid) console.warn(`[Pelican] ${validation.reason}`);
|
|
86
148
|
try {
|
|
149
|
+
clearAuthTimeout();
|
|
87
150
|
setLoading(true);
|
|
88
151
|
onLoading?.(true);
|
|
89
152
|
const { relay_url, session_id } = await getRelayUrl({
|
|
@@ -92,18 +155,20 @@ var PelicanAuth = ({
|
|
|
92
155
|
projectID: projectId,
|
|
93
156
|
appId
|
|
94
157
|
});
|
|
95
|
-
if (!relay_url) {
|
|
96
|
-
setLoading(false);
|
|
97
|
-
onLoading?.(false);
|
|
98
|
-
onError?.(new Error("Failed to get relay URL"));
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
158
|
sessionKey.current = cryptoService.generateSymmetricKey();
|
|
102
159
|
sessionID.current = session_id;
|
|
160
|
+
timeoutRef.current = setTimeout(() => {
|
|
161
|
+
if (sessionID.current) {
|
|
162
|
+
setLoading(false);
|
|
163
|
+
onLoading?.(false);
|
|
164
|
+
sessionID.current = null;
|
|
165
|
+
onError?.(new Error("Authentication timed out"));
|
|
166
|
+
}
|
|
167
|
+
}, 5 * 60 * 1e3);
|
|
103
168
|
const buildUrl = `${relay_url}?sessionKey=${encodeURIComponent(
|
|
104
|
-
sessionKey.current
|
|
169
|
+
sessionKey.current
|
|
105
170
|
)}&sessionID=${encodeURIComponent(
|
|
106
|
-
sessionID.current
|
|
171
|
+
sessionID.current
|
|
107
172
|
)}&authType=${encodeURIComponent(
|
|
108
173
|
authType
|
|
109
174
|
)}&projectId=${encodeURIComponent(
|
|
@@ -118,70 +183,39 @@ var PelicanAuth = ({
|
|
|
118
183
|
onError?.(error);
|
|
119
184
|
}
|
|
120
185
|
};
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
if (
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}
|
|
129
|
-
const { cipher, nonce } = await getEncryptedData({
|
|
130
|
-
businessKey: publicKey,
|
|
131
|
-
authType,
|
|
132
|
-
projectID: projectId,
|
|
133
|
-
sessionID: sessionID.current,
|
|
134
|
-
appId
|
|
135
|
-
});
|
|
136
|
-
const decryptedData = cryptoService.decryptSymmetric({
|
|
137
|
-
encrypted: { cipher, nonce },
|
|
138
|
-
keyString: sessionKey.current
|
|
139
|
-
});
|
|
140
|
-
if (decryptedData) {
|
|
141
|
-
const result = JSON.parse(decryptedData);
|
|
142
|
-
onSuccess(result);
|
|
143
|
-
sessionKey.current = null;
|
|
144
|
-
sessionID.current = null;
|
|
145
|
-
setLoading(false);
|
|
146
|
-
onLoading?.(false);
|
|
147
|
-
} else {
|
|
148
|
-
onError?.(new Error("Failed to get identity result"));
|
|
149
|
-
sessionKey.current = null;
|
|
150
|
-
sessionID.current = null;
|
|
151
|
-
setLoading(false);
|
|
152
|
-
onLoading?.(false);
|
|
153
|
-
}
|
|
154
|
-
} catch (error) {
|
|
155
|
-
console.log(error);
|
|
156
|
-
onError?.(error);
|
|
157
|
-
sessionKey.current = null;
|
|
158
|
-
sessionID.current = null;
|
|
159
|
-
setLoading(false);
|
|
160
|
-
onLoading?.(false);
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
React__default.default.useEffect(() => {
|
|
164
|
-
const subscription = reactNative.AppState.addEventListener("change", (nextAppState) => {
|
|
165
|
-
if (nextAppState === "active") {
|
|
166
|
-
handleCallback();
|
|
167
|
-
}
|
|
186
|
+
react.useEffect(() => {
|
|
187
|
+
const handleUrl = (event) => {
|
|
188
|
+
if (callBackUrl && event.url.startsWith(callBackUrl)) handleCallback();
|
|
189
|
+
};
|
|
190
|
+
const linkSub = reactNative.Linking.addEventListener("url", handleUrl);
|
|
191
|
+
const appStateSub = reactNative.AppState.addEventListener("change", (state) => {
|
|
192
|
+
if (state === "active") handleCallback();
|
|
168
193
|
});
|
|
169
194
|
return () => {
|
|
170
|
-
|
|
195
|
+
linkSub.remove();
|
|
196
|
+
appStateSub.remove();
|
|
197
|
+
clearAuthTimeout();
|
|
171
198
|
};
|
|
172
|
-
}, []);
|
|
173
|
-
return
|
|
199
|
+
}, [handleCallback, callBackUrl, clearAuthTimeout]);
|
|
200
|
+
return { initialize, loading };
|
|
201
|
+
};
|
|
202
|
+
var PelicanAuth = (props) => {
|
|
203
|
+
const { initialize, loading } = usePelicanAuth(props);
|
|
204
|
+
return /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { children: /* @__PURE__ */ jsxRuntime.jsx(reactNative.TouchableOpacity, { onPress: initialize, disabled: loading, children: props.buttonComponent || /* @__PURE__ */ jsxRuntime.jsxs(
|
|
174
205
|
reactNative.View,
|
|
175
206
|
{
|
|
176
|
-
style:
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
207
|
+
style: [
|
|
208
|
+
{
|
|
209
|
+
flexDirection: "row",
|
|
210
|
+
alignItems: "center",
|
|
211
|
+
gap: 10,
|
|
212
|
+
paddingHorizontal: 10,
|
|
213
|
+
paddingVertical: 10,
|
|
214
|
+
borderRadius: 20,
|
|
215
|
+
borderWidth: 1
|
|
216
|
+
},
|
|
217
|
+
props.style
|
|
218
|
+
],
|
|
185
219
|
children: [
|
|
186
220
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
187
221
|
reactNative.Image,
|
|
@@ -192,7 +226,7 @@ var PelicanAuth = ({
|
|
|
192
226
|
style: { width: 30, height: 30 }
|
|
193
227
|
}
|
|
194
228
|
),
|
|
195
|
-
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: { fontSize: 16, fontWeight: "600" }, children: authType === "login" ? "Login with Pelican" : authType === "signup" ? "Signup with Pelican" : authType === "id-verification" ? "Verify
|
|
229
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: { fontSize: 16, fontWeight: "600" }, children: props.authType === "login" ? "Login with Pelican" : props.authType === "signup" ? "Signup with Pelican" : props.authType === "id-verification" ? "Verify with Pelican" : "Authenticate with Pelican" }),
|
|
196
230
|
loading && /* @__PURE__ */ jsxRuntime.jsx(reactNative.ActivityIndicator, { color: "#000" })
|
|
197
231
|
]
|
|
198
232
|
}
|
|
@@ -201,5 +235,6 @@ var PelicanAuth = ({
|
|
|
201
235
|
var PelicanAuth_default = PelicanAuth;
|
|
202
236
|
|
|
203
237
|
exports.PelicanAuth = PelicanAuth_default;
|
|
238
|
+
exports.usePelicanAuth = usePelicanAuth;
|
|
204
239
|
//# sourceMappingURL=index.js.map
|
|
205
240
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utilities.ts","../src/components/PelicanAuth.tsx"],"names":["BASEURL","CryptoService","React","useState","Linking","AppState","jsx","View","TouchableOpacity","jsxs","Image","Text","ActivityIndicator"],"mappings":"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","file":"index.js","sourcesContent":["import \"react-native-get-random-values\";\n\nimport { BASEURL, type AuthType } from \"@pelican-identity/auth-core\";\n\nexport const getRelayUrl = async ({\n businessKey,\n authType,\n projectID,\n appId,\n}: {\n businessKey: string;\n authType: AuthType;\n projectID: string;\n appId: string;\n}) => {\n if (!businessKey) {\n throw new Error(\"Business Key is required\");\n }\n if (!authType) {\n throw new Error(\"Auth Type is required\");\n }\n if (!projectID) {\n throw new Error(\"Project ID is required\");\n }\n if (!appId) {\n throw new Error(\"App ID is required\");\n }\n const headers = {\n \"Content-Type\": \"application/json\",\n \"X-App-ID\": appId,\n };\n\n const response = await fetch(\n `${BASEURL}/relay?public_key=${businessKey}&auth_type=${authType}&project_id=${projectID}`,\n { headers }\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to initiate authentication: ${error}`);\n }\n\n return response.json() as Promise<{ relay_url: string; session_id: string }>;\n};\n\nexport const getEncryptedData = async ({\n businessKey,\n authType,\n projectID,\n sessionID,\n appId,\n}: {\n businessKey: string;\n authType: AuthType;\n projectID: string;\n sessionID: string;\n appId: string;\n}) => {\n if (!appId) {\n throw new Error(\"App ID is required\");\n }\n const headers = {\n \"Content-Type\": \"application/json\",\n \"X-App-ID\": appId,\n };\n\n const response = await fetch(\n `${BASEURL}/get-rn-sdk-encrypted-data?public_key=${businessKey}&auth_type=${authType}&project_id=${projectID}&session_id=${sessionID}`,\n { headers }\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to get encrypted data: ${error}`);\n }\n\n return response.json() as Promise<{ cipher: string; nonce: string }>;\n};\n","import React, { useState } from \"react\";\nimport {\n ActivityIndicator,\n AppState,\n Image,\n Linking,\n Text,\n TouchableOpacity,\n View,\n} from \"react-native\";\nimport \"react-native-get-random-values\";\n\nimport { getEncryptedData, getRelayUrl } from \"../utilities\";\nimport { PelicanRNAuthProps } from \"../types\";\nimport { IdentityResult, CryptoService } from \"@pelican-identity/auth-core\";\n\nconst cryptoService = new CryptoService();\nconst PelicanAuth = ({\n authType,\n projectId,\n publicKey,\n onSuccess,\n callBackUrl,\n onError,\n buttonComponent,\n onLoading,\n appId,\n}: PelicanRNAuthProps) => {\n const sessionKey = React.useRef<string | null>(null);\n const sessionID = React.useRef<string | null>(null);\n const [loading, setLoading] = useState(false);\n\n const initialize = async () => {\n try {\n setLoading(true);\n onLoading?.(true);\n const { relay_url, session_id } = await getRelayUrl({\n businessKey: publicKey,\n authType,\n projectID: projectId,\n appId,\n });\n\n if (!relay_url) {\n setLoading(false);\n onLoading?.(false);\n onError?.(new Error(\"Failed to get relay URL\"));\n return;\n }\n\n sessionKey.current = cryptoService.generateSymmetricKey();\n sessionID.current = session_id;\n\n const buildUrl = `${relay_url}?sessionKey=${encodeURIComponent(\n sessionKey.current || \"\"\n )}&sessionID=${encodeURIComponent(\n sessionID.current || \"\"\n )}&authType=${encodeURIComponent(\n authType\n )}&projectId=${encodeURIComponent(\n projectId\n )}&publicKey=${encodeURIComponent(\n publicKey\n )}&callBackUrl=${encodeURIComponent(callBackUrl || \"\")}`;\n Linking.openURL(buildUrl);\n } catch (error) {\n setLoading(false);\n onLoading?.(false);\n onError?.(error as Error);\n }\n };\n\n const handleCallback = async () => {\n try {\n if (!sessionID.current) {\n return;\n }\n if (!sessionKey.current) {\n return;\n }\n const { cipher, nonce } = await getEncryptedData({\n businessKey: publicKey,\n authType,\n projectID: projectId,\n sessionID: sessionID.current,\n appId,\n });\n\n const decryptedData = cryptoService.decryptSymmetric({\n encrypted: { cipher, nonce },\n keyString: sessionKey.current,\n });\n\n if (decryptedData) {\n const result: IdentityResult = JSON.parse(decryptedData);\n\n onSuccess(result);\n sessionKey.current = null;\n sessionID.current = null;\n setLoading(false);\n onLoading?.(false);\n } else {\n onError?.(new Error(\"Failed to get identity result\"));\n sessionKey.current = null;\n sessionID.current = null;\n setLoading(false);\n onLoading?.(false);\n }\n } catch (error) {\n console.log(error);\n onError?.(error as Error);\n sessionKey.current = null;\n sessionID.current = null;\n setLoading(false);\n onLoading?.(false);\n }\n };\n\n React.useEffect(() => {\n const subscription = AppState.addEventListener(\"change\", (nextAppState) => {\n if (nextAppState === \"active\") {\n handleCallback();\n }\n });\n return () => {\n subscription.remove();\n };\n }, []);\n\n return (\n <View>\n <TouchableOpacity onPress={initialize} disabled={loading}>\n {buttonComponent || (\n <View\n style={{\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 10,\n paddingHorizontal: 10,\n paddingVertical: 10,\n borderRadius: 20,\n borderWidth: 1,\n }}\n >\n <Image\n source={{\n uri: \"https://res.cloudinary.com/de0jr8mcm/image/upload/v1765904735/pelican/pelican_icon_r9ghqw.png\",\n }}\n style={{ width: 30, height: 30 }}\n />\n <Text style={{ fontSize: 16, fontWeight: \"600\" }}>\n {authType === \"login\"\n ? \"Login with Pelican\"\n : authType === \"signup\"\n ? \"Signup with Pelican\"\n : authType === \"id-verification\"\n ? \"Verify identity with Pelican\"\n : \"Authenticate with Pelican\"}\n </Text>\n {loading && <ActivityIndicator color={\"#000\"} />}\n </View>\n )}\n </TouchableOpacity>\n </View>\n );\n};\n\nexport default PelicanAuth;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utilities.ts","../src/hooks/usePelicanAuth.ts","../src/components/PelicanAuth.tsx"],"names":["BASEURL","Platform","CryptoService","useState","useRef","useCallback","Linking","useEffect","AppState","jsx","View","TouchableOpacity","jsxs","Image","Text","ActivityIndicator"],"mappings":"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","file":"index.js","sourcesContent":["import \"react-native-get-random-values\";\n\nimport { BASEURL, type AuthType } from \"@pelican-identity/auth-core\";\nimport { Platform } from \"react-native\";\n\nexport const getRelayUrl = async ({\n businessKey,\n authType,\n projectID,\n appId,\n}: {\n businessKey: string;\n authType: AuthType;\n projectID: string;\n appId: string;\n}) => {\n if (!businessKey) {\n throw new Error(\"Business Key is required\");\n }\n if (!authType) {\n throw new Error(\"Auth Type is required\");\n }\n if (!projectID) {\n throw new Error(\"Project ID is required\");\n }\n if (!appId) {\n throw new Error(\"App ID is required\");\n }\n const headers = {\n \"Content-Type\": \"application/json\",\n \"X-App-ID\": appId,\n };\n\n const response = await fetch(\n `${BASEURL}/relay?public_key=${businessKey}&auth_type=${authType}&project_id=${projectID}`,\n { headers }\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(error);\n }\n\n return response.json() as Promise<{ relay_url: string; session_id: string }>;\n};\n\nexport const getEncryptedData = async ({\n businessKey,\n authType,\n projectID,\n sessionID,\n appId,\n}: {\n businessKey: string;\n authType: AuthType;\n projectID: string;\n sessionID: string;\n appId: string;\n}) => {\n if (!appId) {\n throw new Error(\"App ID is required\");\n }\n const headers = {\n \"Content-Type\": \"application/json\",\n \"X-App-ID\": appId,\n };\n\n const response = await fetch(\n `${BASEURL}/get-rn-sdk-encrypted-data?public_key=${businessKey}&auth_type=${authType}&project_id=${projectID}&session_id=${sessionID}`,\n { headers }\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(error);\n }\n\n return response.json() as Promise<{ cipher: string; nonce: string }>;\n};\n\n/**\n * Validates if the provided callback URL is compatible with the\n * current environment (Expo vs Bare vs Production).\n */\nexport const validateCallbackUrl = (\n url: string\n): { isValid: boolean; reason?: string } => {\n if (!url) return { isValid: false, reason: \"Callback URL is missing.\" };\n\n // Check for common Expo development URLs\n const isExpo = url.startsWith(\"exp://\");\n const isStandardScheme = /^[a-z0-9]+:\\/\\//i.test(url);\n\n if (!isStandardScheme && !isExpo) {\n return {\n isValid: false,\n reason: \"URL must include a scheme (e.g., 'myapp://' or 'exp://').\",\n };\n }\n\n if (Platform.OS === \"ios\" && url.includes(\"_\")) {\n return {\n isValid: false,\n reason:\n \"iOS Custom Schemes should not contain underscores as per Apple guidelines.\",\n };\n }\n\n return { isValid: true };\n};\n","import { useState, useRef, useEffect, useCallback } from \"react\";\nimport { AppState, Linking } from \"react-native\";\nimport { CryptoService, IdentityResult } from \"@pelican-identity/auth-core\";\nimport {\n getRelayUrl,\n getEncryptedData,\n validateCallbackUrl,\n} from \"../utilities\";\nimport { PelicanRNAuthProps } from \"../types/types\";\n\nconst cryptoService = new CryptoService();\n\nexport const usePelicanAuth = (props: PelicanRNAuthProps) => {\n const {\n authType,\n projectId,\n publicKey,\n appId,\n callBackUrl,\n onSuccess,\n onError,\n onLoading,\n } = props;\n\n const [loading, setLoading] = useState(false);\n const sessionKey = useRef<string | null>(null);\n const sessionID = useRef<string | null>(null);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const clearAuthTimeout = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n const handleCallback = useCallback(async () => {\n if (!sessionID.current || !sessionKey.current) return;\n\n try {\n const { cipher, nonce } = await getEncryptedData({\n businessKey: publicKey,\n authType,\n projectID: projectId,\n sessionID: sessionID.current,\n appId,\n });\n\n const decryptedData = cryptoService.decryptSymmetric({\n encrypted: { cipher, nonce },\n keyString: sessionKey.current,\n });\n\n if (decryptedData) {\n clearAuthTimeout();\n const result: IdentityResult = JSON.parse(decryptedData);\n onSuccess(result);\n sessionKey.current = null;\n sessionID.current = null;\n setLoading(false);\n onLoading?.(false);\n }\n } catch (error) {\n console.error(\"Pelican Callback Error:\", error);\n onError?.(error as Error);\n }\n }, [\n authType,\n projectId,\n publicKey,\n appId,\n onSuccess,\n onError,\n onLoading,\n clearAuthTimeout,\n ]);\n\n const initialize = async () => {\n const validation = validateCallbackUrl(callBackUrl || \"\");\n if (!validation.isValid) console.warn(`[Pelican] ${validation.reason}`);\n\n try {\n clearAuthTimeout();\n setLoading(true);\n onLoading?.(true);\n\n const { relay_url, session_id } = await getRelayUrl({\n businessKey: publicKey,\n authType,\n projectID: projectId,\n appId,\n });\n\n sessionKey.current = cryptoService.generateSymmetricKey();\n sessionID.current = session_id;\n\n // Start 5-minute timeout\n timeoutRef.current = setTimeout(() => {\n if (sessionID.current) {\n setLoading(false);\n onLoading?.(false);\n sessionID.current = null;\n onError?.(new Error(\"Authentication timed out\"));\n }\n }, 5 * 60 * 1000);\n\n const buildUrl = `${relay_url}?sessionKey=${encodeURIComponent(\n sessionKey.current\n )}&sessionID=${encodeURIComponent(\n sessionID.current\n )}&authType=${encodeURIComponent(\n authType\n )}&projectId=${encodeURIComponent(\n projectId\n )}&publicKey=${encodeURIComponent(\n publicKey\n )}&callBackUrl=${encodeURIComponent(callBackUrl || \"\")}`;\n\n Linking.openURL(buildUrl);\n } catch (error) {\n setLoading(false);\n onLoading?.(false);\n onError?.(error as Error);\n }\n };\n\n useEffect(() => {\n const handleUrl = (event: { url: string }) => {\n if (callBackUrl && event.url.startsWith(callBackUrl)) handleCallback();\n };\n\n const linkSub = Linking.addEventListener(\"url\", handleUrl);\n const appStateSub = AppState.addEventListener(\"change\", (state) => {\n if (state === \"active\") handleCallback();\n });\n\n return () => {\n linkSub.remove();\n appStateSub.remove();\n clearAuthTimeout();\n };\n }, [handleCallback, callBackUrl, clearAuthTimeout]);\n\n return { initialize, loading };\n};\n","import {\n ActivityIndicator,\n Image,\n Text,\n TouchableOpacity,\n View,\n} from \"react-native\";\nimport \"react-native-get-random-values\";\n\nimport { usePelicanAuth } from \"../hooks/usePelicanAuth\";\nimport { PelicanRNAuthProps } from \"../types/types\";\nconst PelicanAuth = (props: PelicanRNAuthProps) => {\n const { initialize, loading } = usePelicanAuth(props);\n return (\n <View>\n <TouchableOpacity onPress={initialize} disabled={loading}>\n {props.buttonComponent || (\n <View\n style={[\n {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 10,\n paddingHorizontal: 10,\n paddingVertical: 10,\n borderRadius: 20,\n borderWidth: 1,\n },\n props.style,\n ]}\n >\n <Image\n source={{\n uri: \"https://res.cloudinary.com/de0jr8mcm/image/upload/v1765904735/pelican/pelican_icon_r9ghqw.png\",\n }}\n style={{ width: 30, height: 30 }}\n />\n <Text style={{ fontSize: 16, fontWeight: \"600\" }}>\n {props.authType === \"login\"\n ? \"Login with Pelican\"\n : props.authType === \"signup\"\n ? \"Signup with Pelican\"\n : props.authType === \"id-verification\"\n ? \"Verify with Pelican\"\n : \"Authenticate with Pelican\"}\n </Text>\n {loading && <ActivityIndicator color={\"#000\"} />}\n </View>\n )}\n </TouchableOpacity>\n </View>\n );\n};\n\nexport default PelicanAuth;\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { AppState, View, TouchableOpacity, Image, Text, ActivityIndicator, Linking } from 'react-native';
|
|
1
|
+
import { Linking, AppState, View, TouchableOpacity, Image, Text, ActivityIndicator, Platform } from 'react-native';
|
|
3
2
|
import 'react-native-get-random-values';
|
|
3
|
+
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
4
4
|
import { CryptoService, BASEURL } from '@pelican-identity/auth-core';
|
|
5
5
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
6
|
|
|
@@ -33,7 +33,7 @@ var getRelayUrl = async ({
|
|
|
33
33
|
);
|
|
34
34
|
if (!response.ok) {
|
|
35
35
|
const error = await response.text();
|
|
36
|
-
throw new Error(
|
|
36
|
+
throw new Error(error);
|
|
37
37
|
}
|
|
38
38
|
return response.json();
|
|
39
39
|
};
|
|
@@ -57,27 +57,94 @@ var getEncryptedData = async ({
|
|
|
57
57
|
);
|
|
58
58
|
if (!response.ok) {
|
|
59
59
|
const error = await response.text();
|
|
60
|
-
throw new Error(
|
|
60
|
+
throw new Error(error);
|
|
61
61
|
}
|
|
62
62
|
return response.json();
|
|
63
63
|
};
|
|
64
|
+
var validateCallbackUrl = (url) => {
|
|
65
|
+
if (!url) return { isValid: false, reason: "Callback URL is missing." };
|
|
66
|
+
const isExpo = url.startsWith("exp://");
|
|
67
|
+
const isStandardScheme = /^[a-z0-9]+:\/\//i.test(url);
|
|
68
|
+
if (!isStandardScheme && !isExpo) {
|
|
69
|
+
return {
|
|
70
|
+
isValid: false,
|
|
71
|
+
reason: "URL must include a scheme (e.g., 'myapp://' or 'exp://')."
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (Platform.OS === "ios" && url.includes("_")) {
|
|
75
|
+
return {
|
|
76
|
+
isValid: false,
|
|
77
|
+
reason: "iOS Custom Schemes should not contain underscores as per Apple guidelines."
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return { isValid: true };
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// src/hooks/usePelicanAuth.ts
|
|
64
84
|
var cryptoService = new CryptoService();
|
|
65
|
-
var
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
const sessionKey = React.useRef(null);
|
|
77
|
-
const sessionID = React.useRef(null);
|
|
85
|
+
var usePelicanAuth = (props) => {
|
|
86
|
+
const {
|
|
87
|
+
authType,
|
|
88
|
+
projectId,
|
|
89
|
+
publicKey,
|
|
90
|
+
appId,
|
|
91
|
+
callBackUrl,
|
|
92
|
+
onSuccess,
|
|
93
|
+
onError,
|
|
94
|
+
onLoading
|
|
95
|
+
} = props;
|
|
78
96
|
const [loading, setLoading] = useState(false);
|
|
97
|
+
const sessionKey = useRef(null);
|
|
98
|
+
const sessionID = useRef(null);
|
|
99
|
+
const timeoutRef = useRef(null);
|
|
100
|
+
const clearAuthTimeout = useCallback(() => {
|
|
101
|
+
if (timeoutRef.current) {
|
|
102
|
+
clearTimeout(timeoutRef.current);
|
|
103
|
+
timeoutRef.current = null;
|
|
104
|
+
}
|
|
105
|
+
}, []);
|
|
106
|
+
const handleCallback = useCallback(async () => {
|
|
107
|
+
if (!sessionID.current || !sessionKey.current) return;
|
|
108
|
+
try {
|
|
109
|
+
const { cipher, nonce } = await getEncryptedData({
|
|
110
|
+
businessKey: publicKey,
|
|
111
|
+
authType,
|
|
112
|
+
projectID: projectId,
|
|
113
|
+
sessionID: sessionID.current,
|
|
114
|
+
appId
|
|
115
|
+
});
|
|
116
|
+
const decryptedData = cryptoService.decryptSymmetric({
|
|
117
|
+
encrypted: { cipher, nonce },
|
|
118
|
+
keyString: sessionKey.current
|
|
119
|
+
});
|
|
120
|
+
if (decryptedData) {
|
|
121
|
+
clearAuthTimeout();
|
|
122
|
+
const result = JSON.parse(decryptedData);
|
|
123
|
+
onSuccess(result);
|
|
124
|
+
sessionKey.current = null;
|
|
125
|
+
sessionID.current = null;
|
|
126
|
+
setLoading(false);
|
|
127
|
+
onLoading?.(false);
|
|
128
|
+
}
|
|
129
|
+
} catch (error) {
|
|
130
|
+
console.error("Pelican Callback Error:", error);
|
|
131
|
+
onError?.(error);
|
|
132
|
+
}
|
|
133
|
+
}, [
|
|
134
|
+
authType,
|
|
135
|
+
projectId,
|
|
136
|
+
publicKey,
|
|
137
|
+
appId,
|
|
138
|
+
onSuccess,
|
|
139
|
+
onError,
|
|
140
|
+
onLoading,
|
|
141
|
+
clearAuthTimeout
|
|
142
|
+
]);
|
|
79
143
|
const initialize = async () => {
|
|
144
|
+
const validation = validateCallbackUrl(callBackUrl || "");
|
|
145
|
+
if (!validation.isValid) console.warn(`[Pelican] ${validation.reason}`);
|
|
80
146
|
try {
|
|
147
|
+
clearAuthTimeout();
|
|
81
148
|
setLoading(true);
|
|
82
149
|
onLoading?.(true);
|
|
83
150
|
const { relay_url, session_id } = await getRelayUrl({
|
|
@@ -86,18 +153,20 @@ var PelicanAuth = ({
|
|
|
86
153
|
projectID: projectId,
|
|
87
154
|
appId
|
|
88
155
|
});
|
|
89
|
-
if (!relay_url) {
|
|
90
|
-
setLoading(false);
|
|
91
|
-
onLoading?.(false);
|
|
92
|
-
onError?.(new Error("Failed to get relay URL"));
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
156
|
sessionKey.current = cryptoService.generateSymmetricKey();
|
|
96
157
|
sessionID.current = session_id;
|
|
158
|
+
timeoutRef.current = setTimeout(() => {
|
|
159
|
+
if (sessionID.current) {
|
|
160
|
+
setLoading(false);
|
|
161
|
+
onLoading?.(false);
|
|
162
|
+
sessionID.current = null;
|
|
163
|
+
onError?.(new Error("Authentication timed out"));
|
|
164
|
+
}
|
|
165
|
+
}, 5 * 60 * 1e3);
|
|
97
166
|
const buildUrl = `${relay_url}?sessionKey=${encodeURIComponent(
|
|
98
|
-
sessionKey.current
|
|
167
|
+
sessionKey.current
|
|
99
168
|
)}&sessionID=${encodeURIComponent(
|
|
100
|
-
sessionID.current
|
|
169
|
+
sessionID.current
|
|
101
170
|
)}&authType=${encodeURIComponent(
|
|
102
171
|
authType
|
|
103
172
|
)}&projectId=${encodeURIComponent(
|
|
@@ -112,70 +181,39 @@ var PelicanAuth = ({
|
|
|
112
181
|
onError?.(error);
|
|
113
182
|
}
|
|
114
183
|
};
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
if (
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
123
|
-
const { cipher, nonce } = await getEncryptedData({
|
|
124
|
-
businessKey: publicKey,
|
|
125
|
-
authType,
|
|
126
|
-
projectID: projectId,
|
|
127
|
-
sessionID: sessionID.current,
|
|
128
|
-
appId
|
|
129
|
-
});
|
|
130
|
-
const decryptedData = cryptoService.decryptSymmetric({
|
|
131
|
-
encrypted: { cipher, nonce },
|
|
132
|
-
keyString: sessionKey.current
|
|
133
|
-
});
|
|
134
|
-
if (decryptedData) {
|
|
135
|
-
const result = JSON.parse(decryptedData);
|
|
136
|
-
onSuccess(result);
|
|
137
|
-
sessionKey.current = null;
|
|
138
|
-
sessionID.current = null;
|
|
139
|
-
setLoading(false);
|
|
140
|
-
onLoading?.(false);
|
|
141
|
-
} else {
|
|
142
|
-
onError?.(new Error("Failed to get identity result"));
|
|
143
|
-
sessionKey.current = null;
|
|
144
|
-
sessionID.current = null;
|
|
145
|
-
setLoading(false);
|
|
146
|
-
onLoading?.(false);
|
|
147
|
-
}
|
|
148
|
-
} catch (error) {
|
|
149
|
-
console.log(error);
|
|
150
|
-
onError?.(error);
|
|
151
|
-
sessionKey.current = null;
|
|
152
|
-
sessionID.current = null;
|
|
153
|
-
setLoading(false);
|
|
154
|
-
onLoading?.(false);
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
|
-
React.useEffect(() => {
|
|
158
|
-
const subscription = AppState.addEventListener("change", (nextAppState) => {
|
|
159
|
-
if (nextAppState === "active") {
|
|
160
|
-
handleCallback();
|
|
161
|
-
}
|
|
184
|
+
useEffect(() => {
|
|
185
|
+
const handleUrl = (event) => {
|
|
186
|
+
if (callBackUrl && event.url.startsWith(callBackUrl)) handleCallback();
|
|
187
|
+
};
|
|
188
|
+
const linkSub = Linking.addEventListener("url", handleUrl);
|
|
189
|
+
const appStateSub = AppState.addEventListener("change", (state) => {
|
|
190
|
+
if (state === "active") handleCallback();
|
|
162
191
|
});
|
|
163
192
|
return () => {
|
|
164
|
-
|
|
193
|
+
linkSub.remove();
|
|
194
|
+
appStateSub.remove();
|
|
195
|
+
clearAuthTimeout();
|
|
165
196
|
};
|
|
166
|
-
}, []);
|
|
167
|
-
return
|
|
197
|
+
}, [handleCallback, callBackUrl, clearAuthTimeout]);
|
|
198
|
+
return { initialize, loading };
|
|
199
|
+
};
|
|
200
|
+
var PelicanAuth = (props) => {
|
|
201
|
+
const { initialize, loading } = usePelicanAuth(props);
|
|
202
|
+
return /* @__PURE__ */ jsx(View, { children: /* @__PURE__ */ jsx(TouchableOpacity, { onPress: initialize, disabled: loading, children: props.buttonComponent || /* @__PURE__ */ jsxs(
|
|
168
203
|
View,
|
|
169
204
|
{
|
|
170
|
-
style:
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
205
|
+
style: [
|
|
206
|
+
{
|
|
207
|
+
flexDirection: "row",
|
|
208
|
+
alignItems: "center",
|
|
209
|
+
gap: 10,
|
|
210
|
+
paddingHorizontal: 10,
|
|
211
|
+
paddingVertical: 10,
|
|
212
|
+
borderRadius: 20,
|
|
213
|
+
borderWidth: 1
|
|
214
|
+
},
|
|
215
|
+
props.style
|
|
216
|
+
],
|
|
179
217
|
children: [
|
|
180
218
|
/* @__PURE__ */ jsx(
|
|
181
219
|
Image,
|
|
@@ -186,7 +224,7 @@ var PelicanAuth = ({
|
|
|
186
224
|
style: { width: 30, height: 30 }
|
|
187
225
|
}
|
|
188
226
|
),
|
|
189
|
-
/* @__PURE__ */ jsx(Text, { style: { fontSize: 16, fontWeight: "600" }, children: authType === "login" ? "Login with Pelican" : authType === "signup" ? "Signup with Pelican" : authType === "id-verification" ? "Verify
|
|
227
|
+
/* @__PURE__ */ jsx(Text, { style: { fontSize: 16, fontWeight: "600" }, children: props.authType === "login" ? "Login with Pelican" : props.authType === "signup" ? "Signup with Pelican" : props.authType === "id-verification" ? "Verify with Pelican" : "Authenticate with Pelican" }),
|
|
190
228
|
loading && /* @__PURE__ */ jsx(ActivityIndicator, { color: "#000" })
|
|
191
229
|
]
|
|
192
230
|
}
|
|
@@ -194,6 +232,6 @@ var PelicanAuth = ({
|
|
|
194
232
|
};
|
|
195
233
|
var PelicanAuth_default = PelicanAuth;
|
|
196
234
|
|
|
197
|
-
export { PelicanAuth_default as PelicanAuth };
|
|
235
|
+
export { PelicanAuth_default as PelicanAuth, usePelicanAuth };
|
|
198
236
|
//# sourceMappingURL=index.mjs.map
|
|
199
237
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utilities.ts","../src/components/PelicanAuth.tsx"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import \"react-native-get-random-values\";\n\nimport { BASEURL, type AuthType } from \"@pelican-identity/auth-core\";\n\nexport const getRelayUrl = async ({\n businessKey,\n authType,\n projectID,\n appId,\n}: {\n businessKey: string;\n authType: AuthType;\n projectID: string;\n appId: string;\n}) => {\n if (!businessKey) {\n throw new Error(\"Business Key is required\");\n }\n if (!authType) {\n throw new Error(\"Auth Type is required\");\n }\n if (!projectID) {\n throw new Error(\"Project ID is required\");\n }\n if (!appId) {\n throw new Error(\"App ID is required\");\n }\n const headers = {\n \"Content-Type\": \"application/json\",\n \"X-App-ID\": appId,\n };\n\n const response = await fetch(\n `${BASEURL}/relay?public_key=${businessKey}&auth_type=${authType}&project_id=${projectID}`,\n { headers }\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to initiate authentication: ${error}`);\n }\n\n return response.json() as Promise<{ relay_url: string; session_id: string }>;\n};\n\nexport const getEncryptedData = async ({\n businessKey,\n authType,\n projectID,\n sessionID,\n appId,\n}: {\n businessKey: string;\n authType: AuthType;\n projectID: string;\n sessionID: string;\n appId: string;\n}) => {\n if (!appId) {\n throw new Error(\"App ID is required\");\n }\n const headers = {\n \"Content-Type\": \"application/json\",\n \"X-App-ID\": appId,\n };\n\n const response = await fetch(\n `${BASEURL}/get-rn-sdk-encrypted-data?public_key=${businessKey}&auth_type=${authType}&project_id=${projectID}&session_id=${sessionID}`,\n { headers }\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to get encrypted data: ${error}`);\n }\n\n return response.json() as Promise<{ cipher: string; nonce: string }>;\n};\n","import React, { useState } from \"react\";\nimport {\n ActivityIndicator,\n AppState,\n Image,\n Linking,\n Text,\n TouchableOpacity,\n View,\n} from \"react-native\";\nimport \"react-native-get-random-values\";\n\nimport { getEncryptedData, getRelayUrl } from \"../utilities\";\nimport { PelicanRNAuthProps } from \"../types\";\nimport { IdentityResult, CryptoService } from \"@pelican-identity/auth-core\";\n\nconst cryptoService = new CryptoService();\nconst PelicanAuth = ({\n authType,\n projectId,\n publicKey,\n onSuccess,\n callBackUrl,\n onError,\n buttonComponent,\n onLoading,\n appId,\n}: PelicanRNAuthProps) => {\n const sessionKey = React.useRef<string | null>(null);\n const sessionID = React.useRef<string | null>(null);\n const [loading, setLoading] = useState(false);\n\n const initialize = async () => {\n try {\n setLoading(true);\n onLoading?.(true);\n const { relay_url, session_id } = await getRelayUrl({\n businessKey: publicKey,\n authType,\n projectID: projectId,\n appId,\n });\n\n if (!relay_url) {\n setLoading(false);\n onLoading?.(false);\n onError?.(new Error(\"Failed to get relay URL\"));\n return;\n }\n\n sessionKey.current = cryptoService.generateSymmetricKey();\n sessionID.current = session_id;\n\n const buildUrl = `${relay_url}?sessionKey=${encodeURIComponent(\n sessionKey.current || \"\"\n )}&sessionID=${encodeURIComponent(\n sessionID.current || \"\"\n )}&authType=${encodeURIComponent(\n authType\n )}&projectId=${encodeURIComponent(\n projectId\n )}&publicKey=${encodeURIComponent(\n publicKey\n )}&callBackUrl=${encodeURIComponent(callBackUrl || \"\")}`;\n Linking.openURL(buildUrl);\n } catch (error) {\n setLoading(false);\n onLoading?.(false);\n onError?.(error as Error);\n }\n };\n\n const handleCallback = async () => {\n try {\n if (!sessionID.current) {\n return;\n }\n if (!sessionKey.current) {\n return;\n }\n const { cipher, nonce } = await getEncryptedData({\n businessKey: publicKey,\n authType,\n projectID: projectId,\n sessionID: sessionID.current,\n appId,\n });\n\n const decryptedData = cryptoService.decryptSymmetric({\n encrypted: { cipher, nonce },\n keyString: sessionKey.current,\n });\n\n if (decryptedData) {\n const result: IdentityResult = JSON.parse(decryptedData);\n\n onSuccess(result);\n sessionKey.current = null;\n sessionID.current = null;\n setLoading(false);\n onLoading?.(false);\n } else {\n onError?.(new Error(\"Failed to get identity result\"));\n sessionKey.current = null;\n sessionID.current = null;\n setLoading(false);\n onLoading?.(false);\n }\n } catch (error) {\n console.log(error);\n onError?.(error as Error);\n sessionKey.current = null;\n sessionID.current = null;\n setLoading(false);\n onLoading?.(false);\n }\n };\n\n React.useEffect(() => {\n const subscription = AppState.addEventListener(\"change\", (nextAppState) => {\n if (nextAppState === \"active\") {\n handleCallback();\n }\n });\n return () => {\n subscription.remove();\n };\n }, []);\n\n return (\n <View>\n <TouchableOpacity onPress={initialize} disabled={loading}>\n {buttonComponent || (\n <View\n style={{\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 10,\n paddingHorizontal: 10,\n paddingVertical: 10,\n borderRadius: 20,\n borderWidth: 1,\n }}\n >\n <Image\n source={{\n uri: \"https://res.cloudinary.com/de0jr8mcm/image/upload/v1765904735/pelican/pelican_icon_r9ghqw.png\",\n }}\n style={{ width: 30, height: 30 }}\n />\n <Text style={{ fontSize: 16, fontWeight: \"600\" }}>\n {authType === \"login\"\n ? \"Login with Pelican\"\n : authType === \"signup\"\n ? \"Signup with Pelican\"\n : authType === \"id-verification\"\n ? \"Verify identity with Pelican\"\n : \"Authenticate with Pelican\"}\n </Text>\n {loading && <ActivityIndicator color={\"#000\"} />}\n </View>\n )}\n </TouchableOpacity>\n </View>\n );\n};\n\nexport default PelicanAuth;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utilities.ts","../src/hooks/usePelicanAuth.ts","../src/components/PelicanAuth.tsx"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import \"react-native-get-random-values\";\n\nimport { BASEURL, type AuthType } from \"@pelican-identity/auth-core\";\nimport { Platform } from \"react-native\";\n\nexport const getRelayUrl = async ({\n businessKey,\n authType,\n projectID,\n appId,\n}: {\n businessKey: string;\n authType: AuthType;\n projectID: string;\n appId: string;\n}) => {\n if (!businessKey) {\n throw new Error(\"Business Key is required\");\n }\n if (!authType) {\n throw new Error(\"Auth Type is required\");\n }\n if (!projectID) {\n throw new Error(\"Project ID is required\");\n }\n if (!appId) {\n throw new Error(\"App ID is required\");\n }\n const headers = {\n \"Content-Type\": \"application/json\",\n \"X-App-ID\": appId,\n };\n\n const response = await fetch(\n `${BASEURL}/relay?public_key=${businessKey}&auth_type=${authType}&project_id=${projectID}`,\n { headers }\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(error);\n }\n\n return response.json() as Promise<{ relay_url: string; session_id: string }>;\n};\n\nexport const getEncryptedData = async ({\n businessKey,\n authType,\n projectID,\n sessionID,\n appId,\n}: {\n businessKey: string;\n authType: AuthType;\n projectID: string;\n sessionID: string;\n appId: string;\n}) => {\n if (!appId) {\n throw new Error(\"App ID is required\");\n }\n const headers = {\n \"Content-Type\": \"application/json\",\n \"X-App-ID\": appId,\n };\n\n const response = await fetch(\n `${BASEURL}/get-rn-sdk-encrypted-data?public_key=${businessKey}&auth_type=${authType}&project_id=${projectID}&session_id=${sessionID}`,\n { headers }\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(error);\n }\n\n return response.json() as Promise<{ cipher: string; nonce: string }>;\n};\n\n/**\n * Validates if the provided callback URL is compatible with the\n * current environment (Expo vs Bare vs Production).\n */\nexport const validateCallbackUrl = (\n url: string\n): { isValid: boolean; reason?: string } => {\n if (!url) return { isValid: false, reason: \"Callback URL is missing.\" };\n\n // Check for common Expo development URLs\n const isExpo = url.startsWith(\"exp://\");\n const isStandardScheme = /^[a-z0-9]+:\\/\\//i.test(url);\n\n if (!isStandardScheme && !isExpo) {\n return {\n isValid: false,\n reason: \"URL must include a scheme (e.g., 'myapp://' or 'exp://').\",\n };\n }\n\n if (Platform.OS === \"ios\" && url.includes(\"_\")) {\n return {\n isValid: false,\n reason:\n \"iOS Custom Schemes should not contain underscores as per Apple guidelines.\",\n };\n }\n\n return { isValid: true };\n};\n","import { useState, useRef, useEffect, useCallback } from \"react\";\nimport { AppState, Linking } from \"react-native\";\nimport { CryptoService, IdentityResult } from \"@pelican-identity/auth-core\";\nimport {\n getRelayUrl,\n getEncryptedData,\n validateCallbackUrl,\n} from \"../utilities\";\nimport { PelicanRNAuthProps } from \"../types/types\";\n\nconst cryptoService = new CryptoService();\n\nexport const usePelicanAuth = (props: PelicanRNAuthProps) => {\n const {\n authType,\n projectId,\n publicKey,\n appId,\n callBackUrl,\n onSuccess,\n onError,\n onLoading,\n } = props;\n\n const [loading, setLoading] = useState(false);\n const sessionKey = useRef<string | null>(null);\n const sessionID = useRef<string | null>(null);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const clearAuthTimeout = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n const handleCallback = useCallback(async () => {\n if (!sessionID.current || !sessionKey.current) return;\n\n try {\n const { cipher, nonce } = await getEncryptedData({\n businessKey: publicKey,\n authType,\n projectID: projectId,\n sessionID: sessionID.current,\n appId,\n });\n\n const decryptedData = cryptoService.decryptSymmetric({\n encrypted: { cipher, nonce },\n keyString: sessionKey.current,\n });\n\n if (decryptedData) {\n clearAuthTimeout();\n const result: IdentityResult = JSON.parse(decryptedData);\n onSuccess(result);\n sessionKey.current = null;\n sessionID.current = null;\n setLoading(false);\n onLoading?.(false);\n }\n } catch (error) {\n console.error(\"Pelican Callback Error:\", error);\n onError?.(error as Error);\n }\n }, [\n authType,\n projectId,\n publicKey,\n appId,\n onSuccess,\n onError,\n onLoading,\n clearAuthTimeout,\n ]);\n\n const initialize = async () => {\n const validation = validateCallbackUrl(callBackUrl || \"\");\n if (!validation.isValid) console.warn(`[Pelican] ${validation.reason}`);\n\n try {\n clearAuthTimeout();\n setLoading(true);\n onLoading?.(true);\n\n const { relay_url, session_id } = await getRelayUrl({\n businessKey: publicKey,\n authType,\n projectID: projectId,\n appId,\n });\n\n sessionKey.current = cryptoService.generateSymmetricKey();\n sessionID.current = session_id;\n\n // Start 5-minute timeout\n timeoutRef.current = setTimeout(() => {\n if (sessionID.current) {\n setLoading(false);\n onLoading?.(false);\n sessionID.current = null;\n onError?.(new Error(\"Authentication timed out\"));\n }\n }, 5 * 60 * 1000);\n\n const buildUrl = `${relay_url}?sessionKey=${encodeURIComponent(\n sessionKey.current\n )}&sessionID=${encodeURIComponent(\n sessionID.current\n )}&authType=${encodeURIComponent(\n authType\n )}&projectId=${encodeURIComponent(\n projectId\n )}&publicKey=${encodeURIComponent(\n publicKey\n )}&callBackUrl=${encodeURIComponent(callBackUrl || \"\")}`;\n\n Linking.openURL(buildUrl);\n } catch (error) {\n setLoading(false);\n onLoading?.(false);\n onError?.(error as Error);\n }\n };\n\n useEffect(() => {\n const handleUrl = (event: { url: string }) => {\n if (callBackUrl && event.url.startsWith(callBackUrl)) handleCallback();\n };\n\n const linkSub = Linking.addEventListener(\"url\", handleUrl);\n const appStateSub = AppState.addEventListener(\"change\", (state) => {\n if (state === \"active\") handleCallback();\n });\n\n return () => {\n linkSub.remove();\n appStateSub.remove();\n clearAuthTimeout();\n };\n }, [handleCallback, callBackUrl, clearAuthTimeout]);\n\n return { initialize, loading };\n};\n","import {\n ActivityIndicator,\n Image,\n Text,\n TouchableOpacity,\n View,\n} from \"react-native\";\nimport \"react-native-get-random-values\";\n\nimport { usePelicanAuth } from \"../hooks/usePelicanAuth\";\nimport { PelicanRNAuthProps } from \"../types/types\";\nconst PelicanAuth = (props: PelicanRNAuthProps) => {\n const { initialize, loading } = usePelicanAuth(props);\n return (\n <View>\n <TouchableOpacity onPress={initialize} disabled={loading}>\n {props.buttonComponent || (\n <View\n style={[\n {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 10,\n paddingHorizontal: 10,\n paddingVertical: 10,\n borderRadius: 20,\n borderWidth: 1,\n },\n props.style,\n ]}\n >\n <Image\n source={{\n uri: \"https://res.cloudinary.com/de0jr8mcm/image/upload/v1765904735/pelican/pelican_icon_r9ghqw.png\",\n }}\n style={{ width: 30, height: 30 }}\n />\n <Text style={{ fontSize: 16, fontWeight: \"600\" }}>\n {props.authType === \"login\"\n ? \"Login with Pelican\"\n : props.authType === \"signup\"\n ? \"Signup with Pelican\"\n : props.authType === \"id-verification\"\n ? \"Verify with Pelican\"\n : \"Authenticate with Pelican\"}\n </Text>\n {loading && <ActivityIndicator color={\"#000\"} />}\n </View>\n )}\n </TouchableOpacity>\n </View>\n );\n};\n\nexport default PelicanAuth;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pelican-identity/react-native",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.7",
|
|
4
4
|
"description": "React Native components for Pelican Identity authentication",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"react-native": "./src/index.ts",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"react-native-get-random-values": "^1.7.0"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@pelican-identity/auth-core": "1.2.
|
|
25
|
+
"@pelican-identity/auth-core": "1.2.6"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/react": "^18.2.45",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PelicanAuth.d.ts","sourceRoot":"","sources":["../../src/components/PelicanAuth.tsx"],"names":[],"mappings":"AAUA,OAAO,gCAAgC,CAAC;AAGxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAI9C,QAAA,MAAM,WAAW,GAAI,yGAUlB,kBAAkB,4CA0IpB,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import React, { useState } from "react";
|
|
3
|
-
import { ActivityIndicator, AppState, Image, Linking, Text, TouchableOpacity, View, } from "react-native";
|
|
4
|
-
import "react-native-get-random-values";
|
|
5
|
-
import { getEncryptedData, getRelayUrl } from "../utilities";
|
|
6
|
-
import { CryptoService } from "@pelican-identity/auth-core";
|
|
7
|
-
const cryptoService = new CryptoService();
|
|
8
|
-
const PelicanAuth = ({ authType, projectId, publicKey, onSuccess, callBackUrl, onError, buttonComponent, onLoading, appId, }) => {
|
|
9
|
-
const sessionKey = React.useRef(null);
|
|
10
|
-
const sessionID = React.useRef(null);
|
|
11
|
-
const [loading, setLoading] = useState(false);
|
|
12
|
-
const initialize = async () => {
|
|
13
|
-
try {
|
|
14
|
-
setLoading(true);
|
|
15
|
-
onLoading?.(true);
|
|
16
|
-
const { relay_url, session_id } = await getRelayUrl({
|
|
17
|
-
businessKey: publicKey,
|
|
18
|
-
authType,
|
|
19
|
-
projectID: projectId,
|
|
20
|
-
appId,
|
|
21
|
-
});
|
|
22
|
-
if (!relay_url) {
|
|
23
|
-
setLoading(false);
|
|
24
|
-
onLoading?.(false);
|
|
25
|
-
onError?.(new Error("Failed to get relay URL"));
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
sessionKey.current = cryptoService.generateSymmetricKey();
|
|
29
|
-
sessionID.current = session_id;
|
|
30
|
-
const buildUrl = `${relay_url}?sessionKey=${encodeURIComponent(sessionKey.current || "")}&sessionID=${encodeURIComponent(sessionID.current || "")}&authType=${encodeURIComponent(authType)}&projectId=${encodeURIComponent(projectId)}&publicKey=${encodeURIComponent(publicKey)}&callBackUrl=${encodeURIComponent(callBackUrl || "")}`;
|
|
31
|
-
Linking.openURL(buildUrl);
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
setLoading(false);
|
|
35
|
-
onLoading?.(false);
|
|
36
|
-
onError?.(error);
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
const handleCallback = async () => {
|
|
40
|
-
try {
|
|
41
|
-
if (!sessionID.current) {
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
if (!sessionKey.current) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
const { cipher, nonce } = await getEncryptedData({
|
|
48
|
-
businessKey: publicKey,
|
|
49
|
-
authType,
|
|
50
|
-
projectID: projectId,
|
|
51
|
-
sessionID: sessionID.current,
|
|
52
|
-
appId,
|
|
53
|
-
});
|
|
54
|
-
const decryptedData = cryptoService.decryptSymmetric({
|
|
55
|
-
encrypted: { cipher, nonce },
|
|
56
|
-
keyString: sessionKey.current,
|
|
57
|
-
});
|
|
58
|
-
if (decryptedData) {
|
|
59
|
-
const result = JSON.parse(decryptedData);
|
|
60
|
-
onSuccess(result);
|
|
61
|
-
sessionKey.current = null;
|
|
62
|
-
sessionID.current = null;
|
|
63
|
-
setLoading(false);
|
|
64
|
-
onLoading?.(false);
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
onError?.(new Error("Failed to get identity result"));
|
|
68
|
-
sessionKey.current = null;
|
|
69
|
-
sessionID.current = null;
|
|
70
|
-
setLoading(false);
|
|
71
|
-
onLoading?.(false);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
console.log(error);
|
|
76
|
-
onError?.(error);
|
|
77
|
-
sessionKey.current = null;
|
|
78
|
-
sessionID.current = null;
|
|
79
|
-
setLoading(false);
|
|
80
|
-
onLoading?.(false);
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
React.useEffect(() => {
|
|
84
|
-
const subscription = AppState.addEventListener("change", (nextAppState) => {
|
|
85
|
-
if (nextAppState === "active") {
|
|
86
|
-
handleCallback();
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
return () => {
|
|
90
|
-
subscription.remove();
|
|
91
|
-
};
|
|
92
|
-
}, []);
|
|
93
|
-
return (_jsx(View, { children: _jsx(TouchableOpacity, { onPress: initialize, disabled: loading, children: buttonComponent || (_jsxs(View, { style: {
|
|
94
|
-
flexDirection: "row",
|
|
95
|
-
alignItems: "center",
|
|
96
|
-
gap: 10,
|
|
97
|
-
paddingHorizontal: 10,
|
|
98
|
-
paddingVertical: 10,
|
|
99
|
-
borderRadius: 20,
|
|
100
|
-
borderWidth: 1,
|
|
101
|
-
}, children: [_jsx(Image, { source: {
|
|
102
|
-
uri: "https://res.cloudinary.com/de0jr8mcm/image/upload/v1765904735/pelican/pelican_icon_r9ghqw.png",
|
|
103
|
-
}, style: { width: 30, height: 30 } }), _jsx(Text, { style: { fontSize: 16, fontWeight: "600" }, children: authType === "login"
|
|
104
|
-
? "Login with Pelican"
|
|
105
|
-
: authType === "signup"
|
|
106
|
-
? "Signup with Pelican"
|
|
107
|
-
: authType === "id-verification"
|
|
108
|
-
? "Verify identity with Pelican"
|
|
109
|
-
: "Authenticate with Pelican" }), loading && _jsx(ActivityIndicator, { color: "#000" })] })) }) }));
|
|
110
|
-
};
|
|
111
|
-
export default PelicanAuth;
|
|
112
|
-
//# sourceMappingURL=PelicanAuth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PelicanAuth.js","sourceRoot":"","sources":["../../src/components/PelicanAuth.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGlE,mBAAmB,6BAA6B,CAAC"}
|
package/dist/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhF,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAK3D,KAAK,EAAE,MAAM,CAAC;IAOd,SAAS,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAO5C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAOjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAOvC,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAKlC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
package/dist/utilities.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../src/utilities.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AAExC,OAAO,EAAW,KAAK,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAErE,eAAO,MAAM,WAAW,GAAU,8CAK/B;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;eA4BgD,MAAM;gBAAc,MAAM;EAC1E,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,yDAMpC;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;YAmB6C,MAAM;WAAS,MAAM;EAClE,CAAC"}
|
package/dist/utilities.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import "react-native-get-random-values";
|
|
2
|
-
import { BASEURL } from "@pelican-identity/auth-core";
|
|
3
|
-
export const getRelayUrl = async ({ businessKey, authType, projectID, appId, }) => {
|
|
4
|
-
if (!businessKey) {
|
|
5
|
-
throw new Error("Business Key is required");
|
|
6
|
-
}
|
|
7
|
-
if (!authType) {
|
|
8
|
-
throw new Error("Auth Type is required");
|
|
9
|
-
}
|
|
10
|
-
if (!projectID) {
|
|
11
|
-
throw new Error("Project ID is required");
|
|
12
|
-
}
|
|
13
|
-
if (!appId) {
|
|
14
|
-
throw new Error("App ID is required");
|
|
15
|
-
}
|
|
16
|
-
const headers = {
|
|
17
|
-
"Content-Type": "application/json",
|
|
18
|
-
"X-App-ID": appId,
|
|
19
|
-
};
|
|
20
|
-
const response = await fetch(`${BASEURL}/relay?public_key=${businessKey}&auth_type=${authType}&project_id=${projectID}`, { headers });
|
|
21
|
-
if (!response.ok) {
|
|
22
|
-
const error = await response.text();
|
|
23
|
-
throw new Error(`Failed to initiate authentication: ${error}`);
|
|
24
|
-
}
|
|
25
|
-
return response.json();
|
|
26
|
-
};
|
|
27
|
-
export const getEncryptedData = async ({ businessKey, authType, projectID, sessionID, appId, }) => {
|
|
28
|
-
if (!appId) {
|
|
29
|
-
throw new Error("App ID is required");
|
|
30
|
-
}
|
|
31
|
-
const headers = {
|
|
32
|
-
"Content-Type": "application/json",
|
|
33
|
-
"X-App-ID": appId,
|
|
34
|
-
};
|
|
35
|
-
const response = await fetch(`${BASEURL}/get-rn-sdk-encrypted-data?public_key=${businessKey}&auth_type=${authType}&project_id=${projectID}&session_id=${sessionID}`, { headers });
|
|
36
|
-
if (!response.ok) {
|
|
37
|
-
const error = await response.text();
|
|
38
|
-
throw new Error(`Failed to get encrypted data: ${error}`);
|
|
39
|
-
}
|
|
40
|
-
return response.json();
|
|
41
|
-
};
|
|
42
|
-
//# sourceMappingURL=utilities.js.map
|
package/dist/utilities.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utilities.js","sourceRoot":"","sources":["../src/utilities.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AAExC,OAAO,EAAE,OAAO,EAAiB,MAAM,6BAA6B,CAAC;AAErE,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,EAChC,WAAW,EACX,QAAQ,EACR,SAAS,EACT,KAAK,GAMN,EAAE,EAAE;IACH,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,OAAO,GAAG;QACd,cAAc,EAAE,kBAAkB;QAClC,UAAU,EAAE,KAAK;KAClB,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,OAAO,qBAAqB,WAAW,cAAc,QAAQ,eAAe,SAAS,EAAE,EAC1F,EAAE,OAAO,EAAE,CACZ,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAwD,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,EACrC,WAAW,EACX,QAAQ,EACR,SAAS,EACT,SAAS,EACT,KAAK,GAON,EAAE,EAAE;IACH,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,OAAO,GAAG;QACd,cAAc,EAAE,kBAAkB;QAClC,UAAU,EAAE,KAAK;KAClB,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,OAAO,yCAAyC,WAAW,cAAc,QAAQ,eAAe,SAAS,eAAe,SAAS,EAAE,EACtI,EAAE,OAAO,EAAE,CACZ,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAgD,CAAC;AACvE,CAAC,CAAC"}
|