|
@@ -77,11 +77,13 @@ const params = reactive<PushRecordIdRequest>({
|
|
|
const lowCertLevelDialog = ref(false)
|
|
const lowCertLevelDialog = ref(false)
|
|
|
const FACE_AUTH_POLL_INTERVAL = 1000
|
|
const FACE_AUTH_POLL_INTERVAL = 1000
|
|
|
const FACE_AUTH_POLL_TIMEOUT = 8000
|
|
const FACE_AUTH_POLL_TIMEOUT = 8000
|
|
|
|
|
+const FACE_AUTH_POLL_VERSION = 'face-auth-poll:20261015-v2'
|
|
|
let pollTimer: ReturnType<typeof setTimeout> | undefined
|
|
let pollTimer: ReturnType<typeof setTimeout> | undefined
|
|
|
let timeoutTimer: ReturnType<typeof setTimeout> | undefined
|
|
let timeoutTimer: ReturnType<typeof setTimeout> | undefined
|
|
|
let redirectTimer: ReturnType<typeof setTimeout> | undefined
|
|
let redirectTimer: ReturnType<typeof setTimeout> | undefined
|
|
|
let pollingStopped = false
|
|
let pollingStopped = false
|
|
|
-let pollingDeadline = 0
|
|
|
|
|
|
|
+let pollingDeadline: number | undefined
|
|
|
|
|
+let requestCount = 0
|
|
|
let lastResponse: Awaited<ReturnType<typeof getFaceAuthResultApi>> | undefined
|
|
let lastResponse: Awaited<ReturnType<typeof getFaceAuthResultApi>> | undefined
|
|
|
|
|
|
|
|
const stopPolling = () => {
|
|
const stopPolling = () => {
|
|
@@ -94,6 +96,10 @@ const stopPolling = () => {
|
|
|
const handleFaceAuthResult = async () => {
|
|
const handleFaceAuthResult = async () => {
|
|
|
if (pollingStopped) return
|
|
if (pollingStopped) return
|
|
|
stopPolling()
|
|
stopPolling()
|
|
|
|
|
+ console.info(FACE_AUTH_POLL_VERSION, 'finished', {
|
|
|
|
|
+ requestCount,
|
|
|
|
|
+ reason: lastResponse?.data?.rzzt === 'NO_REQUIRED_AUTHENTICATION' ? 'matched' : 'deadline',
|
|
|
|
|
+ })
|
|
|
|
|
|
|
|
const res = lastResponse
|
|
const res = lastResponse
|
|
|
if (!res) {
|
|
if (!res) {
|
|
@@ -119,26 +125,35 @@ const handleFaceAuthResult = async () => {
|
|
|
}, 1800)
|
|
}, 1800)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// 串行轮询,接口耗时也计入 8 秒上限。
|
|
|
|
|
|
|
+// 首次查询未命中目标状态后,再开始最多 8 秒的串行轮询。
|
|
|
const getFaceAuthResult = async () => {
|
|
const getFaceAuthResult = async () => {
|
|
|
if (pollingStopped) return
|
|
if (pollingStopped) return
|
|
|
|
|
|
|
|
- const remainingTime = pollingDeadline - Date.now()
|
|
|
|
|
- if (remainingTime <= 0) {
|
|
|
|
|
|
|
+ const remainingTime = pollingDeadline === undefined ? undefined : pollingDeadline - Date.now()
|
|
|
|
|
+ if (remainingTime !== undefined && remainingTime <= 0) {
|
|
|
await handleFaceAuthResult()
|
|
await handleFaceAuthResult()
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
- const res = await getFaceAuthResultApi(params, { timeout: remainingTime })
|
|
|
|
|
|
|
+ requestCount += 1
|
|
|
|
|
+ const res = await getFaceAuthResultApi(
|
|
|
|
|
+ params,
|
|
|
|
|
+ remainingTime === undefined ? {} : { timeout: remainingTime },
|
|
|
|
|
+ )
|
|
|
// 超时或离开页面后,不再处理迟到的结果。
|
|
// 超时或离开页面后,不再处理迟到的结果。
|
|
|
if (pollingStopped) return
|
|
if (pollingStopped) return
|
|
|
- if (Date.now() >= pollingDeadline) {
|
|
|
|
|
|
|
+ if (pollingDeadline !== undefined && Date.now() >= pollingDeadline) {
|
|
|
await handleFaceAuthResult()
|
|
await handleFaceAuthResult()
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
lastResponse = res
|
|
lastResponse = res
|
|
|
|
|
+ console.info(FACE_AUTH_POLL_VERSION, 'response', {
|
|
|
|
|
+ requestCount,
|
|
|
|
|
+ code: res.code,
|
|
|
|
|
+ rzzt: res.data?.rzzt,
|
|
|
|
|
+ })
|
|
|
// 只在出现目标状态时提前结束轮询,其他结果等到 8 秒后统一处理。
|
|
// 只在出现目标状态时提前结束轮询,其他结果等到 8 秒后统一处理。
|
|
|
if (res.data?.rzzt === 'NO_REQUIRED_AUTHENTICATION') {
|
|
if (res.data?.rzzt === 'NO_REQUIRED_AUTHENTICATION') {
|
|
|
await handleFaceAuthResult()
|
|
await handleFaceAuthResult()
|
|
@@ -151,6 +166,11 @@ const getFaceAuthResult = async () => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (!pollingStopped) {
|
|
if (!pollingStopped) {
|
|
|
|
|
+ if (pollingDeadline === undefined) {
|
|
|
|
|
+ pollingDeadline = Date.now() + FACE_AUTH_POLL_TIMEOUT
|
|
|
|
|
+ timeoutTimer = setTimeout(handleFaceAuthResult, FACE_AUTH_POLL_TIMEOUT)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
pollTimer = setTimeout(
|
|
pollTimer = setTimeout(
|
|
|
getFaceAuthResult,
|
|
getFaceAuthResult,
|
|
|
Math.min(FACE_AUTH_POLL_INTERVAL, Math.max(0, pollingDeadline - Date.now())),
|
|
Math.min(FACE_AUTH_POLL_INTERVAL, Math.max(0, pollingDeadline - Date.now())),
|
|
@@ -168,8 +188,7 @@ const handleSecurityLevelGuideClick = () => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
- pollingDeadline = Date.now() + FACE_AUTH_POLL_TIMEOUT
|
|
|
|
|
- timeoutTimer = setTimeout(handleFaceAuthResult, FACE_AUTH_POLL_TIMEOUT)
|
|
|
|
|
|
|
+ console.info(FACE_AUTH_POLL_VERSION, 'start')
|
|
|
getFaceAuthResult()
|
|
getFaceAuthResult()
|
|
|
})
|
|
})
|
|
|
|
|
|