fix: ptimeout problem

This commit is contained in:
ikechan8370 2023-02-15 13:11:03 +08:00
parent faf3612c96
commit 5237975fbd
3 changed files with 117 additions and 16 deletions

View file

@ -5,7 +5,7 @@ import { getOpenAIAuth } from './openai-auth.js'
import delay from 'delay' import delay from 'delay'
import { v4 as uuidv4 } from 'uuid' import { v4 as uuidv4 } from 'uuid'
import { pTimeout } from './common.js' import { pTimeout } from './common.js'
console.log({ pTimeout })
const chatUrl = 'https://chat.openai.com/chat' const chatUrl = 'https://chat.openai.com/chat'
let puppeteer = {} let puppeteer = {}
@ -776,7 +776,7 @@ export async function browserPostEventStream (
abortController.abort() abortController.abort()
} }
} }
console.log({ pTimeout })
return await pTimeout(responseP, { return await pTimeout(responseP, {
milliseconds: timeoutMs, milliseconds: timeoutMs,
message: 'ChatGPT timed out waiting for response' message: 'ChatGPT timed out waiting for response'
@ -817,9 +817,9 @@ export async function browserPostEventStream (
conversationResponse conversationResponse
} }
} }
// async function pTimeout (promise, option) { // async function pTimeout (promise, option) {
// return await pTimeout(promise, option) // return await pTimeout(promise, option)
// } // }
async function * streamAsyncIterable (stream) { async function * streamAsyncIterable (stream) {
const reader = stream.getReader() const reader = stream.getReader()
try { try {
@ -1002,15 +1002,89 @@ export async function browserPostEventStream (
) )
} }
/** // @see https://github.com/sindresorhus/p-timeout
TODO: Remove AbortError and just throw DOMException when targeting Node 18. function pTimeout (
*/ promise,
function getDOMException (errorMessage) { options
return globalThis.DOMException === undefined ) {
? new Error(errorMessage) const {
: new DOMException(errorMessage) milliseconds,
} fallback,
message,
customTimers = { setTimeout, clearTimeout }
} = options
let timer
const cancelablePromise = new Promise((resolve, reject) => {
if (typeof milliseconds !== 'number' || Math.sign(milliseconds) !== 1) {
throw new TypeError(
`Expected \`milliseconds\` to be a positive number, got \`${milliseconds}\``
)
}
if (milliseconds === Number.POSITIVE_INFINITY) {
resolve(promise)
return
}
if (options.signal) {
const { signal } = options
if (signal.aborted) {
reject(getAbortedReason(signal))
}
signal.addEventListener('abort', () => {
reject(getAbortedReason(signal))
})
}
timer = customTimers.setTimeout.call(
undefined,
() => {
if (fallback) {
try {
resolve(fallback())
} catch (error) {
reject(error)
}
return
}
const errorMessage =
typeof message === 'string'
? message
: `Promise timed out after ${milliseconds} milliseconds`
const timeoutError =
message instanceof Error ? message : new Error(errorMessage)
if (typeof promise.cancel === 'function') {
promise.cancel()
}
reject(timeoutError)
},
milliseconds
)
;(async () => {
try {
resolve(await promise)
} catch (error) {
reject(error)
} finally {
customTimers.clearTimeout.call(undefined, timer)
}
})()
})
cancelablePromise.clear = () => {
customTimers.clearTimeout.call(undefined, timer)
timer = undefined
}
return cancelablePromise
}
/** /**
TODO: Remove below function and just 'reject(signal.reason)' when targeting Node 18. TODO: Remove below function and just 'reject(signal.reason)' when targeting Node 18.
*/ */
@ -1022,4 +1096,12 @@ export async function browserPostEventStream (
return reason instanceof Error ? reason : getDOMException(reason) return reason instanceof Error ? reason : getDOMException(reason)
} }
/**
TODO: Remove AbortError and just throw DOMException when targeting Node 18.
*/
function getDOMException (errorMessage) {
return globalThis.DOMException === undefined
? new Error(errorMessage)
: new DOMException(errorMessage)
}
} }

View file

@ -68,7 +68,7 @@ export async function makeForwardMsg (e, msg = [], dec = '') {
} }
// @see https://github.com/sindresorhus/p-timeout // @see https://github.com/sindresorhus/p-timeout
export function pTimeout ( export async function pTimeout (
promise, promise,
options options
) { ) {
@ -150,3 +150,22 @@ export function pTimeout (
return cancelablePromise return cancelablePromise
} }
/**
TODO: Remove below function and just 'reject(signal.reason)' when targeting Node 18.
*/
function getAbortedReason (signal) {
const reason =
signal.reason === undefined
? getDOMException('This operation was aborted.')
: signal.reason
return reason instanceof Error ? reason : getDOMException(reason)
}
/**
TODO: Remove AbortError and just throw DOMException when targeting Node 18.
*/
function getDOMException (errorMessage) {
return globalThis.DOMException === undefined
? new Error(errorMessage)
: new DOMException(errorMessage)
}

View file

@ -69,9 +69,9 @@ export async function getOpenAIAuth (opt) {
}), }),
page.click('#__next .btn-primary') page.click('#__next .btn-primary')
]) ])
await delay(500) await delay(1000)
} while (page.url().endsWith('/auth/login')) } while (page.url().endsWith('/auth/login'))
logger.mark('进入登录页面')
await checkForChatGPTAtCapacity(page) await checkForChatGPTAtCapacity(page)
let submitP let submitP