@flonkid/kyc 1.8.0 → 1.8.2
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/dist/index.cjs +61 -98
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +61 -98
- package/dist/index.js.map +1 -1
- package/dist/server.cjs +1 -1
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { useRef, useMemo, useEffect } from 'react';
|
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
3
|
|
|
4
4
|
// src/shared/constants.ts
|
|
5
|
-
var SDK_VERSION = "1.8.
|
|
5
|
+
var SDK_VERSION = "1.8.2";
|
|
6
6
|
var DEFAULT_WIDGET_URL = "https://widget.flonk.id";
|
|
7
7
|
var DEFAULT_API_BASE = "https://api.flonk.id/v1";
|
|
8
8
|
var WIDGET_EVENTS = {
|
|
@@ -88,21 +88,31 @@ async function fetchWithTimeout(url, init = {}, timeoutMs = DEFAULT_FETCH_TIMEOU
|
|
|
88
88
|
clearTimeout(timer);
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
+
var widgetTokenInflight = /* @__PURE__ */ new Map();
|
|
91
92
|
async function fetchWidgetToken(pk, apiBase) {
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
93
|
+
const key = `${apiBase}|${pk}`;
|
|
94
|
+
const existing = widgetTokenInflight.get(key);
|
|
95
|
+
if (existing) return existing;
|
|
96
|
+
const promise = (async () => {
|
|
97
|
+
const res = await fetchWithTimeout(`${apiBase}/public/widget-token`, {
|
|
98
|
+
headers: { "x-kyc-pk": pk },
|
|
99
|
+
credentials: "include"
|
|
100
|
+
});
|
|
101
|
+
if (!res.ok) {
|
|
102
|
+
let message = `Widget token request failed (${res.status})`;
|
|
103
|
+
try {
|
|
104
|
+
const b = await res.json();
|
|
105
|
+
message = b.error || b.message || message;
|
|
106
|
+
} catch {
|
|
107
|
+
}
|
|
108
|
+
throw new Error(message);
|
|
102
109
|
}
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
|
|
110
|
+
return res.json();
|
|
111
|
+
})().finally(() => {
|
|
112
|
+
widgetTokenInflight.delete(key);
|
|
113
|
+
});
|
|
114
|
+
widgetTokenInflight.set(key, promise);
|
|
115
|
+
return promise;
|
|
106
116
|
}
|
|
107
117
|
var BRANDING_CACHE_TTL_MS = 5 * 60 * 1e3;
|
|
108
118
|
var brandingCache = /* @__PURE__ */ new Map();
|
|
@@ -157,43 +167,35 @@ function validateServerUrl(url) {
|
|
|
157
167
|
throw new Error(`Invalid serverUrl: ${url}`);
|
|
158
168
|
}
|
|
159
169
|
}
|
|
170
|
+
var sessionCreateInflight = /* @__PURE__ */ new Map();
|
|
160
171
|
async function fetchSessionFromServer(serverUrl, clientMetadata, requestHeaders) {
|
|
161
172
|
validateServerUrl(serverUrl);
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
const res = await fetchWithTimeout(`${apiBase}/public/session/${sessionId}`, {
|
|
182
|
-
headers: {
|
|
183
|
-
"Content-Type": "application/json",
|
|
184
|
-
"Authorization": `Bearer ${embedToken}`
|
|
173
|
+
const key = `${serverUrl}|${JSON.stringify(clientMetadata ?? null)}`;
|
|
174
|
+
const existing = sessionCreateInflight.get(key);
|
|
175
|
+
if (existing) return existing;
|
|
176
|
+
const promise = (async () => {
|
|
177
|
+
const res = await fetchWithTimeout(serverUrl, {
|
|
178
|
+
method: "POST",
|
|
179
|
+
headers: { "Content-Type": "application/json", ...requestHeaders },
|
|
180
|
+
credentials: "include",
|
|
181
|
+
body: JSON.stringify({ clientMetadata })
|
|
182
|
+
});
|
|
183
|
+
if (!res.ok) {
|
|
184
|
+
let message = `Session request failed (${res.status})`;
|
|
185
|
+
try {
|
|
186
|
+
const body = await res.json();
|
|
187
|
+
if (body.error) message = body.error;
|
|
188
|
+
else if (body.message) message = body.message;
|
|
189
|
+
} catch {
|
|
190
|
+
}
|
|
191
|
+
throw new Error(message);
|
|
185
192
|
}
|
|
193
|
+
return res.json();
|
|
194
|
+
})().finally(() => {
|
|
195
|
+
sessionCreateInflight.delete(key);
|
|
186
196
|
});
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
try {
|
|
190
|
-
const b = await res.json();
|
|
191
|
-
message = b.error || b.message || message;
|
|
192
|
-
} catch {
|
|
193
|
-
}
|
|
194
|
-
throw new Error(message);
|
|
195
|
-
}
|
|
196
|
-
return res.json();
|
|
197
|
+
sessionCreateInflight.set(key, promise);
|
|
198
|
+
return promise;
|
|
197
199
|
}
|
|
198
200
|
async function exchangeSessionForToken(apiBase, sessionId) {
|
|
199
201
|
const res = await fetchWithTimeout(`${apiBase}/public/session/${sessionId}/token`, {
|
|
@@ -874,20 +876,7 @@ var FlonkKYC = class {
|
|
|
874
876
|
const finalTokens = designTokens ?? await fetchDesignTokens(this.apiBase, { sessionId });
|
|
875
877
|
const finalColor = primaryFrom(finalTokens);
|
|
876
878
|
if (finalColor !== primaryColor) loader.updateColor(finalColor);
|
|
877
|
-
|
|
878
|
-
const session = {
|
|
879
|
-
id: sessionData.id,
|
|
880
|
-
allowManualUpload: sessionData.allowManualUpload ?? config.allowManualUpload ?? true,
|
|
881
|
-
clientMetadata: sessionData.clientMetadata || config.clientMetadata,
|
|
882
|
-
qrCodeUrl: sessionData.qrCodeUrl,
|
|
883
|
-
testMode: sessionData.testMode || false,
|
|
884
|
-
poaEnabled: sessionData.poaEnabled || false,
|
|
885
|
-
poaRequired: sessionData.poaRequired || false,
|
|
886
|
-
mlAutoCaptureEnabled: sessionData.mlAutoCaptureEnabled || false,
|
|
887
|
-
mlCropEnabled: sessionData.mlCropEnabled ?? true,
|
|
888
|
-
mlVerifyEnabled: sessionData.mlVerifyEnabled || false
|
|
889
|
-
};
|
|
890
|
-
return this.buildWidget(embedToken, session, config, loader, finalTokens);
|
|
879
|
+
return this.buildWidget(embedToken, sessionId, config, loader, finalTokens);
|
|
891
880
|
} catch (err) {
|
|
892
881
|
const msg = err.message || "Failed to create session";
|
|
893
882
|
loader.showError(msg, config.lang);
|
|
@@ -901,32 +890,12 @@ var FlonkKYC = class {
|
|
|
901
890
|
async initWithEmbedToken(config) {
|
|
902
891
|
const pk = config.publishableKey;
|
|
903
892
|
const designTokensPromise = pk ? fetchDesignTokens(this.apiBase, { pk }) : fetchDesignTokens(this.apiBase, { sessionId: config.sessionId });
|
|
904
|
-
const sessionPromise = fetchPublicSession(
|
|
905
|
-
this.apiBase,
|
|
906
|
-
config.sessionId,
|
|
907
|
-
config.embedToken
|
|
908
|
-
);
|
|
909
893
|
const { loader, primaryColor } = await showLoaderWithEarlyColor(designTokensPromise, config.lang);
|
|
910
894
|
try {
|
|
911
|
-
const
|
|
912
|
-
sessionPromise,
|
|
913
|
-
designTokensPromise
|
|
914
|
-
]);
|
|
895
|
+
const designTokens = await designTokensPromise;
|
|
915
896
|
const finalColor = primaryFrom(designTokens);
|
|
916
897
|
if (finalColor !== primaryColor) loader.updateColor(finalColor);
|
|
917
|
-
|
|
918
|
-
id: sessionData.id,
|
|
919
|
-
allowManualUpload: sessionData.allowManualUpload ?? config.allowManualUpload ?? true,
|
|
920
|
-
clientMetadata: sessionData.clientMetadata || config.clientMetadata,
|
|
921
|
-
qrCodeUrl: sessionData.qrCodeUrl,
|
|
922
|
-
testMode: sessionData.testMode || false,
|
|
923
|
-
poaEnabled: sessionData.poaEnabled || false,
|
|
924
|
-
poaRequired: sessionData.poaRequired || false,
|
|
925
|
-
mlAutoCaptureEnabled: sessionData.mlAutoCaptureEnabled || false,
|
|
926
|
-
mlCropEnabled: sessionData.mlCropEnabled ?? true,
|
|
927
|
-
mlVerifyEnabled: sessionData.mlVerifyEnabled || false
|
|
928
|
-
};
|
|
929
|
-
return this.buildWidget(config.embedToken, session, config, loader, designTokens);
|
|
898
|
+
return this.buildWidget(config.embedToken, config.sessionId, config, loader, designTokens);
|
|
930
899
|
} catch (err) {
|
|
931
900
|
const msg = err.message || "Failed to initialize verification";
|
|
932
901
|
loader.showError(msg, config.lang);
|
|
@@ -952,7 +921,7 @@ var FlonkKYC = class {
|
|
|
952
921
|
exchangePromise,
|
|
953
922
|
designTokensPromise
|
|
954
923
|
]);
|
|
955
|
-
return this.buildWidget(embedToken, session, config, loader, designTokens);
|
|
924
|
+
return this.buildWidget(embedToken, config.sessionId || session.id, config, loader, designTokens);
|
|
956
925
|
} catch (err) {
|
|
957
926
|
const msg = err.message || "Failed to initialize verification";
|
|
958
927
|
loader.showError(msg, config.lang);
|
|
@@ -999,27 +968,21 @@ var FlonkKYC = class {
|
|
|
999
968
|
}
|
|
1000
969
|
}
|
|
1001
970
|
// ── Core widget builder ──────────────────────────────
|
|
1002
|
-
buildWidget(token,
|
|
971
|
+
buildWidget(token, sessionId, config, loader, designTokens) {
|
|
1003
972
|
const params = {
|
|
1004
973
|
mode: "embedded",
|
|
1005
|
-
sessionId
|
|
1006
|
-
token
|
|
1007
|
-
allowManualUpload: String(session.allowManualUpload !== false)
|
|
974
|
+
sessionId,
|
|
975
|
+
token
|
|
1008
976
|
};
|
|
1009
|
-
if (
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
if (session.mlAutoCaptureEnabled) params.mlAutoCaptureEnabled = "true";
|
|
1013
|
-
if (session.mlCropEnabled !== false) params.mlCropEnabled = "true";
|
|
1014
|
-
if (session.mlVerifyEnabled) params.mlVerifyEnabled = "true";
|
|
977
|
+
if (config.allowManualUpload !== void 0) {
|
|
978
|
+
params.allowManualUpload = String(config.allowManualUpload !== false);
|
|
979
|
+
}
|
|
1015
980
|
if (designTokens?.colors) {
|
|
1016
981
|
params.designTokens = JSON.stringify(designTokens);
|
|
1017
982
|
}
|
|
1018
983
|
if (config.embedToken) params.embedToken = config.embedToken;
|
|
1019
|
-
if (
|
|
1020
|
-
|
|
1021
|
-
if (clientMetadata) {
|
|
1022
|
-
params.clientMetadata = JSON.stringify(clientMetadata);
|
|
984
|
+
if (config.clientMetadata) {
|
|
985
|
+
params.clientMetadata = JSON.stringify(config.clientMetadata);
|
|
1023
986
|
}
|
|
1024
987
|
if (config.lang) params.lang = config.lang;
|
|
1025
988
|
if (config.overlayColor) params.overlayColor = config.overlayColor;
|