const assert = require('assert'); const { setOpenBrowserConcurrency, _private: { Semaphore, openBrowserSemaphore, collectBrowserPages, parseAccountProxy }, } = require('../src/core/bit_api'); (async () => { const semaphore = new Semaphore(2); await semaphore.acquire(); await semaphore.acquire(); let released = 0; const waiters = Array.from({ length: 3 }, () => semaphore.acquire().then(() => { released++; })); await new Promise(resolve => setImmediate(resolve)); assert.strictEqual(semaphore.getStats().queued, 3, '超过并发上限的请求应进入队列'); semaphore.setMax(5); await Promise.all(waiters); assert.strictEqual(released, 3, '提高并发上限后应立即释放新增名额'); assert.strictEqual(semaphore.getStats().max, 5); const configured = setOpenBrowserConcurrency(50); assert.strictEqual(configured, 50, '打开请求并发应跟随任务设置'); assert.strictEqual(openBrowserSemaphore.getStats().max, 50); const pageCalls = []; const pagedApi = { async listBrowsers({ page, pageSize }) { pageCalls.push({ page, pageSize }); const all = Array.from({ length: 186 }, (_, index) => ({ id: `browser-${index + 1}`, seq: index + 1 })); const start = page * 100; return { success: true, data: { page, pageSize, totalNum: all.length, list: all.slice(start, start + pageSize) }, }; }, }; const allBrowsers = await collectBrowserPages(pagedApi, { pageSize: 1000 }); assert.strictEqual(allBrowsers.length, 186, '比特窗口超过100个时必须自动读取后续页面'); assert.deepStrictEqual(pageCalls.map(call => call.page), [0, 1]); const largePageCalls = []; const largePagedApi = { async listBrowsers({ page, pageSize }) { largePageCalls.push({ page, pageSize }); const totalNum = 1250; const start = page * 100; const list = Array.from( { length: Math.max(0, Math.min(pageSize, totalNum - start)) }, (_, index) => ({ id: `large-browser-${start + index + 1}`, seq: start + index + 1 }), ); return { success: true, data: { page, pageSize, totalNum, list } }; }, }; const largeBrowsers = await collectBrowserPages(largePagedApi, { maxItems: 10000 }); assert.strictEqual(largeBrowsers.length, 1250, '完整同步不能在1000个窗口处截断'); assert.strictEqual(largePageCalls.length, 13, '1250个窗口应按100个一页读取完成'); assert.deepStrictEqual(parseAccountProxy(''), { proxyMethod: 2, proxyType: 'noproxy' }); assert.deepStrictEqual(parseAccountProxy('127.0.0.1:1080:user:p:ass'), { proxyMethod: 2, proxyType: 'socks5', host: '127.0.0.1', port: '1080', proxyUserName: 'user', proxyPassword: 'p:ass', }); console.log('bit_api_open_concurrency.test.js: PASS'); })().catch(error => { console.error(error); process.exitCode = 1; });