fix: 'common' version

This commit is contained in:
2026-07-10 18:24:23 +08:00
parent 3d7bd6362f
commit 284545655f
3 changed files with 36 additions and 38 deletions
+6 -5
View File
@@ -234,7 +234,7 @@ async function handlePrimaryButtonClick() {
let [file, buffer] = await filereader().catch(e => alert('(ERROR) ' + new String(e ?? 'Unable to read data'))); let [file, buffer] = await filereader().catch(e => alert('(ERROR) ' + new String(e ?? 'Unable to read data')));
writable = await handle.createWritable().catch(() => null); writable = await handle.createWritable().catch(() => null);
major = await Rpc2.invoke('ready', file.name, new Uint8Array(buffer).toBase64()); major = await Rpc2.invoke('loads', { params: [file.name, new Uint8Array(buffer).toBase64()] });
$.get('#fileLabel').innerText = file.name; $.get('#fileLabel').innerText = file.name;
$.get('#fromLabel').innerText = parameters.account; $.get('#fromLabel').innerText = parameters.account;
$.all('.columns').forEach(e => e.dispatchEvent(new Event('change'))); $.all('.columns').forEach(e => e.dispatchEvent(new Event('change')));
@@ -268,7 +268,7 @@ async function handlePrimaryButtonClick() {
options.start += $('#offset').valueAsNumber * $('#chunksize').valueAsNumber; options.start += $('#offset').valueAsNumber * $('#chunksize').valueAsNumber;
} }
await Rpc2.invoke('begin', options, parameters); await Rpc2.invoke('begin', { params: [options, parameters] });
break; break;
case 'RUNNING': case 'RUNNING':
await Rpc2.invoke('pause'); await Rpc2.invoke('pause');
@@ -323,7 +323,7 @@ $.set('#nospam', 'change', (e) => {
}); });
$.set('#region', 'change', async (e) => { $.set('#region', 'change', async (e) => {
unique = await Rpc2.invoke('unique', e.target.value).catch(() => new Object()); unique = await Rpc2.invoke('unique', { params: [e.target.value] }).catch(() => new Object());
$('#groupby').dispatchEvent(new Event('change')); $('#groupby').dispatchEvent(new Event('change'));
}); });
@@ -402,7 +402,7 @@ for (let element of $.all('.params')) {
} }
while (await new Promise(o => setTimeout(o, 1000, true))) { while (await new Promise(o => setTimeout(o, 1000, true))) {
let history = await Rpc2.invoke('history').catch(() => []); let history = await Rpc2.invoke('logs').catch(() => []);
let logs = Array.from(history); let logs = Array.from(history);
for (let record of logs) { for (let record of logs) {
@@ -433,7 +433,7 @@ while (await new Promise(o => setTimeout(o, 1000, true))) {
case 'CLOSING': case 'CLOSING':
if (writable) try { if (writable) try {
$.all('#actions > button').forEach(e => e.disabled = true); $.all('#actions > button').forEach(e => e.disabled = true);
let data = await filereader().then(([_, b]) => Rpc2.invoke('merge', new Uint8Array(b).toBase64())); let data = await filereader().then(([_, b]) => Rpc2.invoke('merge', { params: [new Uint8Array(b).toBase64()] }));
await writable.write(Uint8Array.fromBase64(data)); await writable.write(Uint8Array.fromBase64(data));
await writable.close(); await writable.close();
await Rpc2.notify('close'); await Rpc2.notify('close');
@@ -464,6 +464,7 @@ while (await new Promise(o => setTimeout(o, 1000, true))) {
let rate = done / uptime; let rate = done / uptime;
let remaining = rate > 0 ? Math.floor((total - count) / rate) : 0; let remaining = rate > 0 ? Math.floor((total - count) / rate) : 0;
$('#remainingLabel').innerText = remaining > 0 ? `${Temporal.Duration.from({ seconds: remaining }).round({ largestUnit: 'hours' }).toLocaleString('en')} (${(rate * 60).toFixed(2)}/min)` : ''; $('#remainingLabel').innerText = remaining > 0 ? `${Temporal.Duration.from({ seconds: remaining }).round({ largestUnit: 'hours' }).toLocaleString('en')} (${(rate * 60).toFixed(2)}/min)` : '';
await Rpc2.notify('acknowledge');
break; break;
case 'STANDBY': case 'STANDBY':
$('#send > span.text').innerText = 'Resume'; $('#send > span.text').innerText = 'Resume';
+30 -33
View File
@@ -99,10 +99,7 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
return result return result
sp.set('begin', begin) sp.add(begin, pause, resume, unique)
sp.set('pause', pause)
sp.set('resume', resume)
sp.set('unique', unique)
sp.set('status', lambda: status.name) sp.set('status', lambda: status.name)
sp.set('uptime', lambda: timer.delta()) sp.set('uptime', lambda: timer.delta())
@@ -237,26 +234,29 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
cls.timer.clear() cls.timer.clear()
cls.timer.start() cls.timer.start()
return True return True
@classmethod @classmethod
def perform(cls): def perform(cls):
if cls.timer.delta() > parameters['timeout']: raise cls if cls.timer.delta() > parameters['timeout']: raise cls
sleep(0.2); return True sleep(0.2); return True
class Acknowledge(Action):
@classmethod
def prepare(cls):
return status == Status.RUNNING
class Cancel(Action): class Cancel(Action):
@classmethod @classmethod
def prepare(cls): def prepare(cls):
nonlocal status nonlocal status
status = Status.RUNNING status = Status.RUNNING
return True return True
@classmethod @classmethod
def perform(cls): def perform(cls):
nonlocal status
status = Status.READY
driver.switch_to.window(driver.window_handles[0]) driver.switch_to.window(driver.window_handles[0])
raise cls raise cls
class Close(Action): class Close(Action):
@classmethod @classmethod
def prepare(cls): def prepare(cls):
@@ -266,23 +266,16 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
@classmethod @classmethod
def prepare(cls): def prepare(cls):
return True return True
@classmethod @classmethod
def perform(cls): def perform(cls):
driver.switch_to.window(driver.current_window_handle) driver.switch_to.window(driver.current_window_handle)
raise cls raise cls
flow = ActionFlow() flow = ActionFlow()
flow.append(Wait) flow.stage(Wait, Acknowledge, Timeout, Cancel, Close, Skip)
flow.append(Timeout) sp.add(pairs=[ (k.lower(), v) for k, v in flow ])
flow.append(Cancel)
flow.append(Close)
flow.append(Skip)
sp.set('actions', lambda: flow.capabilities()) sp.set('actions', lambda: flow.capabilities())
sp.set('cancel', lambda: flow.queue(Cancel))
sp.set('close', lambda: flow.queue(Close))
sp.set('skip', lambda: flow.queue(Skip))
def loads(name: str, b64: str): def loads(name: str, b64: str):
from base64 import b64decode from base64 import b64decode
@@ -307,7 +300,7 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
flow.allow(Cancel) flow.allow(Cancel)
status = Status.READY status = Status.READY
return limit return limit
def merge(b64: str): def merge(b64: str):
from base64 import b64decode, b64encode from base64 import b64decode, b64encode
from openpyxl import load_workbook from openpyxl import load_workbook
@@ -317,7 +310,7 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
index = headers.index(column.sent) index = headers.index(column.sent)
buffer = BytesIO(data) buffer = BytesIO(data)
target = load_workbook(buffer) target = load_workbook(buffer)
for row in range(options.get('start'), limit + 1): for row in range(options.get('start'), limit + 1):
c1 = wb.active.cell(row, index + 1) c1 = wb.active.cell(row, index + 1)
c2 = target.active.cell(row, index + 1) c2 = target.active.cell(row, index + 1)
@@ -330,8 +323,7 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
result = b64encode(io.getbuffer()).decode('ascii') result = b64encode(io.getbuffer()).decode('ascii')
return result return result
sp.set('ready', loads) sp.add(loads, merge)
sp.set('merge', merge)
sp.set('progress', lambda: progress) sp.set('progress', lambda: progress)
def save(): def save():
@@ -382,10 +374,10 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
driver.switch_to.window(driver.window_handles[0]) driver.switch_to.window(driver.window_handles[0])
continue continue
except Exception as e: except Exception as e:
logger.error('Error while loading data', exc_info=e)
status = Status.IDLE status = Status.IDLE
logger.error('Error while loading data', exc_info=e)
continue continue
index = 2 index = 2
attempts = 0 attempts = 0
tz = ZoneInfo(locale.timezone) tz = ZoneInfo(locale.timezone)
@@ -439,8 +431,7 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
logger.debug('Unable to close off email compose windows', exc_info=e) logger.debug('Unable to close off email compose windows', exc_info=e)
break break
flow.allow(Cancel) flow.allow(Skip, Cancel)
flow.allow(Skip)
flow.react(Wait) flow.react(Wait)
progress['email'] = str(email) progress['email'] = str(email)
logger.info('[%d/%d] Sending to %s', index-1, limit-1, email) logger.info('[%d/%d] Sending to %s', index-1, limit-1, email)
@@ -522,7 +513,6 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
flow.react(Wait) flow.react(Wait)
click("div.io-ox-mail-compose-window button[data-action='send']") click("div.io-ox-mail-compose-window button[data-action='send']")
except Cancel: except Cancel:
status = Status.IDLE
break break
except (Next, Skip) as e: except (Next, Skip) as e:
progress[e.__class__.__name__.lower()] += 1 progress[e.__class__.__name__.lower()] += 1
@@ -554,11 +544,21 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
status = Status.STANDBY status = Status.STANDBY
continue continue
try:
logger.info('Waiting for client to acknowledge...')
flow.deter(Cancel, Skip, Wait)
flow.allow(Acknowledge)
flow.react(Timeout)
except Acknowledge:
pass
except Exception as e:
logger.error('RPC communication failed', exc_info=e)
sp.pop('exit')()
if options.get('writable'): if options.get('writable'):
try: try:
logger.info('Saving document...') logger.info('Saving document...')
status = Status.CLOSING status = Status.CLOSING
flow.allow(Wait, False)
flow.allow(Close) flow.allow(Close)
flow.react(Timeout) flow.react(Timeout)
except Close: except Close:
@@ -567,10 +567,7 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
logger.warning('RPC communication failed', exc_info=e) logger.warning('RPC communication failed', exc_info=e)
save() save()
flow.allow(Timeout, False) flow.deter(Acknowledge, Timeout, Close)
flow.allow(Close, False)
flow.allow(Cancel, False)
flow.allow(Skip, False)
driver.switch_to.window(driver.window_handles[0]) driver.switch_to.window(driver.window_handles[0])
status = Status.IDLE status = Status.IDLE
logger.info('Done') logger.info('Done')
BIN
View File
Binary file not shown.