| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- (function attachSignupFlowHelpers(root, factory) {
- root.MultiPageSignupFlowHelpers = factory();
- })(typeof self !== 'undefined' ? self : globalThis, function createSignupFlowHelpersModule() {
- function createSignupFlowHelpers(deps = {}) {
- const {
- buildGeneratedAliasEmail,
- chrome,
- ensureContentScriptReadyOnTab,
- ensureHotmailAccountForFlow,
- ensureLuckmailPurchaseForFlow,
- isGeneratedAliasProvider,
- isReusableGeneratedAliasEmail,
- isHotmailProvider,
- isLuckmailProvider,
- isSignupEmailVerificationPageUrl,
- isSignupPasswordPageUrl,
- reuseOrCreateTab,
- sendToContentScriptResilient,
- setEmailState,
- SIGNUP_ENTRY_URL,
- SIGNUP_PAGE_INJECT_FILES,
- waitForTabUrlMatch,
- } = deps;
- async function openSignupEntryTab(step = 1, options = {}) {
- const { reloadIfSameUrl = false } = options;
- const tabId = await reuseOrCreateTab('signup-page', SIGNUP_ENTRY_URL, {
- inject: SIGNUP_PAGE_INJECT_FILES,
- injectSource: 'signup-page',
- reloadIfSameUrl,
- });
- await ensureContentScriptReadyOnTab('signup-page', tabId, {
- inject: SIGNUP_PAGE_INJECT_FILES,
- injectSource: 'signup-page',
- timeoutMs: 45000,
- retryDelayMs: 900,
- logMessage: `步骤 ${step}:ChatGPT 官网仍在加载,正在重试连接内容脚本...`,
- });
- return tabId;
- }
- async function ensureSignupEntryPageReady(step = 1, options = {}) {
- const tabId = await openSignupEntryTab(step, options);
- const result = await sendToContentScriptResilient('signup-page', {
- type: 'ENSURE_SIGNUP_ENTRY_READY',
- step,
- source: 'background',
- payload: {},
- }, {
- timeoutMs: 20000,
- retryDelayMs: 700,
- logMessage: `步骤 ${step}:官网注册入口正在切换,等待页面恢复...`,
- });
- if (result?.error) {
- throw new Error(result.error);
- }
- return { tabId, result: result || {} };
- }
- function resolveSignupPostEmailState(rawUrl) {
- if (isSignupPasswordPageUrl(rawUrl)) {
- return 'password_page';
- }
- if (isSignupEmailVerificationPageUrl(rawUrl)) {
- return 'verification_page';
- }
- return '';
- }
- async function ensureSignupPostEmailPageReadyInTab(tabId, step = 2, options = {}) {
- const { skipUrlWait = false } = options;
- let landingUrl = '';
- let landingState = '';
- if (!skipUrlWait) {
- const matchedTab = await waitForTabUrlMatch(tabId, (url) => Boolean(resolveSignupPostEmailState(url)), {
- timeoutMs: 45000,
- retryDelayMs: 300,
- });
- if (!matchedTab) {
- throw new Error('等待邮箱提交后的页面跳转超时,请检查页面是否仍停留在邮箱输入页。');
- }
- landingUrl = matchedTab.url || '';
- landingState = resolveSignupPostEmailState(landingUrl);
- }
- if (!landingState) {
- try {
- const currentTab = await chrome.tabs.get(tabId);
- landingUrl = landingUrl || currentTab?.url || '';
- landingState = resolveSignupPostEmailState(landingUrl);
- } catch {
- landingUrl = landingUrl || '';
- }
- }
- if (!landingState) {
- throw new Error(`邮箱提交后未能识别当前页面,既不是密码页也不是邮箱验证码页。URL: ${landingUrl || 'unknown'}`);
- }
- await ensureContentScriptReadyOnTab('signup-page', tabId, {
- inject: SIGNUP_PAGE_INJECT_FILES,
- injectSource: 'signup-page',
- timeoutMs: 45000,
- retryDelayMs: 900,
- logMessage: landingState === 'verification_page'
- ? `步骤 ${step}:邮箱验证码页仍在加载,正在等待页面恢复...`
- : `步骤 ${step}:密码页仍在加载,正在重试连接内容脚本...`,
- });
- if (landingState === 'verification_page') {
- return {
- ready: true,
- state: landingState,
- url: landingUrl,
- };
- }
- const result = await sendToContentScriptResilient('signup-page', {
- type: 'ENSURE_SIGNUP_PASSWORD_PAGE_READY',
- step,
- source: 'background',
- payload: {},
- }, {
- timeoutMs: 20000,
- retryDelayMs: 700,
- logMessage: `步骤 ${step}:认证页正在切换,等待密码页重新就绪...`,
- });
- if (result?.error) {
- throw new Error(result.error);
- }
- return {
- ...(result || {}),
- ready: true,
- state: landingState,
- url: landingUrl,
- };
- }
- async function ensureSignupPasswordPageReadyInTab(tabId, step = 2, options = {}) {
- const result = await ensureSignupPostEmailPageReadyInTab(tabId, step, options);
- if (result.state !== 'password_page') {
- throw new Error(`当前页面不是密码页,实际落地为 ${result.state || 'unknown'}。URL: ${result.url || 'unknown'}`);
- }
- return result;
- }
- async function finalizeSignupPasswordSubmitInTab(tabId, password = '', step = 3) {
- if (!Number.isInteger(tabId)) {
- throw new Error(`认证页面标签页已关闭,无法完成步骤 ${step} 的提交后确认。`);
- }
- await ensureContentScriptReadyOnTab('signup-page', tabId, {
- inject: SIGNUP_PAGE_INJECT_FILES,
- injectSource: 'signup-page',
- timeoutMs: 45000,
- retryDelayMs: 900,
- logMessage: `步骤 ${step}:认证页仍在切换,正在等待页面恢复后继续确认提交流程...`,
- });
- const result = await sendToContentScriptResilient('signup-page', {
- type: 'PREPARE_SIGNUP_VERIFICATION',
- step,
- source: 'background',
- payload: {
- password: password || '',
- prepareSource: 'step3_finalize',
- prepareLogLabel: '步骤 3 收尾',
- },
- }, {
- timeoutMs: 65000,
- retryDelayMs: 700,
- logMessage: `步骤 ${step}:密码已提交,正在确认是否进入下一页面,必要时自动恢复重试页...`,
- });
- if (result?.error) {
- throw new Error(result.error);
- }
- return result || {};
- }
- async function resolveSignupEmailForFlow(state) {
- let resolvedEmail = state.email;
- if (isHotmailProvider(state)) {
- const account = await ensureHotmailAccountForFlow({
- allowAllocate: true,
- markUsed: true,
- preferredAccountId: state.currentHotmailAccountId || null,
- });
- resolvedEmail = account.email;
- } else if (isLuckmailProvider(state)) {
- const purchase = await ensureLuckmailPurchaseForFlow({ allowReuse: true });
- resolvedEmail = purchase.email_address;
- } else if (isGeneratedAliasProvider(state)) {
- if (!isReusableGeneratedAliasEmail?.(state, resolvedEmail)) {
- resolvedEmail = buildGeneratedAliasEmail(state);
- }
- }
- if (!resolvedEmail) {
- throw new Error('缺少邮箱地址,请先在侧边栏粘贴邮箱。');
- }
- if (resolvedEmail !== state.email) {
- await setEmailState(resolvedEmail);
- }
- return resolvedEmail;
- }
- return {
- ensureSignupEntryPageReady,
- ensureSignupPostEmailPageReadyInTab,
- finalizeSignupPasswordSubmitInTab,
- ensureSignupPasswordPageReadyInTab,
- openSignupEntryTab,
- resolveSignupEmailForFlow,
- };
- }
- return {
- createSignupFlowHelpers,
- };
- });
|