@pelican-identity/react-native 1.2.27 → 1.2.29

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PelicanAuth.d.ts","sourceRoot":"","sources":["../../src/components/PelicanAuth.tsx"],"names":[],"mappings":"AAOA,OAAO,gCAAgC,CAAC;AAGxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,QAAA,MAAM,WAAW,GAAI,OAAO,kBAAkB,4CA8C7C,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePelicanAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/usePelicanAuth.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIpD,eAAO,MAAM,cAAc,GAAI,OAAO,kBAAkB;;;CAiNvD,CAAC"}
@@ -0,0 +1,167 @@
1
+ import { useState, useRef, useEffect, useCallback } from "react";
2
+ import { Alert, AppState, Linking, Platform } from "react-native";
3
+ import { CryptoService } from "@pelican-identity/auth-core";
4
+ import { getRelayUrl, getEncryptedData, validateCallbackUrl, } from "../utilities";
5
+ const cryptoService = new CryptoService();
6
+ export const usePelicanAuth = (props) => {
7
+ const { authType, projectId, publicKey, appId, callBackUrl, onSuccess, onError, onLoading, onAppNotInstalled, } = props;
8
+ const [loading, setLoading] = useState(false);
9
+ const sessionKey = useRef(null);
10
+ const sessionID = useRef(null);
11
+ const timeoutRef = useRef(null);
12
+ const isProcessing = useRef(false);
13
+ const clearAuthTimeout = useCallback(() => {
14
+ if (timeoutRef.current) {
15
+ clearTimeout(timeoutRef.current);
16
+ timeoutRef.current = null;
17
+ }
18
+ }, []);
19
+ const handleCallback = useCallback(async (url) => {
20
+ if (isProcessing.current)
21
+ return;
22
+ let activeSessionID = sessionID.current;
23
+ if (url) {
24
+ const params = url.split("?")[1];
25
+ if (params) {
26
+ const pair = params
27
+ .split("&")
28
+ .find((p) => p.startsWith("sessionID="));
29
+ if (pair) {
30
+ activeSessionID = decodeURIComponent(pair.split("=")[1] || "");
31
+ }
32
+ }
33
+ }
34
+ if (!activeSessionID || !sessionKey.current) {
35
+ console.warn("[Pelican] Missing Session ID or Key for decryption");
36
+ return;
37
+ }
38
+ try {
39
+ isProcessing.current = true;
40
+ const { cipher, nonce } = await getEncryptedData({
41
+ publicKey,
42
+ authType,
43
+ projectID: projectId,
44
+ sessionID: activeSessionID,
45
+ appId,
46
+ });
47
+ const decryptedData = cryptoService.decryptSymmetric({
48
+ encrypted: { cipher, nonce },
49
+ keyString: sessionKey.current,
50
+ });
51
+ if (decryptedData) {
52
+ clearAuthTimeout();
53
+ const result = JSON.parse(decryptedData);
54
+ onSuccess(result);
55
+ sessionKey.current = null;
56
+ sessionID.current = null;
57
+ setLoading(false);
58
+ onLoading?.(false);
59
+ }
60
+ }
61
+ catch (error) {
62
+ console.error("[Pelican] Callback Error:", error);
63
+ onError?.(error);
64
+ }
65
+ finally {
66
+ isProcessing.current = false;
67
+ }
68
+ }, [
69
+ authType,
70
+ projectId,
71
+ publicKey,
72
+ appId,
73
+ onSuccess,
74
+ onError,
75
+ onLoading,
76
+ clearAuthTimeout,
77
+ ]);
78
+ const initialize = async () => {
79
+ const validation = validateCallbackUrl(callBackUrl || "");
80
+ if (!validation.isValid) {
81
+ console.warn(`[Pelican] ${validation.reason}`);
82
+ onError?.(new Error(validation.reason));
83
+ return;
84
+ }
85
+ try {
86
+ clearAuthTimeout();
87
+ setLoading(true);
88
+ onLoading?.(true);
89
+ const { relay_url, session_id } = await getRelayUrl({
90
+ publicKey,
91
+ authType,
92
+ projectID: projectId,
93
+ appId,
94
+ });
95
+ sessionKey.current = cryptoService.generateSymmetricKey();
96
+ sessionID.current = session_id;
97
+ timeoutRef.current = setTimeout(() => {
98
+ if (sessionID.current) {
99
+ setLoading(false);
100
+ onLoading?.(false);
101
+ sessionID.current = null;
102
+ onError?.(new Error("Authentication timed out"));
103
+ }
104
+ }, 5 * 60 * 1000);
105
+ const buildUrl = `${relay_url}?sessionKey=${encodeURIComponent(sessionKey.current)}&sessionID=${encodeURIComponent(sessionID.current)}&authType=${encodeURIComponent(authType)}&projectId=${encodeURIComponent(projectId)}&publicKey=${encodeURIComponent(publicKey)}&callBackUrl=${encodeURIComponent(callBackUrl || "")}`;
106
+ try {
107
+ await Linking.openURL(buildUrl);
108
+ }
109
+ catch (error) {
110
+ setLoading(false);
111
+ onLoading?.(false);
112
+ if (onAppNotInstalled) {
113
+ onAppNotInstalled();
114
+ }
115
+ else {
116
+ showInstallPrompt();
117
+ }
118
+ }
119
+ }
120
+ catch (error) {
121
+ setLoading(false);
122
+ onLoading?.(false);
123
+ onError?.(error);
124
+ }
125
+ };
126
+ const showInstallPrompt = () => {
127
+ Alert.alert("Install Pelican Vault", "You need the Pelican Vault app to continue. Would you like to download it?", [
128
+ {
129
+ text: "Cancel",
130
+ style: "cancel",
131
+ },
132
+ {
133
+ text: "Download",
134
+ onPress: () => {
135
+ const storeUrl = Platform.select({
136
+ ios: "https://apps.apple.com/us/app/pelican-vault/id6755097751",
137
+ android: "https://play.google.com/store/apps/details?id=com.HeraculesDesignTechLtd.pelican",
138
+ });
139
+ if (storeUrl) {
140
+ Linking.openURL(storeUrl);
141
+ }
142
+ },
143
+ },
144
+ ]);
145
+ };
146
+ useEffect(() => {
147
+ const handleUrl = (event) => {
148
+ if (callBackUrl && event.url.startsWith(callBackUrl))
149
+ handleCallback(event.url);
150
+ };
151
+ const linkSub = Linking.addEventListener("url", handleUrl);
152
+ const appStateSub = AppState.addEventListener("change", (state) => {
153
+ if (state === "active") {
154
+ setTimeout(() => {
155
+ handleCallback();
156
+ }, 700);
157
+ }
158
+ });
159
+ return () => {
160
+ linkSub.remove();
161
+ appStateSub.remove();
162
+ clearAuthTimeout();
163
+ };
164
+ }, [handleCallback, callBackUrl, clearAuthTimeout]);
165
+ return { initialize, loading };
166
+ };
167
+ //# sourceMappingURL=usePelicanAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePelicanAuth.js","sourceRoot":"","sources":["../../src/hooks/usePelicanAuth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxD,mBAAmB,6BAA6B,CAAC"}
package/dist/index.js CHANGED
@@ -8,13 +8,13 @@ var jsxRuntime = require('react/jsx-runtime');
8
8
 
9
9
  // src/components/PelicanAuth.tsx
10
10
  var getRelayUrl = async ({
11
- businessKey,
11
+ publicKey,
12
12
  authType,
13
13
  projectID,
14
14
  appId
15
15
  }) => {
16
- if (!businessKey) {
17
- throw new Error("Business Key is required");
16
+ if (!publicKey) {
17
+ throw new Error("Public Key is required");
18
18
  }
19
19
  if (!authType) {
20
20
  throw new Error("Auth Type is required");
@@ -30,7 +30,7 @@ var getRelayUrl = async ({
30
30
  "X-App-ID": appId
31
31
  };
32
32
  const response = await fetch(
33
- `${authCore.BASEURL}/relay?public_key=${businessKey}&auth_type=${authType}&project_id=${projectID}`,
33
+ `${authCore.BASEURL}/relay?public_key=${publicKey}&auth_type=${authType}&project_id=${projectID}`,
34
34
  { headers }
35
35
  );
36
36
  if (!response.ok) {
@@ -40,7 +40,7 @@ var getRelayUrl = async ({
40
40
  return response.json();
41
41
  };
42
42
  var getEncryptedData = async ({
43
- businessKey,
43
+ publicKey,
44
44
  authType,
45
45
  projectID,
46
46
  sessionID,
@@ -54,7 +54,7 @@ var getEncryptedData = async ({
54
54
  "X-App-ID": appId
55
55
  };
56
56
  const response = await fetch(
57
- `${authCore.BASEURL}/get-rn-sdk-encrypted-data?public_key=${businessKey}&auth_type=${authType}&project_id=${projectID}&session_id=${sessionID}`,
57
+ `${authCore.BASEURL}/get-rn-sdk-encrypted-data?public_key=${publicKey}&auth_type=${authType}&project_id=${projectID}&session_id=${sessionID}`,
58
58
  { headers }
59
59
  );
60
60
  if (!response.ok) {
@@ -139,7 +139,7 @@ var usePelicanAuth = (props) => {
139
139
  try {
140
140
  isProcessing.current = true;
141
141
  const { cipher, nonce } = await getEncryptedData({
142
- businessKey: publicKey,
142
+ publicKey,
143
143
  authType,
144
144
  projectID: projectId,
145
145
  sessionID: activeSessionID,
@@ -188,7 +188,7 @@ var usePelicanAuth = (props) => {
188
188
  setLoading(true);
189
189
  onLoading?.(true);
190
190
  const { relay_url, session_id } = await getRelayUrl({
191
- businessKey: publicKey,
191
+ publicKey,
192
192
  authType,
193
193
  projectID: projectId,
194
194
  appId
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utilities.ts","../src/hooks/usePelicanAuth.ts","../src/components/PelicanAuth.tsx"],"names":["BASEURL","Platform","CryptoService","useState","useRef","useCallback","Linking","Alert","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 // 1. Explicitly block Web/Universal Links\n if (url.startsWith(\"https://\") || url.startsWith(\"http://\")) {\n return {\n isValid: false,\n reason:\n \"Universal Links (https) are not permitted. Please use your app's Custom Scheme (e.g., 'myapp://callback') to ensure a reliable redirect.\",\n };\n }\n\n const isExpo = url.startsWith(\"exp://\");\n const isCustomScheme = /^[a-z0-9+.-]+:\\/\\//i.test(url);\n\n // 2. Ensure it follows a scheme format\n if (!isCustomScheme && !isExpo) {\n return {\n isValid: false,\n reason: \"URL must include a valid Custom Scheme (e.g., 'myapp://').\",\n };\n }\n\n // 3. The \"No Query\" Guard\n if (url.includes(\"?\") || url.includes(\"&\")) {\n return {\n isValid: false,\n reason:\n \"## DO NOT ADD URL PARAMETERS TO YOUR CALLBACK URL. The SDK handles session state automatically.\",\n };\n }\n\n // 4. Apple naming convention guard\n if (Platform.OS === \"ios\" && url.includes(\"_\")) {\n return {\n isValid: false,\n reason:\n \"iOS Custom Schemes cannot contain underscores. Use hyphens (e.g., 'my-app://').\",\n };\n }\n\n return { isValid: true };\n};\n","import { useState, useRef, useEffect, useCallback } from \"react\";\nimport { Alert, AppState, Linking, Platform } 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 onAppNotInstalled,\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 const isProcessing = useRef(false);\n\n const clearAuthTimeout = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n const handleCallback = useCallback(\n async (url?: string) => {\n if (isProcessing.current) return;\n\n let activeSessionID = sessionID.current;\n\n if (url) {\n const params = url.split(\"?\")[1];\n if (params) {\n const pair = params\n .split(\"&\")\n .find((p) => p.startsWith(\"sessionID=\"));\n if (pair) {\n activeSessionID = decodeURIComponent(pair.split(\"=\")[1] || \"\");\n }\n }\n }\n\n if (!activeSessionID || !sessionKey.current) {\n console.warn(\"[Pelican] Missing Session ID or Key for decryption\");\n return;\n }\n\n try {\n isProcessing.current = true;\n const { cipher, nonce } = await getEncryptedData({\n businessKey: publicKey,\n authType,\n projectID: projectId,\n sessionID: activeSessionID,\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 } finally {\n isProcessing.current = false;\n }\n },\n [\n authType,\n projectId,\n publicKey,\n appId,\n onSuccess,\n onError,\n onLoading,\n clearAuthTimeout,\n ],\n );\n\n const initialize = async () => {\n const validation = validateCallbackUrl(callBackUrl || \"\");\n if (!validation.isValid) {\n console.warn(`[Pelican] ${validation.reason}`);\n onError?.(new Error(validation.reason));\n return;\n }\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 () => {\n if (sessionID.current) {\n setLoading(false);\n onLoading?.(false);\n sessionID.current = null;\n onError?.(new Error(\"Authentication timed out\"));\n }\n },\n 5 * 60 * 1000,\n );\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 try {\n await Linking.openURL(buildUrl);\n } catch (error) {\n setLoading(false);\n onLoading?.(false);\n\n if (onAppNotInstalled) {\n onAppNotInstalled();\n } else {\n // Default behavior\n showInstallPrompt();\n }\n }\n } catch (error) {\n setLoading(false);\n onLoading?.(false);\n onError?.(error as Error);\n }\n };\n\n const showInstallPrompt = () => {\n Alert.alert(\n \"Install Pelican Vault\",\n \"You need the Pelican Vault app to continue. Would you like to download it?\",\n [\n {\n text: \"Cancel\",\n style: \"cancel\",\n },\n {\n text: \"Download\",\n onPress: () => {\n const storeUrl = Platform.select({\n ios: \"https://apps.apple.com/us/app/pelican-vault/id6755097751\",\n android:\n \"https://play.google.com/store/apps/details?id=com.HeraculesDesignTechLtd.pelican\",\n });\n if (storeUrl) {\n Linking.openURL(storeUrl);\n }\n },\n },\n ],\n );\n };\n\n useEffect(() => {\n const handleUrl = (event: { url: string }) => {\n if (callBackUrl && event.url.startsWith(callBackUrl))\n handleCallback(event.url);\n };\n\n const linkSub = Linking.addEventListener(\"url\", handleUrl);\n const appStateSub = AppState.addEventListener(\"change\", (state) => {\n if (state === \"active\") {\n setTimeout(() => {\n handleCallback();\n }, 700);\n }\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\n style={[\n { fontSize: 16, fontWeight: \"600\" },\n props.buttonTextStyle,\n ]}\n >\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"]}
1
+ {"version":3,"sources":["../src/utilities.ts","../src/hooks/usePelicanAuth.ts","../src/components/PelicanAuth.tsx"],"names":["BASEURL","Platform","CryptoService","useState","useRef","useCallback","Linking","Alert","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 publicKey,\n authType,\n projectID,\n appId,\n}: {\n publicKey: string;\n authType: AuthType;\n projectID: string;\n appId: string;\n}) => {\n if (!publicKey) {\n throw new Error(\"Public 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=${publicKey}&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 publicKey,\n authType,\n projectID,\n sessionID,\n appId,\n}: {\n publicKey: 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=${publicKey}&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 // 1. Explicitly block Web/Universal Links\n if (url.startsWith(\"https://\") || url.startsWith(\"http://\")) {\n return {\n isValid: false,\n reason:\n \"Universal Links (https) are not permitted. Please use your app's Custom Scheme (e.g., 'myapp://callback') to ensure a reliable redirect.\",\n };\n }\n\n const isExpo = url.startsWith(\"exp://\");\n const isCustomScheme = /^[a-z0-9+.-]+:\\/\\//i.test(url);\n\n // 2. Ensure it follows a scheme format\n if (!isCustomScheme && !isExpo) {\n return {\n isValid: false,\n reason: \"URL must include a valid Custom Scheme (e.g., 'myapp://').\",\n };\n }\n\n // 3. The \"No Query\" Guard\n if (url.includes(\"?\") || url.includes(\"&\")) {\n return {\n isValid: false,\n reason:\n \"## DO NOT ADD URL PARAMETERS TO YOUR CALLBACK URL. The SDK handles session state automatically.\",\n };\n }\n\n // 4. Apple naming convention guard\n if (Platform.OS === \"ios\" && url.includes(\"_\")) {\n return {\n isValid: false,\n reason:\n \"iOS Custom Schemes cannot contain underscores. Use hyphens (e.g., 'my-app://').\",\n };\n }\n\n return { isValid: true };\n};\n","import { useState, useRef, useEffect, useCallback } from \"react\";\nimport { Alert, AppState, Linking, Platform } 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 onAppNotInstalled,\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 const isProcessing = useRef(false);\n\n const clearAuthTimeout = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n const handleCallback = useCallback(\n async (url?: string) => {\n if (isProcessing.current) return;\n\n let activeSessionID = sessionID.current;\n\n if (url) {\n const params = url.split(\"?\")[1];\n if (params) {\n const pair = params\n .split(\"&\")\n .find((p) => p.startsWith(\"sessionID=\"));\n if (pair) {\n activeSessionID = decodeURIComponent(pair.split(\"=\")[1] || \"\");\n }\n }\n }\n\n if (!activeSessionID || !sessionKey.current) {\n console.warn(\"[Pelican] Missing Session ID or Key for decryption\");\n return;\n }\n\n try {\n isProcessing.current = true;\n const { cipher, nonce } = await getEncryptedData({\n publicKey,\n authType,\n projectID: projectId,\n sessionID: activeSessionID,\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 } finally {\n isProcessing.current = false;\n }\n },\n [\n authType,\n projectId,\n publicKey,\n appId,\n onSuccess,\n onError,\n onLoading,\n clearAuthTimeout,\n ],\n );\n\n const initialize = async () => {\n const validation = validateCallbackUrl(callBackUrl || \"\");\n if (!validation.isValid) {\n console.warn(`[Pelican] ${validation.reason}`);\n onError?.(new Error(validation.reason));\n return;\n }\n\n try {\n clearAuthTimeout();\n setLoading(true);\n onLoading?.(true);\n\n const { relay_url, session_id } = await getRelayUrl({\n 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 () => {\n if (sessionID.current) {\n setLoading(false);\n onLoading?.(false);\n sessionID.current = null;\n onError?.(new Error(\"Authentication timed out\"));\n }\n },\n 5 * 60 * 1000,\n );\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 try {\n await Linking.openURL(buildUrl);\n } catch (error) {\n setLoading(false);\n onLoading?.(false);\n\n if (onAppNotInstalled) {\n onAppNotInstalled();\n } else {\n // Default behavior\n showInstallPrompt();\n }\n }\n } catch (error) {\n setLoading(false);\n onLoading?.(false);\n onError?.(error as Error);\n }\n };\n\n const showInstallPrompt = () => {\n Alert.alert(\n \"Install Pelican Vault\",\n \"You need the Pelican Vault app to continue. Would you like to download it?\",\n [\n {\n text: \"Cancel\",\n style: \"cancel\",\n },\n {\n text: \"Download\",\n onPress: () => {\n const storeUrl = Platform.select({\n ios: \"https://apps.apple.com/us/app/pelican-vault/id6755097751\",\n android:\n \"https://play.google.com/store/apps/details?id=com.HeraculesDesignTechLtd.pelican\",\n });\n if (storeUrl) {\n Linking.openURL(storeUrl);\n }\n },\n },\n ],\n );\n };\n\n useEffect(() => {\n const handleUrl = (event: { url: string }) => {\n if (callBackUrl && event.url.startsWith(callBackUrl))\n handleCallback(event.url);\n };\n\n const linkSub = Linking.addEventListener(\"url\", handleUrl);\n const appStateSub = AppState.addEventListener(\"change\", (state) => {\n if (state === \"active\") {\n setTimeout(() => {\n handleCallback();\n }, 700);\n }\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\n style={[\n { fontSize: 16, fontWeight: \"600\" },\n props.buttonTextStyle,\n ]}\n >\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
@@ -6,13 +6,13 @@ import { jsx, jsxs } from 'react/jsx-runtime';
6
6
 
7
7
  // src/components/PelicanAuth.tsx
8
8
  var getRelayUrl = async ({
9
- businessKey,
9
+ publicKey,
10
10
  authType,
11
11
  projectID,
12
12
  appId
13
13
  }) => {
14
- if (!businessKey) {
15
- throw new Error("Business Key is required");
14
+ if (!publicKey) {
15
+ throw new Error("Public Key is required");
16
16
  }
17
17
  if (!authType) {
18
18
  throw new Error("Auth Type is required");
@@ -28,7 +28,7 @@ var getRelayUrl = async ({
28
28
  "X-App-ID": appId
29
29
  };
30
30
  const response = await fetch(
31
- `${BASEURL}/relay?public_key=${businessKey}&auth_type=${authType}&project_id=${projectID}`,
31
+ `${BASEURL}/relay?public_key=${publicKey}&auth_type=${authType}&project_id=${projectID}`,
32
32
  { headers }
33
33
  );
34
34
  if (!response.ok) {
@@ -38,7 +38,7 @@ var getRelayUrl = async ({
38
38
  return response.json();
39
39
  };
40
40
  var getEncryptedData = async ({
41
- businessKey,
41
+ publicKey,
42
42
  authType,
43
43
  projectID,
44
44
  sessionID,
@@ -52,7 +52,7 @@ var getEncryptedData = async ({
52
52
  "X-App-ID": appId
53
53
  };
54
54
  const response = await fetch(
55
- `${BASEURL}/get-rn-sdk-encrypted-data?public_key=${businessKey}&auth_type=${authType}&project_id=${projectID}&session_id=${sessionID}`,
55
+ `${BASEURL}/get-rn-sdk-encrypted-data?public_key=${publicKey}&auth_type=${authType}&project_id=${projectID}&session_id=${sessionID}`,
56
56
  { headers }
57
57
  );
58
58
  if (!response.ok) {
@@ -137,7 +137,7 @@ var usePelicanAuth = (props) => {
137
137
  try {
138
138
  isProcessing.current = true;
139
139
  const { cipher, nonce } = await getEncryptedData({
140
- businessKey: publicKey,
140
+ publicKey,
141
141
  authType,
142
142
  projectID: projectId,
143
143
  sessionID: activeSessionID,
@@ -186,7 +186,7 @@ var usePelicanAuth = (props) => {
186
186
  setLoading(true);
187
187
  onLoading?.(true);
188
188
  const { relay_url, session_id } = await getRelayUrl({
189
- businessKey: publicKey,
189
+ publicKey,
190
190
  authType,
191
191
  projectID: projectId,
192
192
  appId
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utilities.ts","../src/hooks/usePelicanAuth.ts","../src/components/PelicanAuth.tsx"],"names":["Platform"],"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 // 1. Explicitly block Web/Universal Links\n if (url.startsWith(\"https://\") || url.startsWith(\"http://\")) {\n return {\n isValid: false,\n reason:\n \"Universal Links (https) are not permitted. Please use your app's Custom Scheme (e.g., 'myapp://callback') to ensure a reliable redirect.\",\n };\n }\n\n const isExpo = url.startsWith(\"exp://\");\n const isCustomScheme = /^[a-z0-9+.-]+:\\/\\//i.test(url);\n\n // 2. Ensure it follows a scheme format\n if (!isCustomScheme && !isExpo) {\n return {\n isValid: false,\n reason: \"URL must include a valid Custom Scheme (e.g., 'myapp://').\",\n };\n }\n\n // 3. The \"No Query\" Guard\n if (url.includes(\"?\") || url.includes(\"&\")) {\n return {\n isValid: false,\n reason:\n \"## DO NOT ADD URL PARAMETERS TO YOUR CALLBACK URL. The SDK handles session state automatically.\",\n };\n }\n\n // 4. Apple naming convention guard\n if (Platform.OS === \"ios\" && url.includes(\"_\")) {\n return {\n isValid: false,\n reason:\n \"iOS Custom Schemes cannot contain underscores. Use hyphens (e.g., 'my-app://').\",\n };\n }\n\n return { isValid: true };\n};\n","import { useState, useRef, useEffect, useCallback } from \"react\";\nimport { Alert, AppState, Linking, Platform } 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 onAppNotInstalled,\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 const isProcessing = useRef(false);\n\n const clearAuthTimeout = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n const handleCallback = useCallback(\n async (url?: string) => {\n if (isProcessing.current) return;\n\n let activeSessionID = sessionID.current;\n\n if (url) {\n const params = url.split(\"?\")[1];\n if (params) {\n const pair = params\n .split(\"&\")\n .find((p) => p.startsWith(\"sessionID=\"));\n if (pair) {\n activeSessionID = decodeURIComponent(pair.split(\"=\")[1] || \"\");\n }\n }\n }\n\n if (!activeSessionID || !sessionKey.current) {\n console.warn(\"[Pelican] Missing Session ID or Key for decryption\");\n return;\n }\n\n try {\n isProcessing.current = true;\n const { cipher, nonce } = await getEncryptedData({\n businessKey: publicKey,\n authType,\n projectID: projectId,\n sessionID: activeSessionID,\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 } finally {\n isProcessing.current = false;\n }\n },\n [\n authType,\n projectId,\n publicKey,\n appId,\n onSuccess,\n onError,\n onLoading,\n clearAuthTimeout,\n ],\n );\n\n const initialize = async () => {\n const validation = validateCallbackUrl(callBackUrl || \"\");\n if (!validation.isValid) {\n console.warn(`[Pelican] ${validation.reason}`);\n onError?.(new Error(validation.reason));\n return;\n }\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 () => {\n if (sessionID.current) {\n setLoading(false);\n onLoading?.(false);\n sessionID.current = null;\n onError?.(new Error(\"Authentication timed out\"));\n }\n },\n 5 * 60 * 1000,\n );\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 try {\n await Linking.openURL(buildUrl);\n } catch (error) {\n setLoading(false);\n onLoading?.(false);\n\n if (onAppNotInstalled) {\n onAppNotInstalled();\n } else {\n // Default behavior\n showInstallPrompt();\n }\n }\n } catch (error) {\n setLoading(false);\n onLoading?.(false);\n onError?.(error as Error);\n }\n };\n\n const showInstallPrompt = () => {\n Alert.alert(\n \"Install Pelican Vault\",\n \"You need the Pelican Vault app to continue. Would you like to download it?\",\n [\n {\n text: \"Cancel\",\n style: \"cancel\",\n },\n {\n text: \"Download\",\n onPress: () => {\n const storeUrl = Platform.select({\n ios: \"https://apps.apple.com/us/app/pelican-vault/id6755097751\",\n android:\n \"https://play.google.com/store/apps/details?id=com.HeraculesDesignTechLtd.pelican\",\n });\n if (storeUrl) {\n Linking.openURL(storeUrl);\n }\n },\n },\n ],\n );\n };\n\n useEffect(() => {\n const handleUrl = (event: { url: string }) => {\n if (callBackUrl && event.url.startsWith(callBackUrl))\n handleCallback(event.url);\n };\n\n const linkSub = Linking.addEventListener(\"url\", handleUrl);\n const appStateSub = AppState.addEventListener(\"change\", (state) => {\n if (state === \"active\") {\n setTimeout(() => {\n handleCallback();\n }, 700);\n }\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\n style={[\n { fontSize: 16, fontWeight: \"600\" },\n props.buttonTextStyle,\n ]}\n >\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"]}
1
+ {"version":3,"sources":["../src/utilities.ts","../src/hooks/usePelicanAuth.ts","../src/components/PelicanAuth.tsx"],"names":["Platform"],"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 publicKey,\n authType,\n projectID,\n appId,\n}: {\n publicKey: string;\n authType: AuthType;\n projectID: string;\n appId: string;\n}) => {\n if (!publicKey) {\n throw new Error(\"Public 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=${publicKey}&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 publicKey,\n authType,\n projectID,\n sessionID,\n appId,\n}: {\n publicKey: 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=${publicKey}&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 // 1. Explicitly block Web/Universal Links\n if (url.startsWith(\"https://\") || url.startsWith(\"http://\")) {\n return {\n isValid: false,\n reason:\n \"Universal Links (https) are not permitted. Please use your app's Custom Scheme (e.g., 'myapp://callback') to ensure a reliable redirect.\",\n };\n }\n\n const isExpo = url.startsWith(\"exp://\");\n const isCustomScheme = /^[a-z0-9+.-]+:\\/\\//i.test(url);\n\n // 2. Ensure it follows a scheme format\n if (!isCustomScheme && !isExpo) {\n return {\n isValid: false,\n reason: \"URL must include a valid Custom Scheme (e.g., 'myapp://').\",\n };\n }\n\n // 3. The \"No Query\" Guard\n if (url.includes(\"?\") || url.includes(\"&\")) {\n return {\n isValid: false,\n reason:\n \"## DO NOT ADD URL PARAMETERS TO YOUR CALLBACK URL. The SDK handles session state automatically.\",\n };\n }\n\n // 4. Apple naming convention guard\n if (Platform.OS === \"ios\" && url.includes(\"_\")) {\n return {\n isValid: false,\n reason:\n \"iOS Custom Schemes cannot contain underscores. Use hyphens (e.g., 'my-app://').\",\n };\n }\n\n return { isValid: true };\n};\n","import { useState, useRef, useEffect, useCallback } from \"react\";\nimport { Alert, AppState, Linking, Platform } 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 onAppNotInstalled,\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 const isProcessing = useRef(false);\n\n const clearAuthTimeout = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n const handleCallback = useCallback(\n async (url?: string) => {\n if (isProcessing.current) return;\n\n let activeSessionID = sessionID.current;\n\n if (url) {\n const params = url.split(\"?\")[1];\n if (params) {\n const pair = params\n .split(\"&\")\n .find((p) => p.startsWith(\"sessionID=\"));\n if (pair) {\n activeSessionID = decodeURIComponent(pair.split(\"=\")[1] || \"\");\n }\n }\n }\n\n if (!activeSessionID || !sessionKey.current) {\n console.warn(\"[Pelican] Missing Session ID or Key for decryption\");\n return;\n }\n\n try {\n isProcessing.current = true;\n const { cipher, nonce } = await getEncryptedData({\n publicKey,\n authType,\n projectID: projectId,\n sessionID: activeSessionID,\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 } finally {\n isProcessing.current = false;\n }\n },\n [\n authType,\n projectId,\n publicKey,\n appId,\n onSuccess,\n onError,\n onLoading,\n clearAuthTimeout,\n ],\n );\n\n const initialize = async () => {\n const validation = validateCallbackUrl(callBackUrl || \"\");\n if (!validation.isValid) {\n console.warn(`[Pelican] ${validation.reason}`);\n onError?.(new Error(validation.reason));\n return;\n }\n\n try {\n clearAuthTimeout();\n setLoading(true);\n onLoading?.(true);\n\n const { relay_url, session_id } = await getRelayUrl({\n 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 () => {\n if (sessionID.current) {\n setLoading(false);\n onLoading?.(false);\n sessionID.current = null;\n onError?.(new Error(\"Authentication timed out\"));\n }\n },\n 5 * 60 * 1000,\n );\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 try {\n await Linking.openURL(buildUrl);\n } catch (error) {\n setLoading(false);\n onLoading?.(false);\n\n if (onAppNotInstalled) {\n onAppNotInstalled();\n } else {\n // Default behavior\n showInstallPrompt();\n }\n }\n } catch (error) {\n setLoading(false);\n onLoading?.(false);\n onError?.(error as Error);\n }\n };\n\n const showInstallPrompt = () => {\n Alert.alert(\n \"Install Pelican Vault\",\n \"You need the Pelican Vault app to continue. Would you like to download it?\",\n [\n {\n text: \"Cancel\",\n style: \"cancel\",\n },\n {\n text: \"Download\",\n onPress: () => {\n const storeUrl = Platform.select({\n ios: \"https://apps.apple.com/us/app/pelican-vault/id6755097751\",\n android:\n \"https://play.google.com/store/apps/details?id=com.HeraculesDesignTechLtd.pelican\",\n });\n if (storeUrl) {\n Linking.openURL(storeUrl);\n }\n },\n },\n ],\n );\n };\n\n useEffect(() => {\n const handleUrl = (event: { url: string }) => {\n if (callBackUrl && event.url.startsWith(callBackUrl))\n handleCallback(event.url);\n };\n\n const linkSub = Linking.addEventListener(\"url\", handleUrl);\n const appStateSub = AppState.addEventListener(\"change\", (state) => {\n if (state === \"active\") {\n setTimeout(() => {\n handleCallback();\n }, 700);\n }\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\n style={[\n { fontSize: 16, fontWeight: \"600\" },\n props.buttonTextStyle,\n ]}\n >\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"]}
@@ -0,0 +1,26 @@
1
+ import "react-native-get-random-values";
2
+ import { type AuthType } from "@pelican-identity/auth-core";
3
+ export declare const getRelayUrl: ({ publicKey, authType, projectID, appId, }: {
4
+ publicKey: string;
5
+ authType: AuthType;
6
+ projectID: string;
7
+ appId: string;
8
+ }) => Promise<{
9
+ relay_url: string;
10
+ session_id: string;
11
+ }>;
12
+ export declare const getEncryptedData: ({ publicKey, authType, projectID, sessionID, appId, }: {
13
+ publicKey: string;
14
+ authType: AuthType;
15
+ projectID: string;
16
+ sessionID: string;
17
+ appId: string;
18
+ }) => Promise<{
19
+ cipher: string;
20
+ nonce: string;
21
+ }>;
22
+ export declare const validateCallbackUrl: (url: string) => {
23
+ isValid: boolean;
24
+ reason?: string;
25
+ };
26
+ //# sourceMappingURL=utilities.d.ts.map
@@ -0,0 +1 @@
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;AAGrE,eAAO,MAAM,WAAW,GAAU,4CAK/B;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,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,uDAMpC;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,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;AAMF,eAAO,MAAM,mBAAmB,GAC9B,KAAK,MAAM,KACV;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CA0CrC,CAAC"}
@@ -0,0 +1,74 @@
1
+ import "react-native-get-random-values";
2
+ import { BASEURL } from "@pelican-identity/auth-core";
3
+ import { Platform } from "react-native";
4
+ export const getRelayUrl = async ({ publicKey, authType, projectID, appId, }) => {
5
+ if (!publicKey) {
6
+ throw new Error("Public Key is required");
7
+ }
8
+ if (!authType) {
9
+ throw new Error("Auth Type is required");
10
+ }
11
+ if (!projectID) {
12
+ throw new Error("Project ID is required");
13
+ }
14
+ if (!appId) {
15
+ throw new Error("App ID is required");
16
+ }
17
+ const headers = {
18
+ "Content-Type": "application/json",
19
+ "X-App-ID": appId,
20
+ };
21
+ const response = await fetch(`${BASEURL}/relay?public_key=${publicKey}&auth_type=${authType}&project_id=${projectID}`, { headers });
22
+ if (!response.ok) {
23
+ const error = await response.text();
24
+ throw new Error(error);
25
+ }
26
+ return response.json();
27
+ };
28
+ export const getEncryptedData = async ({ publicKey, authType, projectID, sessionID, appId, }) => {
29
+ if (!appId) {
30
+ throw new Error("App ID is required");
31
+ }
32
+ const headers = {
33
+ "Content-Type": "application/json",
34
+ "X-App-ID": appId,
35
+ };
36
+ const response = await fetch(`${BASEURL}/get-rn-sdk-encrypted-data?public_key=${publicKey}&auth_type=${authType}&project_id=${projectID}&session_id=${sessionID}`, { headers });
37
+ if (!response.ok) {
38
+ const error = await response.text();
39
+ throw new Error(error);
40
+ }
41
+ return response.json();
42
+ };
43
+ export const validateCallbackUrl = (url) => {
44
+ if (!url)
45
+ return { isValid: false, reason: "Callback URL is missing." };
46
+ if (url.startsWith("https://") || url.startsWith("http://")) {
47
+ return {
48
+ isValid: false,
49
+ reason: "Universal Links (https) are not permitted. Please use your app's Custom Scheme (e.g., 'myapp://callback') to ensure a reliable redirect.",
50
+ };
51
+ }
52
+ const isExpo = url.startsWith("exp://");
53
+ const isCustomScheme = /^[a-z0-9+.-]+:\/\//i.test(url);
54
+ if (!isCustomScheme && !isExpo) {
55
+ return {
56
+ isValid: false,
57
+ reason: "URL must include a valid Custom Scheme (e.g., 'myapp://').",
58
+ };
59
+ }
60
+ if (url.includes("?") || url.includes("&")) {
61
+ return {
62
+ isValid: false,
63
+ reason: "## DO NOT ADD URL PARAMETERS TO YOUR CALLBACK URL. The SDK handles session state automatically.",
64
+ };
65
+ }
66
+ if (Platform.OS === "ios" && url.includes("_")) {
67
+ return {
68
+ isValid: false,
69
+ reason: "iOS Custom Schemes cannot contain underscores. Use hyphens (e.g., 'my-app://').",
70
+ };
71
+ }
72
+ return { isValid: true };
73
+ };
74
+ //# sourceMappingURL=utilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utilities.js","sourceRoot":"","sources":["../src/utilities.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pelican-identity/react-native",
3
- "version": "1.2.27",
3
+ "version": "1.2.29",
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.24"
25
+ "@pelican-identity/auth-core": "1.2.26"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/react": "^18.2.45",